diff options
author | Vishal Mahaveer <vishalm@ti.com> | 2014-02-05 09:33:26 -0600 |
---|---|---|
committer | Vishal Mahaveer <vishalm@ti.com> | 2014-02-06 11:50:10 -0600 |
commit | 0fa0e9c6c0b7225917d0766b1bb7e7f05f414f8c (patch) | |
tree | cfba2b7276fa8acd1c683024c008593878e65f2b | |
parent | bd8746b7062c01b9fe47de5094cda2f865fe833c (diff) | |
download | proprietary-open-jacinto-0fa0e9c6c0b7225917d0766b1bb7e7f05f414f8c.tar.gz |
jacinto6: sgx: update DDK version to 1.12/2701748
Initial DDK 1.12 content
Change-Id: I7159467651bf4db8cc92563f7309e4191a448e48
Signed-off-by: Hemant Hariyani <hemanthariyani@ti.com>
Signed-off-by: Vishal Mahaveer <vishalm@ti.com>
172 files changed, 22608 insertions, 8835 deletions
diff --git a/jacinto6/README.SGX b/jacinto6/README.SGX index 17f1f79..54df572 100644 --- a/jacinto6/README.SGX +++ b/jacinto6/README.SGX @@ -12,16 +12,13 @@ #========================================================================== sgx.tgz a set of binaries built for SGX544. -The SGXCORE and SGC_CORE_REV is appended to the end of each file. pvrsrvinit is -now a wrapper which detects the current processor and loads the corresponding -core specific pvrsrvinit. [DDK Version] - 1.9/2291151 + 1.12/2701748 [DDK commit ID] - e7405ce SGX-UM-Fix for graphics init race condition. + 03b9484 build: Set correct load directory for kernel modules. [Branch] - origin/1.9/2291151_k3.8 + android/1.12/2701748 [Kernel modules built against] Kernel Version: 3.8.y with CONFIG_MODVERSIONS=y @@ -32,11 +29,11 @@ SGX kernel modules source is located in sgx_src/eurasia_km/ Make sure kernel is built before building modules -# cd ANDROID_ROOT/device/ti/proprietary-open/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap4430_android/ +# cd ANDROID_ROOT/device/ti/proprietary-open/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap_android/ # export KERNELDIR=path_to_kernel To build for OMAP5 (SGX 544 multi core): -# make ARCH=arm CROSS_COMPILE=arm-eabi- TARGET_PRODUCT="omap5sevm" BUILD=release TARGET_SGX=544es2 +# make ARCH=arm CROSS_COMPILE=arm-eabi- TARGET_PRODUCT="jacinto6evm" BUILD=release Once the .ko is built, install it onto device (/system/lib/modules) diff --git a/jacinto6/sgx.tgz b/jacinto6/sgx.tgz Binary files differindex 9d1683b..abe7a53 100644 --- a/jacinto6/sgx.tgz +++ b/jacinto6/sgx.tgz diff --git a/jacinto6/sgx/Android.mk b/jacinto6/sgx/Android.mk index 128a06d..aa082fa 100644 --- a/jacinto6/sgx/Android.mk +++ b/jacinto6/sgx/Android.mk @@ -94,28 +94,28 @@ $$(LOCAL_BUILT_MODULE) : $$(img-sgx.untarred_timestamp) | $$(ACP) endef prebuilt_sgx_vendor_libs := \ - lib/libIMGegl_SGX544_116.so \ - lib/libglslcompiler_SGX544_116.so \ - lib/libusc_SGX544_116.so \ - lib/libPVRScopeServices_SGX544_116.so \ - lib/libsrv_um_SGX544_116.so \ + lib/libIMGegl.so \ + lib/libglslcompiler.so \ + lib/libusc.so \ + lib/libPVRScopeServices.so \ + lib/libsrv_um.so \ lib/hw/gralloc.jacinto6.so \ - lib/libpvrANDROID_WSEGL_SGX544_116.so \ - lib/libpvr2d_SGX544_116.so \ - lib/libsrv_init_SGX544_116.so \ + lib/libpvrANDROID_WSEGL.so \ + lib/libpvr2d.so \ + lib/libsrv_init.so \ lib/egl/libGLESv1_CM_POWERVR_SGX544_116.so \ lib/egl/libGLESv2_POWERVR_SGX544_116.so \ lib/egl/libEGL_POWERVR_SGX544_116.so prebuilt_sgx_vendor_bins := \ bin/pvrsrvinit \ - bin/pvrsrvctl_SGX544_116 + bin/pvrsrvctl -prebuilt_sgx_vendor_etc := \ - etc/powervr.ini +#prebuilt_sgx_vendor_etc := \ +# etc/powervr.ini prebuilt_sgx_vendor_km := \ - modules/pvrsrvkm_sgx544_116.ko + modules/pvrsrvkm.ko prebuilt_sgx_modules := \ $(foreach _file,$(prebuilt_sgx_vendor_libs) $(prebuilt_sgx_vendor_bins) $(prebuilt_sgx_vendor_etc) $(prebuilt_sgx_vendor_km),\ diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/bits.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/bits.mk index a1a7eef..d04aa7b 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/bits.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/bits.mk @@ -79,6 +79,7 @@ help: @echo ' make, make build Build all components of the build' @echo ' make components Build only the user-mode components' @echo ' make kbuild Build only the kernel-mode components' + @echo ' make docs Build the build's supporting documentation' @echo ' make MODULE Build the module MODULE and all of its dependencies' @echo ' make eurasiacon/binary2_.../target/libsomething.so' @echo ' Build a particular file (including intermediates)' @@ -104,9 +105,11 @@ ifneq ($(filter help,$(D)),) empty := space := $(empty) $(empty) $(info Debug options) -$(info $(space)D=modules dump module info) -$(info $(space)D=freeze-config prevent config changes) -$(info $(space)D=config-changes dump diffs when config changes) -$(info Options may be combined: make D=freeze-config,config-changes) +$(info $(space)D=modules dump module info) +$(info $(space)D=config dump all config options + type and origin) +$(info $(space)D=freeze-config prevent config changes) +$(info $(space)D=config-changes dump diffs when config changes) +$(info $(space)D=nobuild stop before running the main build) +$(info Options can be combined: make D=freeze-config,config-changes) $(error D=help given) endif diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/buildvars.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/buildvars.mk index 24fa829..ce0608c 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/buildvars.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/buildvars.mk @@ -42,12 +42,32 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ### ########################################################################### +# NOTE: You must *not* use the cc-option et al macros in COMMON_FLAGS, +# COMMON_CFLAGS or COMMON_USER_FLAGS. These flags are shared between +# host and target, which might use compilers with different capabilities. + +# These flags are used for kernel, User C and User C++ +# +COMMON_FLAGS := -W -Wall + +# Some GCC warnings are C only, so we must mask them from C++ +# +COMMON_CFLAGS := $(COMMON_FLAGS) \ + -Wdeclaration-after-statement -Wno-format-zero-length \ + -Wstrict-prototypes + +# User C and User C++ optimization control. Does not affect kernel. +# ifeq ($(BUILD),debug) COMMON_USER_FLAGS := -O0 else OPTIM ?= -O2 +ifeq ($(USE_LTO),1) +COMMON_USER_FLAGS := $(OPTIM) -flto +else COMMON_USER_FLAGS := $(OPTIM) endif +endif # FIXME: We should probably audit the driver for aliasing # @@ -58,26 +78,40 @@ COMMON_USER_FLAGS += -fno-strict-aliasing # COMMON_USER_FLAGS += -g -# These flags are used for kernel, User C and User C++ -# -COMMON_FLAGS = -W -Wall - -# Some GCC warnings are C only, so we must mask them from C++ +# User C and User C++ warning flags # -COMMON_CFLAGS := $(COMMON_FLAGS) \ - -Wdeclaration-after-statement -Wno-format-zero-length \ - -Wmissing-prototypes -Wstrict-prototypes +COMMON_USER_FLAGS += \ + -Wpointer-arith -Wunused-parameter \ + -Wmissing-format-attribute # Additional warnings, and optional warnings. # -WARNING_CFLAGS := \ - -Wpointer-arith -Wunused-parameter \ - -Wmissing-format-attribute \ +TESTED_TARGET_USER_FLAGS := \ $(call cc-option,-Wno-missing-field-initializers) \ - $(call cc-option,-fdiagnostics-show-option) + $(call cc-option,-fdiagnostics-show-option) \ + $(call cc-option,-Wno-self-assign) \ + $(call cc-option,-Wno-parentheses-equality) +TESTED_HOST_USER_FLAGS := \ + $(call host-cc-option,-Wno-missing-field-initializers) \ + $(call host-cc-option,-fdiagnostics-show-option) \ + $(call host-cc-option,-Wno-self-assign) \ + $(call host-cc-option,-Wno-parentheses-equality) + +# These flags are clang-specific. +# -Wno-unused-command-line-argument works around a buggy interaction +# with ccache, see https://bugzilla.samba.org/show_bug.cgi?id=8118 +# -fcolor-diagnostics force-enables colored error messages which +# get disabled when ccache is piped through ccache. +# +TESTED_TARGET_USER_FLAGS += \ + $(call cc-option,-Qunused-arguments) \ + $(call cc-option,-fcolor-diagnostics) +TESTED_HOST_USER_FLAGS += \ + $(call host-cc-option,-Qunused-arguments) \ + $(call host-cc-option,-fcolor-diagnostics) ifeq ($(W),1) -WARNING_CFLAGS += \ +TESTED_TARGET_USER_FLAGS += \ $(call cc-option,-Wbad-function-cast) \ $(call cc-option,-Wcast-qual) \ $(call cc-option,-Wcast-align) \ @@ -97,19 +131,7 @@ WARNING_CFLAGS += \ $(call cc-option,-Wswitch-default) \ $(call cc-option,-Wvla) \ $(call cc-option,-Wwrite-strings) -endif - -WARNING_CFLAGS += \ - $(call cc-optional-warning,-Wunused-but-set-variable) - -HOST_WARNING_CFLAGS := \ - -Wpointer-arith -Wunused-parameter \ - -Wmissing-format-attribute \ - $(call host-cc-option,-Wno-missing-field-initializers) \ - $(call host-cc-option,-fdiagnostics-show-option) - -ifeq ($(W),1) -HOST_WARNING_CFLAGS += \ +TESTED_HOST_USER_FLAGS += \ $(call host-cc-option,-Wbad-function-cast) \ $(call host-cc-option,-Wcast-qual) \ $(call host-cc-option,-Wcast-align) \ @@ -131,12 +153,20 @@ HOST_WARNING_CFLAGS += \ $(call host-cc-option,-Wwrite-strings) endif -HOST_WARNING_CFLAGS += \ +TESTED_TARGET_USER_FLAGS += \ + $(call cc-optional-warning,-Wunused-but-set-variable) +TESTED_HOST_USER_FLAGS += \ $(call host-cc-optional-warning,-Wunused-but-set-variable) -KBUILD_WARNING_CFLAGS := \ +KBUILD_FLAGS := \ -Wno-unused-parameter -Wno-sign-compare -KBUILD_WARNING_CFLAGS += \ + +TESTED_KBUILD_FLAGS := \ + $(call kernel-cc-option,-Wmissing-include-dirs) \ + $(call kernel-cc-option,-Wno-type-limits) \ + $(call kernel-cc-option,-Wno-pointer-arith) \ + $(call kernel-cc-option,-Wno-aggregate-return) \ + $(call kernel-cc-option,-Wno-unused-but-set-variable) \ $(call kernel-cc-optional-warning,-Wbad-function-cast) \ $(call kernel-cc-optional-warning,-Wcast-qual) \ $(call kernel-cc-optional-warning,-Wcast-align) \ @@ -161,22 +191,31 @@ KBUILD_WARNING_CFLAGS += \ # User C only # ALL_CFLAGS := \ - $(COMMON_USER_FLAGS) $(COMMON_CFLAGS) $(WARNING_CFLAGS) \ + $(COMMON_USER_FLAGS) $(COMMON_CFLAGS) $(TESTED_TARGET_USER_FLAGS) \ $(SYS_CFLAGS) - ALL_HOST_CFLAGS := \ - $(COMMON_USER_FLAGS) $(COMMON_CFLAGS) $(HOST_WARNING_CFLAGS) + $(COMMON_USER_FLAGS) $(COMMON_CFLAGS) $(TESTED_HOST_USER_FLAGS) # User C++ only # ALL_CXXFLAGS := \ - $(COMMON_USER_FLAGS) $(COMMON_FLAGS) \ -fno-rtti -fno-exceptions \ - -Wpointer-arith -Wunused-parameter \ + $(COMMON_USER_FLAGS) $(COMMON_FLAGS) $(TESTED_TARGET_USER_FLAGS) \ $(SYS_CXXFLAGS) - ALL_HOST_CXXFLAGS := \ - $(COMMON_USER_FLAGS) $(COMMON_CFLAGS) -Wall + -fno-rtti -fno-exceptions \ + $(COMMON_USER_FLAGS) $(COMMON_FLAGS) $(TESTED_HOST_USER_FLAGS) + +# Workaround for some target clangs that don't support -O0 w/ PIC. +# +ifeq ($(cc-is-clang),true) +ALL_CFLAGS := $(patsubst -O0,-O1,$(ALL_CFLAGS)) +ALL_CXXFLAGS := $(patsubst -O0,-O1,$(ALL_CXXFLAGS)) +endif + +# Kernel C only +# +ALL_KBUILD_CFLAGS := $(COMMON_CFLAGS) $(KBUILD_FLAGS) $(TESTED_KBUILD_FLAGS) # User C and C++ # @@ -186,27 +225,28 @@ ALL_HOST_CXXFLAGS := \ # We can't use it right now because we want to support non-GNU-compatible # linkers like the Darwin 'ld' which doesn't support -rpath-link. # +# For the same reason (Darwin 'ld') don't bother checking for text +# relocations in host binaries. +# ALL_HOST_LDFLAGS := -L$(HOST_OUT) -ALL_LDFLAGS := -L$(TARGET_OUT) -Xlinker -rpath-link=$(TARGET_OUT) +ALL_LDFLAGS := \ + -Wl,--warn-shared-textrel \ + -L$(TARGET_OUT) -Xlinker -rpath-link=$(TARGET_OUT) ifneq ($(strip $(TOOLCHAIN)),) ALL_LDFLAGS += -L$(TOOLCHAIN)/lib -Xlinker -rpath-link=$(TOOLCHAIN)/lib endif +ifneq ($(strip $(TOOLCHAIN2)),) +ALL_LDFLAGS += -L$(TOOLCHAIN2)/lib -Xlinker -rpath-link=$(TOOLCHAIN2)/lib +endif + ifneq ($(strip $(LINKER_RPATH)),) ALL_LDFLAGS += $(addprefix -Xlinker -rpath=,$(LINKER_RPATH)) endif ALL_LDFLAGS += $(SYS_LDFLAGS) -# Kernel C only -# -ALL_KBUILD_CFLAGS := $(COMMON_CFLAGS) $(KBUILD_WARNING_CFLAGS) \ - $(call kernel-cc-option,-Wno-type-limits) \ - $(call kernel-cc-option,-Wno-pointer-arith) \ - $(call kernel-cc-option,-Wno-aggregate-return) \ - $(call kernel-cc-option,-Wno-unused-but-set-variable) - # This variable contains a list of all modules built by kbuild ALL_KBUILD_MODULES := diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/commands.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/commands.mk index 25e5ed1..093bb1c 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/commands.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/commands.mk @@ -55,22 +55,20 @@ endef define target-o-from-one-c $(if $(V),,@echo " CC " $(call relative-to-top,$<)) -$(CC) -MD -c $(MODULE_CFLAGS) $(MODULE_INCLUDE_FLAGS) \ +$(CC) -MD -c $(MODULE_CFLAGS) $(SYS_INCLUDES) $(MODULE_INCLUDE_FLAGS) \ -include $(CONFIG_H) $< -o $@ endef -# We use $(CC) to compile C++ files, and expect it to detect that it's -# compiling C++ define host-o-from-one-cxx -$(if $(V),,@echo " HOST_CC " $(call relative-to-top,$<)) -$(HOST_CC) -MD -c $(MODULE_HOST_CXXFLAGS) $(MODULE_INCLUDE_FLAGS) \ - -include $(CONFIG_H) $< -o $@ +$(if $(V),,@echo " HOST_CXX" $(call relative-to-top,$<)) +$(HOST_CXX) -MD -c $(MODULE_HOST_CXXFLAGS) $(MODULE_INCLUDE_FLAGS) \ + -include $(CONFIG_H) $< -o $@ endef define target-o-from-one-cxx -$(if $(V),,@echo " CC " $(call relative-to-top,$<)) -$(CC) -MD -c $(MODULE_CXXFLAGS) $(MODULE_INCLUDE_FLAGS) \ - -include $(CONFIG_H) $< -o $@ +$(if $(V),,@echo " CXX " $(call relative-to-top,$<)) +$(CXX) -MD -c $(MODULE_CXXFLAGS) $(SYS_INCLUDES) $(MODULE_INCLUDE_FLAGS) \ + -include $(CONFIG_H) $< -o $@ endef define host-executable-from-o @@ -98,7 +96,7 @@ endef define target-executable-cxx-from-o $(if $(V),,@echo " LD " $(call relative-to-top,$@)) $(CXX) \ - $(SYS_EXE_LDFLAGS) $(MODULE_LDFLAGS) -o $@ \ + $(SYS_EXE_LDFLAGS_CXX) $(SYS_EXE_LDFLAGS) $(MODULE_LDFLAGS) -o $@ \ $(SYS_EXE_CRTBEGIN) $(sort $(MODULE_ALL_OBJECTS)) $(SYS_EXE_CRTEND) \ $(MODULE_LIBRARY_DIR_FLAGS) $(MODULE_LIBRARY_FLAGS) $(LIBGCC) endef @@ -116,11 +114,29 @@ endef define target-shared-library-cxx-from-o $(if $(V),,@echo " LD " $(call relative-to-top,$@)) $(CXX) -shared -Wl,-Bsymbolic \ - $(SYS_LIB_LDFLAGS) $(MODULE_LDFLAGS) -o $@ \ + $(SYS_LIB_LDFLAGS_CXX) $(SYS_LIB_LDFLAGS) $(MODULE_LDFLAGS) -o $@ \ $(SYS_LIB_CRTBEGIN) $(sort $(MODULE_ALL_OBJECTS)) $(SYS_LIB_CRTEND) \ $(MODULE_LIBRARY_DIR_FLAGS) $(MODULE_LIBRARY_FLAGS) $(LIBGCC) endef +define host-shared-library-from-o +$(if $(V),,@echo " HOST_LD " $(call relative-to-top,$@)) +$(HOST_CC) -shared -Wl,-Bsymbolic \ + $(MODULE_HOST_LDFLAGS) -o $@ \ + $(sort $(MODULE_ALL_OBJECTS)) \ + $(MODULE_LIBRARY_DIR_FLAGS) $(MODULE_LIBRARY_FLAGS) +endef + +# If there were any C++ source files in a shared library, we use this recipe, +# which runs the C++ compiler to link the final library +define host-shared-library-cxx-from-o +$(if $(V),,@echo " HOST_LD " $(call relative-to-top,$@)) +$(HOST_CXX) -shared -Wl,-Bsymbolic \ + $(MODULE_HOST_LDFLAGS) -o $@ \ + $(sort $(MODULE_ALL_OBJECTS)) \ + $(MODULE_LIBRARY_DIR_FLAGS) $(MODULE_LIBRARY_FLAGS) +endef + define target-copy-debug-information $(OBJCOPY) --only-keep-debug $@ $(basename $@).dbg endef @@ -182,38 +198,64 @@ JAVA ?= java JAVAC ?= javac ZIP ?= zip -override AR := $(if $(V),,@)$(CROSS_COMPILE)ar -override BISON := $(if $(V),,@)$(BISON) -override BZIP2 := $(if $(V),,@)bzip2 -9 -override CC := $(if $(V),,@)$(CROSS_COMPILE)$(CC) -override CC_CHECK := $(if $(V),,@)$(MAKE_TOP)/tools/cc-check.sh -override CXX := $(if $(V),,@)$(CROSS_COMPILE)$(CXX) +ifeq ($(USE_CCACHE),1) +CCACHE ?= ccache +endif + +# Define CHMOD and CC_CHECK first so we can use cc-is-clang +# override CHMOD := $(if $(V),,@)chmod -override CP := $(if $(V),,@)cp -override ECHO := $(if $(V),,@)echo -override FLEX := $(if $(V),,@)flex -override GAWK := $(if $(V),,@)gawk -override GREP := $(if $(V),,@)grep -override HOST_AR := $(if $(V),,@)ar -override HOST_CC := $(if $(V),,@)$(HOST_CC) -override HOST_CXX := $(if $(V),,@)$(HOST_CXX) -override HOST_STRIP := $(if $(V),,@)strip -override INSTALL := $(if $(V),,@)install -override JAR := $(if $(V),,@)$(JAR) -override JAVA := $(if $(V),,@)$(JAVA) -override JAVAC := $(if $(V),,@)$(JAVAC) -override M4 := $(if $(V),,@)m4 -override MKDIR := $(if $(V),,@)mkdir -override MV := $(if $(V),,@)mv -override OBJCOPY := $(if $(V),,@)$(CROSS_COMPILE)objcopy -override PDSASM := $(if $(V),,@)$(HOST_OUT)/pdsasm -override RANLIB := $(if $(V),,@)$(CROSS_COMPILE)ranlib -override RM := $(if $(V),,@)rm -f -override SED := $(if $(V),,@)sed -override STRIP := $(if $(V),,@)$(CROSS_COMPILE)strip -override TAR := $(if $(V),,@)tar -override TOUCH := $(if $(V),,@)touch -override USEASM := $(if $(V),,@)$(HOST_OUT)/useasm -override USELINK := $(if $(V),,@)$(HOST_OUT)/uselink -override VHD2INC := $(if $(V),,@)$(HOST_OUT)/vhd2inc -override ZIP := $(if $(V),,@)$(ZIP) +override CC_CHECK := $(if $(V),,@)$(MAKE_TOP)/tools/cc-check.sh + +# If clang is detected, the compiler name is invariant but CROSS_COMPILE +# is reflected in the use of -target. For GCC this is always encoded into +# the binary. If CROSS_COMPILE is not set we can skip this. +# +ifneq ($(CROSS_COMPILE),) +ifeq ($(cc-is-clang),true) +override CC := $(if $(V),,@)$(CCACHE) $(CC) \ + -target $(patsubst %-,%,$(CROSS_COMPILE)) \ + -B$(dir $(shell which $(CROSS_COMPILE)gcc)) +override CXX := $(if $(V),,@)$(CCACHE) $(CXX) \ + -target $(patsubst %-,%,$(CROSS_COMPILE)) \ + -B$(dir $(shell which $(CROSS_COMPILE)gcc)) +else +override CC := $(if $(V),,@)$(CCACHE) $(CROSS_COMPILE)$(CC) +override CXX := $(if $(V),,@)$(CCACHE) $(CROSS_COMPILE)$(CXX) +endif +else +override CC := $(if $(V),,@)$(CCACHE) $(CC) +override CXX := $(if $(V),,@)$(CCACHE) $(CXX) +endif + +override AR := $(if $(V),,@)$(CROSS_COMPILE)ar +override BISON := $(if $(V),,@)$(BISON) +override BZIP2 := $(if $(V),,@)bzip2 -9 +override CP := $(if $(V),,@)cp +override ECHO := $(if $(V),,@)echo +override FLEX := $(if $(V),,@)flex +override GAWK := $(if $(V),,@)gawk +override GREP := $(if $(V),,@)grep +override HOST_AR := $(if $(V),,@)ar +override HOST_CC := $(if $(V),,@)$(CCACHE) $(HOST_CC) +override HOST_CXX := $(if $(V),,@)$(CCACHE) $(HOST_CXX) +override HOST_STRIP := $(if $(V),,@)strip +override INSTALL := $(if $(V),,@)install +override JAR := $(if $(V),,@)$(JAR) +override JAVA := $(if $(V),,@)$(JAVA) +override JAVAC := $(if $(V),,@)$(JAVAC) +override M4 := $(if $(V),,@)m4 +override MKDIR := $(if $(V),,@)mkdir +override MV := $(if $(V),,@)mv +override OBJCOPY := $(if $(V),,@)$(CROSS_COMPILE)objcopy +override PDSASM := $(if $(V),,@)$(HOST_OUT)/pdsasm +override RANLIB := $(if $(V),,@)$(CROSS_COMPILE)ranlib +override RM := $(if $(V),,@)rm -f +override SED := $(if $(V),,@)sed +override STRIP := $(if $(V),,@)$(CROSS_COMPILE)strip +override TAR := $(if $(V),,@)tar +override TOUCH := $(if $(V),,@)touch +override USEASM := $(if $(V),,@)$(HOST_OUT)/useasm +override USELINK := $(if $(V),,@)$(HOST_OUT)/uselink +override VHD2INC := $(if $(V),,@)$(HOST_OUT)/vhd2inc +override ZIP := $(if $(V),,@)$(ZIP) diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/arch_common.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/arch_common.mk index 23f9175..d658679 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/arch_common.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/arch_common.mk @@ -38,24 +38,55 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ### ########################################################################### +ifeq ($(USE_CLANG),1) +export CC := $(OUT_DIR)/host/$(HOST_OS)-$(HOST_ARCH)/bin/clang +export CXX := $(OUT_DIR)/host/$(HOST_OS)-$(HOST_ARCH)/bin/clang++ +endif + +# FIXME: We need to run this early because config/core.mk hasn't been +# included yet. Use the same variable names as in that makefile. +# +_CC := $(if $(filter default,$(origin CC)),gcc,$(CC)) +_CLANG := $(shell ../tools/cc-check.sh --clang --cc $(_CC)) + SYS_CFLAGS := \ -fno-short-enums \ -funwind-tables \ - -D__linux__ \ - -I$(ANDROID_ROOT)/bionic/libc/arch-$(ANDROID_ARCH)/include \ - -I$(ANDROID_ROOT)/bionic/libc/include \ - -I$(ANDROID_ROOT)/bionic/libc/kernel/common \ - -I$(ANDROID_ROOT)/bionic/libc/kernel/arch-$(ANDROID_ARCH) \ - -I$(ANDROID_ROOT)/bionic/libm/include \ - -I$(ANDROID_ROOT)/bionic/libm/include/$(ANDROID_ARCH) \ - -I$(ANDROID_ROOT)/bionic/libthread_db/include \ - -I$(ANDROID_ROOT)/frameworks/base/include \ + -D__linux__ +SYS_INCLUDES := \ + -isystem $(ANDROID_ROOT)/bionic/libc/arch-$(ANDROID_ARCH)/include \ + -isystem $(ANDROID_ROOT)/bionic/libc/include \ + -isystem $(ANDROID_ROOT)/bionic/libc/kernel/common \ + -isystem $(ANDROID_ROOT)/bionic/libc/kernel/arch-$(ANDROID_ARCH) \ + -isystem $(ANDROID_ROOT)/bionic/libm/include \ + -isystem $(ANDROID_ROOT)/bionic/libm/include/$(ANDROID_ARCH) \ + -isystem $(ANDROID_ROOT)/bionic/libthread_db/include \ + -isystem $(ANDROID_ROOT)/frameworks/base/include \ -isystem $(ANDROID_ROOT)/system/core/include \ - -I$(ANDROID_ROOT)/hardware/libhardware/include \ - -I$(ANDROID_ROOT)/external/openssl/include + -isystem $(ANDROID_ROOT)/hardware/libhardware/include \ + -isystem $(ANDROID_ROOT)/external/openssl/include \ + -isystem $(ANDROID_ROOT)/system/media/camera/include \ + -isystem $(ANDROID_ROOT)/hardware/libhardware_legacy/include + +# This is comparing PVR_BUILD_DIR to see if it is omap and adding +# includes required for it's HWC +ifeq ($(notdir $(abspath .)),omap_android) +SYS_INCLUDES += \ + -isystem $(ANDROID_ROOT)/hardware/ti/omap4xxx/kernel-headers +endif + +ifeq ($(_CLANG),true) +SYS_INCLUDES := \ + -nostdinc $(SYS_INCLUDES) \ + -isystem $(ANDROID_ROOT)/external/clang/lib/include +endif SYS_EXE_LDFLAGS := \ -Bdynamic -nostdlib -Wl,-dynamic-linker,/system/bin/linker \ -lc -ldl -lcutils SYS_LIB_LDFLAGS := $(SYS_EXE_LDFLAGS) + +SYS_EXE_LDFLAGS_CXX := -lstdc++ + +SYS_LIB_LDFLAGS_CXX := $(SYS_EXE_LDFLAGS_CXX) diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/armv7-a.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/armv7-a.mk index 8c3f937..7718aa9 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/armv7-a.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/armv7-a.mk @@ -38,16 +38,23 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ### ########################################################################### -OPTIM := -Os +OPTIM := -O2 ANDROID_ARCH := arm include ../common/android/arch_common.mk SYS_CFLAGS += -march=armv7-a +ifneq ($(BUILD),debug) +SYS_CFLAGS += -mthumb +endif + SYS_EXE_CRTBEGIN := $(TOOLCHAIN)/lib/crtbegin_dynamic.o SYS_EXE_CRTEND := $(TOOLCHAIN)/lib/crtend_android.o +SYS_LIB_CRTBEGIN := $(TOOLCHAIN)/lib/crtbegin_so.o +SYS_LIB_CRTEND := $(TOOLCHAIN)/lib/crtend_so.o + # Handle the removal of the armelf.x and armelf.xsc linker scripts. ifeq ($(strip $(wildcard $(ANDROID_ROOT)/build/core/armelf.x)),) # The linker scripts have been removed. We need to use these options diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/extra_config.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/extra_config.mk index 320804e..b5dd754 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/extra_config.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/extra_config.mk @@ -44,4 +44,9 @@ $(eval $(call BothConfigC,ANDROID,)) +$(eval $(call TunableBothConfigC,SUPPORT_PVRSRV_ANDROID_SYSTRACE,)) +$(eval $(call TunableBothConfigMake,SUPPORT_PVRSRV_ANDROID_SYSTRACE,)) + +$(eval $(call TunableBothConfigMake,PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC,)) +$(eval $(call TunableBothConfigC,PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC,)) diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/features.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/features.mk index 8a60fb7..3de2205 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/features.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/features.mk @@ -49,6 +49,10 @@ SUPPORT_OPENGLES1_V1_ONLY := 1 # SUPPORT_MEMINFO_IDS := 1 +# Enable services ion support by default +# +#SUPPORT_ION ?= 1 + # Need multi-process support in PDUMP # SUPPORT_PDUMP_MULTI_PROCESS := 1 @@ -65,9 +69,6 @@ OPK_DEFAULT := libpvrANDROID_WSEGL.so # before EGL_image_external was generally available. # KERNEL_COMPONENTS := srvkm -ifeq ($(is_at_least_honeycomb),0) -KERNEL_COMPONENTS += bufferclass_example -endif # Kernel modules are always installed here under Android # @@ -100,52 +101,27 @@ SUPPORT_LARGE_GENERAL_HEAP := 1 PVR_LINUX_MEM_AREA_POOL_MAX_PAGES ?= 5400 ############################################################################## -# EGL connect/disconnect hooks only available since Froyo -# Obsolete in future versions -# -ifeq ($(is_at_least_froyo),1) -ifeq ($(is_at_least_icecream_sandwich),0) -PVR_ANDROID_HAS_CONNECT_DISCONNECT := 1 -endif -endif - -############################################################################## -# Override surface field name for older versions +# Framebuffer target extension is used to find configs compatible with +# the framebuffer (added in JB MR1). # -ifeq ($(is_at_least_gingerbread),0) -PVR_ANDROID_SURFACE_FIELD_NAME := \"mSurface\" -endif - -############################################################################## -# Provide ANativeWindow{Buffer,} typedefs for older versions -# -ifeq ($(is_at_least_gingerbread),0) -PVR_ANDROID_NEEDS_ANATIVEWINDOW_TYPEDEF := 1 -endif -ifeq ($(is_at_least_icecream_sandwich),0) -PVR_ANDROID_NEEDS_ANATIVEWINDOWBUFFER_TYPEDEF := 1 -endif +EGL_EXTENSION_ANDROID_FRAMEBUFFER_TARGET := 1 ############################################################################## # Handle various platform includes for unittests # -UNITTEST_INCLUDES := eurasiacon/android - -ifeq ($(is_at_least_gingerbread),1) -UNITTEST_INCLUDES += $(ANDROID_ROOT)/frameworks/base/native/include -endif +UNITTEST_INCLUDES := \ + eurasiacon/android \ + $(ANDROID_ROOT)/frameworks/base/native/include ifeq ($(is_at_least_jellybean),1) UNITTEST_INCLUDES += \ $(ANDROID_ROOT)/frameworks/native/include \ $(ANDROID_ROOT)/frameworks/native/opengl/include \ - $(ANDROID_ROOT)/libnativehelper/include -# FIXME: This is the old location for the JNI header. -UNITTEST_INCLUDES += $(ANDROID_ROOT)/dalvik/libnativehelper/include + $(ANDROID_ROOT)/libnativehelper/include/nativehelper else UNITTEST_INCLUDES += \ $(ANDROID_ROOT)/frameworks/base/opengl/include \ - $(ANDROID_ROOT)/dalvik/libnativehelper/include + $(ANDROID_ROOT)/dalvik/libnativehelper/include/nativehelper endif # But it doesn't have OpenVG headers @@ -155,13 +131,8 @@ UNITTEST_INCLUDES += eurasiacon/unittests/include ############################################################################## # Future versions moved proprietary libraries to a vendor directory # -ifeq ($(is_at_least_gingerbread),1) SHLIB_DESTDIR := /system/vendor/lib DEMO_DESTDIR := /system/vendor/bin -else -SHLIB_DESTDIR := /system/lib -DEMO_DESTDIR := /system/bin -endif # EGL libraries go in a special place # @@ -170,153 +141,154 @@ EGL_DESTDIR := $(SHLIB_DESTDIR)/egl ############################################################################## # We can support OpenCL in the build since Froyo (stlport was added in 2.2) # -ifeq ($(is_at_least_froyo),1) -SYS_CXXFLAGS := \ - -fuse-cxa-atexit \ - $(SYS_CFLAGS) \ - -I$(ANDROID_ROOT)/bionic \ - -I$(ANDROID_ROOT)/external/stlport/stlport -else -SYS_CXXFLAGS := \ - $(SYS_CFLAGS) \ - -I$(ANDROID_ROOT)/bionic/libstdc++/include -endif +SYS_CXXFLAGS := -fuse-cxa-atexit $(SYS_CFLAGS) +SYS_INCLUDES += \ + -isystem $(ANDROID_ROOT)/bionic \ + -isystem $(ANDROID_ROOT)/external/stlport/stlport ############################################################################## -# Composition bypass feature, supported since Froyo. -# In ICS, hardware composer (HWC) should be used instead. +# Support the OES_EGL_image_external extensions in the client drivers. # -ifeq ($(is_at_least_froyo),1) -ifeq ($(is_at_least_honeycomb),0) -PVR_ANDROID_HAS_NATIVE_BUFFER_TRANSFORM := 1 -SUPPORT_ANDROID_COMPOSITION_BYPASS := 1 -endif -endif +GLES1_EXTENSION_EGL_IMAGE_EXTERNAL := 1 +GLES2_EXTENSION_EGL_IMAGE_EXTERNAL := 1 ############################################################################## -# In ICS, we have hardware composer (HWC) support. +# ICS requires that at least one driver EGLConfig advertises the +# EGL_RECORDABLE_ANDROID attribute. The platform requires that surfaces +# rendered with this config can be consumed by an OMX video encoder. # -# SUPPORT_ANDROID_COMPOSER_HAL adds Post2() to the framebuffer HAL interface -# and is intended for inter-op with external HWC modules. It is always -# enabled (but we allow it to be compiled out just in case). +EGL_EXTENSION_ANDROID_RECORDABLE := 1 + +############################################################################## +# ICS added the EGL_ANDROID_blob_cache extension. Enable support for this +# extension in EGL/GLESv2. # -# SUPPORT_ANDROID_COMPOSITION_BYPASS adds a new buffer type (client buffers -# allocated from the framebuffer pool) which maximizes compatibility with -# most 3rdparty display controllers. It is orthogonal to HWC support. +EGL_EXTENSION_ANDROID_BLOB_CACHE := 1 + +############################################################################## +# ICS and earlier should rate-limit composition by waiting for 3D renders +# to complete in the compositor's eglSwapBuffers(). # -ifeq ($(is_at_least_honeycomb),1) -SUPPORT_ANDROID_COMPOSER_HAL := 1 +ifeq ($(is_at_least_jellybean),0) +PVR_ANDROID_COMPOSITOR_WAIT_FOR_RENDER := 1 endif ############################################################################## -# We have some extra GRALLOC_USAGE bits we need to handle in ICS +# JB added a new corkscrew API for userland backtracing. # -ifeq ($(is_at_least_honeycomb),1) -PVR_ANDROID_HAS_GRALLOC_USAGE_EXTERNAL_DISP := 1 -PVR_ANDROID_HAS_GRALLOC_USAGE_PROTECTED := 1 -PVR_ANDROID_HAS_GRALLOC_USAGE_PRIVATE := 1 +ifeq ($(is_at_least_jellybean),1) +PVR_ANDROID_HAS_CORKSCREW_API := 1 endif ############################################################################## -# Support the new OES_EGL_image_external extension + YV12 buffers +# JB MR1 makes the framebuffer HAL obsolete. # -ifeq ($(is_at_least_honeycomb),1) -PVR_ANDROID_HAS_HAL_PIXEL_FORMAT_YV12 := 1 -GLES1_EXTENSION_EGL_IMAGE_EXTERNAL := 1 -GLES2_EXTENSION_EGL_IMAGE_EXTERNAL := 1 +# We also need to support IMPLEMENTATION_DEFINED so gralloc allocates +# framebuffers and GPU buffers in a 'preferred' format. +# +ifeq ($(is_at_least_jellybean_mr1),0) +SUPPORT_ANDROID_FRAMEBUFFER_HAL := 1 +else +PVR_ANDROID_HAS_HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED := 1 endif ############################################################################## -# Gingerbread adds the native window cancelBuffer operation +# JB MR1 introduces cross-process syncs associated with a fd. +# This requires a new enough kernel version to have the base/sync driver. # -ifeq ($(is_at_least_gingerbread),1) -PVR_ANDROID_HAS_CANCELBUFFER := 1 +ifeq ($(is_at_least_jellybean_mr1),1) +EGL_EXTENSION_ANDROID_NATIVE_FENCE_SYNC := 0 +PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC := 0 endif ############################################################################## -# Versions prior to ICS have another header we must include +# JB MR1 introduces new usage bits for the camera HAL and some new formats. # -ifeq ($(is_at_least_icecream_sandwich),0) -PVR_ANDROID_HAS_ANDROID_NATIVE_BUFFER_H := 1 +ifeq ($(is_at_least_jellybean_mr1),1) +PVR_ANDROID_HAS_GRALLOC_USAGE_HW_CAMERA := 1 +PVR_ANDROID_HAS_HAL_PIXEL_FORMAT_RAW_SENSOR := 1 +PVR_ANDROID_HAS_HAL_PIXEL_FORMAT_BLOB := 1 endif ############################################################################## -# ICS added dump() hook to gralloc alloc_device_t API +# JB MR2 adds a new graphics HAL (gralloc) API function, lock_ycbcr(), and +# a so-called "flexible" YUV format enum. # -ifeq ($(is_at_least_honeycomb),1) -PVR_ANDROID_HAS_GRALLOC_DUMP := 1 +ifeq ($(is_at_least_jellybean_mr2),1) +PVR_ANDROID_HAS_HAL_PIXEL_FORMAT_YCbCr_420_888 := 1 +PVR_ANDROID_GRALLOC_HAS_0_2_FEATURES := 1 endif ############################################################################## -# ICS added support for the BGRX pixel format, and allows drivers to advertise -# configs in this format instead of RGBX. +# In JB MR2 we can use a native helper library for the unittest wrapper. +# In earlier versions, we must use a less ideal approach. # -# The DDK provides a private definition of HAL_PIXEL_FORMAT_BGRX_8888. This -# option exposes it as the native visual for 8888 configs with alpha ignored +ifeq ($(is_at_least_jellybean_mr2),0) +PVR_ANDROID_SURFACE_FIELD_NAME := \"mNativeSurface\" +endif + +############################################################################## +# JB MR2 introduces two new camera HAL formats (Y8, Y16) # -ifeq ($(is_at_least_icecream_sandwich),1) -SUPPORT_HAL_PIXEL_FORMAT_BGRX := 1 +ifeq ($(is_at_least_jellybean_mr2),1) +PVR_ANDROID_HAS_HAL_PIXEL_FORMAT_Y8 := 1 +PVR_ANDROID_HAS_HAL_PIXEL_FORMAT_Y16 := 1 endif ############################################################################## -# ICS added the ability for GL clients to pre-rotate their rendering to the -# orientation desired by the compositor. The SGX DDK can use TRANSFORM_HINT -# to access this functionality. +# KK's EGL wrapper remaps EGLConfigs in the BGRA and BGRX formats to RGBA and +# RGBX respectively, for CpuConsumer compatibility. It does this because the +# usage bits for the gralloc allocation are not available to EGL. # -# This is required by some HWC implementations that cannot use the display -# to rotate buffers, otherwise the HWC optimization cannot be used when -# rotating the device. +# In this newer platform version, gralloc has been redefined to allow the +# 'format' parameter to gralloc->alloc() to be ignored for non-USAGE_SW +# allocations, so long as the bits per channel and sRGB-ness are preserved. # -ifeq ($(is_at_least_icecream_sandwich),1) -PVR_ANDROID_HAS_WINDOW_TRANSFORM_HINT := 1 +ifeq ($(is_at_least_kitkat),1) +PVR_ANDROID_REMAP_HW_ONLY_PIXEL_FORMATS := 1 endif ############################################################################## -# ICS requires that at least one driver EGLConfig advertises the -# EGL_RECORDABLE_ANDROID attribute. The platform requires that surfaces -# rendered with this config can be consumed by an OMX video encoder. +# Workaround for texture atlas "double registerBuffer" issue in KK # -ifeq ($(is_at_least_icecream_sandwich),1) -EGL_EXTENSION_ANDROID_RECORDABLE := 1 +ifeq ($(is_at_least_kitkat),1) +PVR_ANDROID_DONT_ENFORCE_SINGLE_REGISTER := 1 endif ############################################################################## -# ICS added a new usage bit. USAGE_HW_COMPOSER indicates that a buffer might -# be used with HWComposer. In practice this is all non-MM buffers. +# Support newer HWC features in KK # -ifeq ($(is_at_least_icecream_sandwich),1) -PVR_ANDROID_HAS_GRALLOC_USAGE_HW_COMPOSER := 1 +ifeq ($(is_at_least_kitkat),1) +PVR_ANDROID_HWC_HAS_1_3_FEATURES := 1 endif ############################################################################## -# ICS added the EGL_ANDROID_blob_cache extension. Enable support for this -# extension in EGL/GLESv2. +# KK eliminated egl.cfg. Only create for older versions. # -ifeq ($(is_at_least_icecream_sandwich),1) -EGL_EXTENSION_ANDROID_BLOB_CACHE := 1 +ifeq ($(is_at_least_kitkat),0) +PVR_ANDROID_HAS_EGL_CFG := 1 endif ############################################################################## -# ICS MR1 added a new usage bit. USAGE_HW_VIDEO_ENCODER indicates that a -# buffer might be used with the video encoder. +# KK has a bug in its browser that we need to work around. # -ifeq ($(is_at_least_icecream_sandwich_mr1),1) -PVR_ANDROID_HAS_GRALLOC_USAGE_HW_VIDEO_ENCODER := 1 +ifeq ($(is_at_least_kitkat),1) +PVR_ANDROID_RELAX_GRALLOC_MODULE_MAP_CHECKS := 1 endif ############################################################################## -# ICS and earlier should rate-limit composition by waiting for 3D renders -# to complete in the compositor's eglSwapBuffers(). +# KK's Camera HAL requires that ACTIVE_ARRAY_SIZE specify xmin/ymin first # -ifeq ($(is_at_least_jellybean),0) -PVR_ANDROID_COMPOSITOR_WAIT_FOR_RENDER := 1 +ifeq ($(is_at_least_kitkat),1) +PVR_ANDROID_CAMERA_ACTIVE_ARRAY_SIZE_HAS_XMIN_YMIN := 1 endif ############################################################################## -# JB added a new corkscrew API for userland backtracing. +# KitKat added a new memory tracking HAL. This enables gralloc support for +# the GRAPHICS/GL memtrack types. # -ifeq ($(is_at_least_jellybean),1) -PVR_ANDROID_HAS_CORKSCREW_API := 1 +ifeq ($(is_at_least_kitkat),1) +SUPPORT_ANDROID_MEMTRACK_HAL := 1 endif # Placeholder for future version handling diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/paths.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/paths.mk index 5c8f000..9717ca9 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/paths.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/paths.mk @@ -40,6 +40,9 @@ TARGET_BUILD_TYPE ?= release +HOST_OS ?= linux +HOST_ARCH ?= x86 + OUT_DIR ?= $(ANDROID_ROOT)/out ifeq ($(TARGET_BUILD_TYPE),debug) @@ -48,6 +51,7 @@ else TARGET_ROOT := $(OUT_DIR)/target endif -TOOLCHAIN ?= $(TARGET_ROOT)/product/$(TARGET_PRODUCT)/obj +TOOLCHAIN ?= $(TARGET_ROOT)/product/$(TARGET_DEVICE)/obj +TOOLCHAIN2 ?= $(TARGET_ROOT)/product/$(TARGET_DEVICE)/system LIBGCC := $(shell $(CROSS_COMPILE)gcc -print-libgcc-file-name) diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/platform_version.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/platform_version.mk index 698efa3..482fd19 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/platform_version.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/android/platform_version.mk @@ -41,11 +41,11 @@ # Figure out the version of Android we're building against. # PLATFORM_VERSION := $(shell \ - if [ -f $(TARGET_ROOT)/product/$(TARGET_PRODUCT)/system/build.prop ]; then \ - cat $(TARGET_ROOT)/product/$(TARGET_PRODUCT)/system/build.prop | \ + if [ -f $(TARGET_ROOT)/product/$(TARGET_DEVICE)/system/build.prop ]; then \ + cat $(TARGET_ROOT)/product/$(TARGET_DEVICE)/system/build.prop | \ grep ^ro.build.version.release | cut -f2 -d'=' | cut -f1 -d'-'; \ else \ - echo 4.0.3; \ + echo 1.6; \ fi) define version-starts-with @@ -59,20 +59,22 @@ endef # final release of that version, so we set PLATFORM_VERSION to the # corresponding release number. # -ifeq ($(call version-starts-with,Eclair),1) -PLATFORM_VERSION := 2.0 -else ifeq ($(call version-starts-with,Froyo),1) -PLATFORM_VERSION := 2.2 -else ifeq ($(call version-starts-with,Gingerbread),1) -PLATFORM_VERSION := 2.3 -else ifeq ($(call version-starts-with,Honeycomb),1) -PLATFORM_VERSION := 3.0 -else ifeq ($(call version-starts-with,IceCreamSandwichMR),1) -PLATFORM_VERSION := 4.0.3 -else ifeq ($(call version-starts-with,IceCreamSandwich),1) -PLATFORM_VERSION := 4.0 +# NOTE: It's the _string_ ordering that matters here, not the version number +# ordering. You need to make sure that strings that are sub-strings of other +# checked strings appear _later_ in this list. +# +# e.g. 'JellyBeanMR' starts with 'JellyBean', but it is not JellyBean. +# +ifeq ($(call version-starts-with,JellyBeanMR1),1) +PLATFORM_VERSION := 4.2 +else ifeq ($(call version-starts-with,JellyBeanMR),1) +PLATFORM_VERSION := 4.3 else ifeq ($(call version-starts-with,JellyBean),1) PLATFORM_VERSION := 4.1 +else ifeq ($(call version-starts-with,KeyLimePie),1) +PLATFORM_VERSION := 4.4 +else ifeq ($(call version-starts-with,KitKat),1) +PLATFORM_VERSION := 4.4 else ifeq ($(shell echo $(PLATFORM_VERSION) | grep -qE "[A-Za-z]+"; echo $$?),0) PLATFORM_VERSION := 5.0 endif @@ -89,31 +91,22 @@ endif # Macros to help categorize support for features and API_LEVEL for tests. # -is_at_least_eclair := \ - $(shell ( test $(PLATFORM_VERSION_MAJ) -gt 2 || \ - ( test $(PLATFORM_VERSION_MAJ) -eq 2 && \ - test $(PLATFORM_VERSION_MIN) -ge 0 ) ) && echo 1 || echo 0) -is_at_least_froyo := \ - $(shell ( test $(PLATFORM_VERSION_MAJ) -gt 2 || \ - ( test $(PLATFORM_VERSION_MAJ) -eq 2 && \ +is_at_least_jellybean := \ + $(shell ( test $(PLATFORM_VERSION_MAJ) -gt 4 || \ + ( test $(PLATFORM_VERSION_MAJ) -eq 4 && \ + test $(PLATFORM_VERSION_MIN) -ge 1 ) ) && echo 1 || echo 0) +is_at_least_jellybean_mr1 := \ + $(shell ( test $(PLATFORM_VERSION_MAJ) -gt 4 || \ + ( test $(PLATFORM_VERSION_MAJ) -eq 4 && \ test $(PLATFORM_VERSION_MIN) -ge 2 ) ) && echo 1 || echo 0) -is_at_least_gingerbread := \ - $(shell ( test $(PLATFORM_VERSION_MAJ) -gt 2 || \ - ( test $(PLATFORM_VERSION_MAJ) -eq 2 && \ - test $(PLATFORM_VERSION_MIN) -ge 3 ) ) && echo 1 || echo 0) -is_at_least_honeycomb := \ - $(shell test $(PLATFORM_VERSION_MAJ) -ge 3 && echo 1 || echo 0) -is_at_least_icecream_sandwich := \ - $(shell test $(PLATFORM_VERSION_MAJ) -ge 4 && echo 1 || echo 0) -is_at_least_icecream_sandwich_mr1 := \ +is_at_least_jellybean_mr2 := \ $(shell ( test $(PLATFORM_VERSION_MAJ) -gt 4 || \ ( test $(PLATFORM_VERSION_MAJ) -eq 4 && \ - ( test $(PLATFORM_VERSION_MIN) -ge 1 || \ - test $(PLATFORM_VERSION_PATCH) -ge 3 ) ) ) && echo 1 || echo 0) -is_at_least_jellybean := \ + test $(PLATFORM_VERSION_MIN) -ge 3 ) ) && echo 1 || echo 0) +is_at_least_kitkat := \ $(shell ( test $(PLATFORM_VERSION_MAJ) -gt 4 || \ ( test $(PLATFORM_VERSION_MAJ) -eq 4 && \ - test $(PLATFORM_VERSION_MIN) -ge 1 ) ) && echo 1 || echo 0) + test $(PLATFORM_VERSION_MIN) -ge 4 ) ) && echo 1 || echo 0) # FIXME: Assume "future versions" are >=5.0, but we don't really know is_future_version := \ @@ -123,27 +116,17 @@ is_future_version := \ # against can avoid compatibility theming and affords better integration. # ifeq ($(is_future_version),1) +API_LEVEL := 20 +else ifeq ($(is_at_least_kitkat),1) +API_LEVEL := 19 +else ifeq ($(is_at_least_jellybean_mr2),1) +API_LEVEL := 18 +else ifeq ($(is_at_least_jellybean_mr1),1) API_LEVEL := 17 else ifeq ($(is_at_least_jellybean),1) API_LEVEL := 16 -else ifeq ($(is_at_least_icecream_sandwich),1) -# MR1 15 -API_LEVEL := 14 -else ifeq ($(is_at_least_honeycomb),1) -# MR2 13 -# MR1 12 -API_LEVEL := 11 -else ifeq ($(is_at_least_gingerbread),1) -# MR1 10 -API_LEVEL := 9 -else ifeq ($(is_at_least_froyo),1) -API_LEVEL := 8 -else ifeq ($(is_at_least_eclair),1) -# MR1 7 -# 2.0.1 6 -API_LEVEL := 5 else -$(error Must build against Android >= 2.0) +$(error Must build against Android >= 4.1) endif # Each DDK is tested against only a single version of the platform. @@ -151,6 +134,6 @@ endif # ifeq ($(is_future_version),1) $(info WARNING: Android version is newer than this DDK supports) -else ifneq ($(is_at_least_icecream_sandwich),1) +else ifneq ($(is_at_least_jellybean_mr2),1) $(info WARNING: Android version is older than this DDK supports) endif diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/apis/xorg.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/apis/xorg.mk new file mode 100644 index 0000000..c779e9d --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/apis/xorg.mk @@ -0,0 +1,48 @@ +########################################################################### ### +#@Title XOrg root makefile +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### + +ifeq ($(filter xorg,$(EXCLUDED_APIS)),) + COMPONENTS += xorg pvr_conf pvr_video wsegl_dri2_linux + -include ../common/apis/xorg_opengl.mk +ifeq ($(SUPPORT_PVR_REMOTE),1) + COMPONENTS += pvr_input +endif +endif diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/dridrm.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/dridrm.mk index 5d0289f..4097e7a 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/dridrm.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/dridrm.mk @@ -59,5 +59,3 @@ $(eval $(call TunableBothConfigMake,PVR_DRI_DRM_NOT_PCI)) $(eval $(call TunableKernelConfigC,PVR_DRI_DRM_PLATFORM_DEV,)) - -export EXTERNAL_3PDD_TARBALL diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/omap4.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/omap4.mk index 153159a..9a2cdd5 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/omap4.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/omap4.mk @@ -41,3 +41,4 @@ $(eval $(call TunableKernelConfigC,PVR_NO_OMAP_TIMER,)) $(eval $(call TunableKernelConfigC,PVR_OMAPLFB_DONT_USE_FB_PAN_DISPLAY,)) $(eval $(call TunableKernelConfigC,PVR_OMAPLFB_DRM_FB,)) +$(eval $(call TunableKernelConfigC,VS_PRODUCT_VERSION,)) diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/xorg.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/xorg.mk new file mode 100644 index 0000000..27c77a3 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/xorg.mk @@ -0,0 +1,48 @@ +########################################################################### ### +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### + +PVR_SECURE_DRM_AUTH_EXPORT := 1 + +$(eval $(call TunableKernelConfigC,XPROC_WORKAROUND_NUM_SHAREABLES,4095)) + +ifeq ($(SUPPORT_PVR_REMOTE),1) +else +endif + diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/xorg_test.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/xorg_test.mk new file mode 100644 index 0000000..fe10742 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/common/xorg_test.mk @@ -0,0 +1,51 @@ +########################################################################### ### +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### + +# FIXME: Will go away when SUPPORT_DRI_DRM is untangled from +# the old meaning of SUPPORT_XORG=1. + +ifeq ($(filter xorg,$(EXCLUDED_APIS)),) +ifneq ($(wildcard ../common/apis/xorg.mk),) +SUPPORT_BUILD_XORG := 1 +ifeq ($(PDUMP),1) +SUPPORT_PDUMP_MULTI_PROCESS := 1 +endif +endif +endif diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/config/core.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/config/core.mk index 247d1e1..3f761cf 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/config/core.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/config/core.mk @@ -56,6 +56,7 @@ # define KernelConfigMake $$(shell echo "override $(1) := $(2)" >>$(CONFIG_KERNEL_MK).new) +$(if $(filter config,$(D)),$(info KernelConfigMake $(1) := $(2) # $(if $($(1)),$(origin $(1)),default))) endef # Write out a GNU make option for both user & kernel @@ -88,6 +89,7 @@ endef # define KernelConfigC $$(shell echo "#define $(1) $(2)" >>$(CONFIG_KERNEL_H).new) +$(if $(filter config,$(D)),$(info KernelConfigC #define $(1) $(2) /* $(if $($(1)),$(origin $(1)),default) */),) endef # Write out an option for both user & kernel @@ -176,9 +178,7 @@ $(call directory-must-exist,$(TOP)/eurasiacon/build/linux2/$(PVR_BUILD_DIR)) # final programs/libraries, and install/rc scripts. # BUILD ?= release -# TI: Added SGX type to binary build location so builds for different GPUs -# with the same build directory are put in different places -OUT ?= $(TOP)/eurasiacon/binary2_$(SGXCORE)_$(SGX_CORE_REV)_$(PVR_BUILD_DIR)_$(BUILD) +OUT ?= $(TOP)/eurasiacon/binary2_$(PVR_BUILD_DIR)_$(BUILD) override OUT := $(if $(filter /%,$(OUT)),$(OUT),$(TOP)/$(OUT)) CONFIG_MK := $(OUT)/config.mk @@ -186,6 +186,14 @@ CONFIG_H := $(OUT)/config.h CONFIG_KERNEL_MK := $(OUT)/config_kernel.mk CONFIG_KERNEL_H := $(OUT)/config_kernel.h +# Convert commas to spaces in $(D). This is so you can say "make +# D=config-changes,freeze-config" and have $(filter config-changes,$(D)) +# still work. +comma := , +empty := +space := $(empty) $(empty) +override D := $(subst $(comma),$(space),$(D)) + # Create the OUT directory and delete any previous intermediary files # $(shell mkdir -p $(OUT)) @@ -211,6 +219,19 @@ endif # require things like SGXCORE to be set ifneq ($(INTERNAL_CLOBBER_ONLY),true) +# These are defined by the core build system, but we might need them +# earlier to feature-check the compilers +# +_CC := $(if $(filter default,$(origin CC)),gcc,$(CC)) +_CLANG := \ + $(shell $(TOP)/eurasiacon/build/linux2/tools/cc-check.sh --clang --cc $(_CC)) +ifeq ($(_CLANG),true) +_CC := $(_CC) -target $(patsubst %-,%,$(CROSS_COMPILE)) +else +_CC := $(CROSS_COMPILE)$(_CC) +endif +HOST_CC ?= gcc + -include ../config/user-defs.mk # FIXME: Backwards compatibility remaps. @@ -273,21 +294,10 @@ override SUPPORT_HW_RECOVERY := 0 override SUPPORT_ACTIVE_POWER_MANAGEMENT := 0 endif -# We're bumping against USSE limits on older cores because the ukernel -# is too large when building both SGX_DISABLE_VISTEST_SUPPORT=0 and -# PVRSRV_USSE_EDM_STATUS_DEBUG=1. -# -# Automatically disable vistest support if debugging the ukernel to -# prevent build failures. -# -ifneq ($(filter 520 530 531 535 540,$(SGXCORE)),) -ifneq ($(SGX_DISABLE_VISTEST_SUPPORT),1) -SGX_DISABLE_VISTEST_SUPPORT ?= not-overridden -ifeq ($(SGX_DISABLE_VISTEST_SUPPORT),not-overridden) -$(warning Setting SGX_DISABLE_VISTEST_SUPPORT=1 because PVRSRV_USSE_EDM_STATUS_DEBUG=1) -SGX_DISABLE_VISTEST_SUPPORT := 1 -endif -endif +ifeq ($(SGX_FEATURE_36BIT_MMU),1) +override IMG_ADDRSPACE_PHYSADDR_BITS := 64 +else +override IMG_ADDRSPACE_PHYSADDR_BITS := 32 endif ifeq ($(SGXCORE),535) @@ -327,6 +337,11 @@ endif # PVRSRV_MODNAME ?= pvrsrvkm +# Normally builds don't touch this, but we use it to influence the components +# list. Make sure it is defined early enough to make this possible. +# +SUPPORT_PVRSRV_DEVICE_CLASS ?= 1 + # The user didn't set CROSS_COMPILE. There's probably nothing wrong # with that, but we'll let them know anyway. # @@ -345,19 +360,22 @@ $$(warning *** Setting $(1) via $$(origin $(1)) is deprecated) $$(error If you are trying to disable a component, use e.g. EXCLUDED_APIS="opengles1 opengl") endif endef -$(foreach _o,SYS_CFLAGS SYS_CXXFLAGS SYS_EXE_LDFLAGS SYS_LIB_LDFLAGS SUPPORT_EWS SUPPORT_OPENGLES1 SUPPORT_OPENGLES2 SUPPORT_OPENVG SUPPORT_OPENCL SUPPORT_OPENGL SUPPORT_UNITTESTS SUPPORT_XORG,$(eval $(call sanity-check-support-option-origin,$(_o)))) +$(foreach _o,SYS_CFLAGS SYS_CXXFLAGS SYS_INCLUDES SYS_EXE_LDFLAGS SYS_LIB_LDFLAGS SYS_EXE_LDFLAGS_CXX SYS_LIB_LDFLAGS_CXX SUPPORT_EWS SUPPORT_OPENGLES1 SUPPORT_OPENGLES2 SUPPORT_OPENCL SUPPORT_RSCOMPUTE SUPPORT_OPENGL SUPPORT_UNITTESTS SUPPORT_XORG,$(eval $(call sanity-check-support-option-origin,$(_o)))) # Check for words in EXCLUDED_APIS that aren't understood by the # common/apis/*.mk files. This should be kept in sync with all the tests on # EXCLUDED_APIS in those files -_excludable_apis := opencl opengl opengles1 opengles2 openvg ews unittests xorg xorg_unittests scripts -_unrecognised := $(strip $(filter-out $(_excludable_apis),$(EXCLUDED_APIS))) +_excludable_apis := rscompute opencl opengl opengles1 opengles2 openvg ews unittests xorg xorg_unittests scripts composerhal camerahal memtrackhal +_excluded_apis := $(subst $(comma),$(space),$(EXCLUDED_APIS)) +_unrecognised := $(strip $(filter-out $(_excludable_apis),$(_excluded_apis))) ifneq ($(_unrecognised),) $(warning *** Unrecognised entries in EXCLUDED_APIS: $(_unrecognised)) $(warning *** EXCLUDED_APIS was set via: $(origin EXCLUDED_APIS)) $(error Excludable APIs are: $(_excludable_apis)) endif +override EXCLUDED_APIS := $(filter $(_excludable_apis), $(_excluded_apis)) + # Build's selected list of components # -include components.mk @@ -380,8 +398,13 @@ ifneq ($(filter pvr2d,$(COMPONENTS)),) COMPONENTS += null_pvr2d_remote endif COMPONENTS += pvrvncsrv +COMPONENTS += pvrvncinput endif +$(if $(filter config,$(D)),$(info Build configuration:)) + +################################# CONFIG #################################### + # If KERNELDIR is set, write it out to the config.mk, with # KERNEL_COMPONENTS and KERNEL_ID # @@ -402,19 +425,54 @@ KERNEL_CROSS_COMPILE ?= $(CROSS_COMPILE) $(eval $(call TunableBothConfigMake,KERNEL_CROSS_COMPILE,)) endif -# Check the KERNELDIR has a kernel built and also check that it is -# not 64-bit, which we do not support. +# Check the KERNELDIR has a kernel built. VMLINUX := $(strip $(wildcard $(KERNELDIR)/vmlinux)) +LINUXCFG := $(strip $(wildcard $(KERNELDIR)/.config)) + ifneq ($(VMLINUX),) -VMLINUX_IS_64BIT := $(shell file $(VMLINUX) | grep -q 64-bit || echo false) +ifneq ($(shell file $(KERNELDIR)/vmlinux | grep 64-bit >/dev/null && echo 1),$(shell $(_CC) -dM -E - </dev/null | grep __x86_64__ >/dev/null && echo 1)) +$(error Attempting to build 64-bit DDK against 32-bit kernel, or 32-bit DDK against 64-bit kernel. This is not allowed.) +endif +VMLINUX_IS_64BIT := $(shell file $(VMLINUX) | grep 64-bit >/dev/null || echo false) +VMLINUX_HAS_PAE36 := $(shell cat $(LINUXCFG) | grep CONFIG_X86_PAE=y >/dev/null || echo false) +VMLINUX_HAS_PAE40 := $(shell cat $(LINUXCFG) | grep CONFIG_ARM_LPAE=y >/dev/null || echo false) +VMLINUX_HAS_DMA32 := $(shell cat $(LINUXCFG) | grep CONFIG_ZONE_DMA32=y >/dev/null || echo false) + +# $(error 64BIT=$(VMLINUX_IS_64BIT) PAE36=$(VMLINUX_HAS_PAE36) PAE40=$(VMLINUX_HAS_PAE40) DMA32=$(VMLINUX_HAS_DMA32) MMU36=$(SGX_FEATURE_36BIT_MMU)) + ifneq ($(VMLINUX_IS_64BIT),false) -$(warning $$(KERNELDIR)/vmlinux is 64-bit, which is not supported. Kbuild may fail.) +$(warning $$(KERNELDIR)/vmlinux: Note: vmlinux is 64-bit, which is supported but currently experimental.) endif else $(warning $$(KERNELDIR)/vmlinux does not exist. Kbuild may fail.) endif endif +ifneq ($(VMLINUX_HAS_PAE40),false) +ifeq ($(VMLINUX_HAS_DMA32),false) +$(warning SGX MMUs are currently supported up to only 36 bits max. Your Kernel is built with 40-bit PAE but does not have CONFIG_ZONE_DMA32.) +$(warning This means you must ensure the runtime system has <= 4GB of RAM, or there will be BIG problems...) +endif +endif + +ifneq ($(SGX_FEATURE_36BIT_MMU),1) +ifneq ($(VMLINUX_IS_64BIT),false) +# Kernel is 64-bit +ifeq ($(VMLINUX_HAS_DMA32),false) +$(warning SGX is configured with 32-bit MMU. Your Kernel is 64-bit but does not have CONFIG_ZONE_DMA32.) +$(warning This means you must ensure the runtime system has <= 4GB of RAM, or there will be BIG problems...) +endif +else + # Kernel is 32-bit +ifneq ($(VMLINUX_HAS_PAE36),false) +ifeq ($(VMLINUX_HAS_DMA32),false) +$(warning SGX is configured with 32-bit MMU. Your Kernel is 32-bit PAE, but does not have CONFIG_ZONE_DMA32. ) +$(warning This means you must ensure the runtime system has <= 4GB of RAM, or there will be BIG problems...) +endif +endif +endif +endif + # Ideally configured by platform Makefiles, as necessary # @@ -438,10 +496,17 @@ $(eval $(call TunableBothConfigC,USE_SGX_CORE_REV_HEAD,)) $(eval $(call BothConfigC,TRANSFER_QUEUE,)) $(eval $(call BothConfigC,PVR_SECURE_HANDLES,)) +# Support syncing LISR & MISR. This is required for OS's where +# on SPM platforms the LISR and MISR can run at the same time and +# thus during powerdown we need to drain all pending LISRs before +# proceeding to do the actual powerdown +$(eval $(call KernelConfigC,SUPPORT_LISR_MISR_SYNC)) + ifneq ($(DISPLAY_CONTROLLER),) $(eval $(call BothConfigC,DISPLAY_CONTROLLER,$(DISPLAY_CONTROLLER))) endif +ifneq ($(strip $(KERNELDIR)),) PVR_LINUX_MEM_AREA_POOL_MAX_PAGES ?= 0 ifneq ($(PVR_LINUX_MEM_AREA_POOL_MAX_PAGES),0) PVR_LINUX_MEM_AREA_USE_VMAP ?= 1 @@ -453,6 +518,7 @@ endif $(eval $(call KernelConfigC,PVR_LINUX_MEM_AREA_POOL_MAX_PAGES,$(PVR_LINUX_MEM_AREA_POOL_MAX_PAGES))) $(eval $(call TunableKernelConfigC,PVR_LINUX_MEM_AREA_USE_VMAP,)) $(eval $(call TunableKernelConfigC,PVR_LINUX_MEM_AREA_POOL_ALLOW_SHRINK,)) +endif $(eval $(call BothConfigMake,PVR_SYSTEM,$(PVR_SYSTEM))) @@ -499,10 +565,10 @@ $(eval $(call TunableBothConfigC,SGX_FEATURE_MP,)) $(eval $(call TunableBothConfigC,SGX_FEATURE_MP_PLUS,)) $(eval $(call TunableBothConfigC,FPGA,)) $(eval $(call TunableBothConfigC,PDUMP,)) +$(eval $(call TunableBothConfigC,MEM_TRACK_INFO_DEBUG,)) $(eval $(call TunableBothConfigC,NO_HARDWARE,)) $(eval $(call TunableBothConfigC,PDUMP_DEBUG_OUTFILES,)) $(eval $(call TunableBothConfigC,PVRSRV_USSE_EDM_STATUS_DEBUG,)) -$(eval $(call TunableBothConfigC,SGX_DISABLE_VISTEST_SUPPORT,)) $(eval $(call TunableBothConfigC,PVRSRV_RESET_ON_HWTIMEOUT,)) $(eval $(call TunableBothConfigC,SYS_USING_INTERRUPTS,1)) $(eval $(call TunableBothConfigC,SUPPORT_EXTERNAL_SYSTEM_CACHE,)) @@ -513,8 +579,13 @@ $(eval $(call TunableBothConfigC,PVRSRV_NEED_PVR_TRACE,)) $(eval $(call TunableBothConfigC,SUPPORT_SECURE_33657_FIX,)) $(eval $(call TunableBothConfigC,SUPPORT_ION,)) $(eval $(call TunableBothConfigC,SUPPORT_HWRECOVERY_TRACE_LIMIT,)) +$(eval $(call TunableBothConfigC,SUPPORT_PVRSRV_DEVICE_CLASS,)) $(eval $(call TunableBothConfigC,SUPPORT_PVRSRV_GET_DC_SYSTEM_BUFFER,1)) $(eval $(call TunableBothConfigC,SUPPORT_NV12_FROM_2_HWADDRS,)) +$(eval $(call TunableBothConfigC,SGX_FEATURE_36BIT_MMU,)) +$(eval $(call TunableBothConfigC,IMG_ADDRSPACE_PHYSADDR_BITS,)) +$(eval $(call TunableBothConfigC,PVRSRV_EXTRA_PB_DEBUG,)) +$(eval $(call TunableBothConfigC,PVRSRV_DEBUG_CCB_MAX,)) $(eval $(call TunableKernelConfigC,SUPPORT_LINUX_X86_WRITECOMBINE,1)) $(eval $(call TunableKernelConfigC,SUPPORT_LINUX_X86_PAT,1)) @@ -537,20 +608,18 @@ $(eval $(call TunableKernelConfigC,PVRSRV_REFCOUNT_DEBUG,)) $(eval $(call TunableKernelConfigC,PVRSRV_MMU_MAKE_READWRITE_ON_DEMAND,)) $(eval $(call TunableKernelConfigC,HYBRID_SHARED_PB_SIZE,)) $(eval $(call TunableKernelConfigC,SUPPORT_LARGE_GENERAL_HEAP,)) +$(eval $(call TunableKernelConfigC,SUPPORT_OLD_ION_API,)) $(eval $(call TunableKernelConfigC,TTRACE,)) +$(eval $(call TunableKernelConfigC,TTRACE_LARGE_BUFFER,)) +$(eval $(call TunableKernelConfigC,SUPPORT_PDUMP_SYNC_DEBUG,)) +$(eval $(call TunableKernelConfigC,SUPPORT_PER_SYNC_DEBUG,)) +$(eval $(call TunableKernelConfigC,SUPPORT_FORCE_SYNC_DUMP,)) -ifeq ($(BUILD),debug) -$(eval $(call TunableKernelConfigC,CONFIG_PVR_PROC_FS,1)) -else -$(eval $(call TunableKernelConfigC,CONFIG_PVR_PROC_FS,)) -endif - -$(eval $(call TunableKernelConfigC,CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG,)) - -$(eval $(call TunableBothConfigMake,SUPPORT_ION,)) $(eval $(call TunableBothConfigMake,OPTIM,)) +$(eval $(call TunableBothConfigMake,SUPPORT_ION,)) +$(eval $(call TunableBothConfigMake,SUPPORT_PVRSRV_DEVICE_CLASS,)) $(eval $(call TunableKernelConfigMake,TTRACE,)) diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/defs.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/defs.mk index 621e03e..dee740f 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/defs.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/defs.mk @@ -104,6 +104,10 @@ define cc-is-64bit $(call cc-check,$(1),$(OUT),--64) endef +define cc-is-clang +$(call cc-check,$(patsubst @%,%,$(CC)),$(OUT),--clang) +endef + define cc-option $(call cc-check,$(patsubst @%,%,$(CC)),$(OUT),$(1)) endef @@ -116,6 +120,10 @@ define host-cc-option $(call cc-check,$(patsubst @%,%,$(HOST_CC)),$(OUT),$(1)) endef +define host-cxx-option +$(call cc-check,$(patsubst @%,%,$(HOST_CXX)),$(OUT),$(1)) +endef + define kernel-cc-option $(call cc-check,$(KERNEL_CROSS_COMPILE)gcc,$(OUT),$(1)) endef diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/kbuild/Makefile.template b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/kbuild/Makefile.template index 9d88941..2b49f50 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/kbuild/Makefile.template +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/kbuild/Makefile.template @@ -65,7 +65,6 @@ $(OUT)/target/kbuild/%.c: $(TOP)/%.c @if [ ! -h $@ ]; then ln -sf $< $@; fi ccflags-y += -D__linux__ -include $(OUT)/config_kernel.h \ - -DDEBUG_LOG_PATH_TRUNCATE="\"$(OUT)/target/kbuild\"" \ -I$(OUT)/include \ -I$(TOP)/include4 \ -I$(TOP)/services4/include \ @@ -86,7 +85,7 @@ endif include $(INTERNAL_KBUILD_MAKEFILES) -$(if $(pvrsrvkm_sgx$(SGXCORE)_$(SGX_CORE_REV)-y),,$(error pvrsrvkm_sgx$(SGXCORE)_$(SGX_CORE_REV)-y was empty, which could mean that srvkm is missing from $$(KERNEL_COMPONENTS))) +$(if $(pvrsrvkm-y),,$(error pvrsrvkm-y was empty, which could mean that srvkm is missing from $$(KERNEL_COMPONENTS))) pvrsrvkm-y += $(foreach _m,$(INTERNAL_EXTRA_KBUILD_OBJECTS:.o=),$($(_m)-y)) obj-m += $(INTERNAL_KBUILD_OBJECTS) diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/kbuild/kbuild.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/kbuild/kbuild.mk index 94e2100..63542f0 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/kbuild/kbuild.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/kbuild/kbuild.mk @@ -58,7 +58,7 @@ kbuild: $(TARGET_OUT)/kbuild/Makefile INTERNAL_KBUILD_OBJECTS="$(INTERNAL_KBUILD_OBJECTS)" \ INTERNAL_EXTRA_KBUILD_OBJECTS="$(INTERNAL_EXTRA_KBUILD_OBJECTS)" \ EXTRA_KBUILD_SOURCE="$(EXTRA_KBUILD_SOURCE)" \ - CROSS_COMPILE="$(KERNEL_CROSS_COMPILE)" \ + CROSS_COMPILE="$(CCACHE) $(KERNEL_CROSS_COMPILE)" \ EXTRA_CFLAGS="$(ALL_KBUILD_CFLAGS)" \ V=$(V) W=$(W) \ TOP=$(TOP) @@ -72,7 +72,7 @@ kbuild_clean: $(TARGET_OUT)/kbuild/Makefile INTERNAL_KBUILD_OBJECTS="$(INTERNAL_KBUILD_OBJECTS)" \ INTERNAL_EXTRA_KBUILD_OBJECTS="$(INTERNAL_EXTRA_KBUILD_OBJECTS)" \ EXTRA_KBUILD_SOURCE="$(EXTRA_KBUILD_SOURCE)" \ - CROSS_COMPILE="$(KERNEL_CROSS_COMPILE)" \ + CROSS_COMPILE="$(CCACHE) $(KERNEL_CROSS_COMPILE)" \ EXTRA_CFLAGS="$(ALL_KBUILD_CFLAGS)" \ V=$(V) W=$(W) \ TOP=$(TOP) clean @@ -84,7 +84,7 @@ kbuild_install: $(TARGET_OUT)/kbuild/Makefile INTERNAL_KBUILD_OBJECTS="$(INTERNAL_KBUILD_OBJECTS)" \ INTERNAL_EXTRA_KBUILD_OBJECTS="$(INTERNAL_EXTRA_KBUILD_OBJECTS)" \ EXTRA_KBUILD_SOURCE="$(EXTRA_KBUILD_SOURCE)" \ - CROSS_COMPILE="$(KERNEL_CROSS_COMPILE)" \ + CROSS_COMPILE="$(CCACHE) $(KERNEL_CROSS_COMPILE)" \ EXTRA_CFLAGS="$(ALL_KBUILD_CFLAGS)" \ INSTALL_MOD_PATH="$(DISCIMAGE)" \ V=$(V) W=$(W) \ diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/moduledefs.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/moduledefs.mk index 869026f..ef4596c 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/moduledefs.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/moduledefs.mk @@ -48,20 +48,47 @@ MODULE_HOST_LDFLAGS := $(ALL_HOST_LDFLAGS) $($(THIS_MODULE)_ldflags) MODULE_BISON_FLAGS := $(ALL_BISON_FLAGS) $($(THIS_MODULE)_bisonflags) MODULE_FLEX_FLAGS := $(ALL_FLEX_FLAGS) $($(THIS_MODULE)_flexflags) -# -L flags for library search dirs +ifneq ($(BUILD),debug) +ifeq ($(USE_LTO),1) +MODULE_HOST_LDFLAGS := \ + $(sort $(filter-out -W% -D%,$(ALL_HOST_CFLAGS) $(ALL_HOST_CXXFLAGS))) \ + $(MODULE_HOST_LDFLAGS) +MODULE_LDFLAGS := \ + $(sort $(filter-out -W% -D%,$(ALL_CFLAGS) $(ALL_CXXFLAGS))) \ + $(MODULE_LDFLAGS) +endif +endif + +# Only allow cflags that do not affect code generation. This is to ensure +# proper binary compatibility when LTO (Link-Time Optimization) is enabled. +# We make exceptions for -fPIC, -fPIE and -m32 which will all fail linkage +# in non-LTO mode if incorrectly specified. +# +# NOTE: Only used by static_library and objects right now. Other module +# types should not be affected by complex code generation flags w/ LTO. +MODULE_ALLOWED_CFLAGS := -W% -D% -std=% -fPIC -fPIE -m32 + +# -L flags for library search dirs: these are relative to $(TOP), unless +# they're absolute paths MODULE_LIBRARY_DIR_FLAGS := $(foreach _path,$($(THIS_MODULE)_libpaths),$(if $(filter /%,$(_path)),-L$(call relative-to-top,$(_path)),-L$(_path))) -# -I flags for header search dirs +# -I flags for header search dirs (same rules as for -L) MODULE_INCLUDE_FLAGS := $(foreach _path,$($(THIS_MODULE)_includes),$(if $(filter /%,$(_path)),-I$(call relative-to-top,$(_path)),-I$(_path))) # Variables used to differentiate between host/target builds MODULE_OUT := $(if $(MODULE_HOST_BUILD),$(HOST_OUT),$(TARGET_OUT)) +# For documentation modules, this variable is overridden by the module type +# makefile to place the intermediates in $(DOCS_OUT)/intermediates. MODULE_INTERMEDIATES_DIR := $(if $(MODULE_HOST_BUILD),$(HOST_INTERMEDIATES)/$(THIS_MODULE),$(TARGET_INTERMEDIATES)/$(THIS_MODULE)) .SECONDARY: $(MODULE_INTERMEDIATES_DIR) $(MODULE_INTERMEDIATES_DIR): $(make-directory) +# These are used for messages and variable names where we need to say "host" +# or "target" according to the module build type. Host_or_target := $(if $(MODULE_HOST_BUILD),Host,Target) +host_or_target := $(if $(MODULE_HOST_BUILD),host,target) +HOST_OR_TARGET := $(if $(MODULE_HOST_BUILD),HOST,TARGET) # These define the rules for finding source files. # - If a name begins with a slash, we strip $(TOP) off the front if it begins @@ -77,18 +104,26 @@ _SOURCES_WITHOUT_SLASH := $(strip $(foreach _s,$($(THIS_MODULE)_src),$(if $(find _SOURCES_WITH_SLASH := $(strip $(foreach _s,$($(THIS_MODULE)_src),$(if $(findstring /,$(_s)),$(_s),))) MODULE_SOURCES := $(addprefix $(THIS_DIR)/,$(_SOURCES_WITHOUT_SLASH)) MODULE_SOURCES += $(call relative-to-top,$(filter /%,$(_SOURCES_WITH_SLASH))) + _RELATIVE_SOURCES_WITH_SLASH := $(filter-out /%,$(_SOURCES_WITH_SLASH)) _OUTDIR_RELATIVE_SOURCES_WITH_SLASH := $(filter $(RELATIVE_OUT)/%,$(_RELATIVE_SOURCES_WITH_SLASH)) _THISDIR_RELATIVE_SOURCES_WITH_SLASH := $(filter-out $(RELATIVE_OUT)/%,$(_RELATIVE_SOURCES_WITH_SLASH)) MODULE_SOURCES += $(_OUTDIR_RELATIVE_SOURCES_WITH_SLASH) MODULE_SOURCES += $(addprefix $(THIS_DIR)/,$(_THISDIR_RELATIVE_SOURCES_WITH_SLASH)) + +# Generated sources and headers. We use $(MODULE_OUT) because it encourages +# correctly marking modules which generate headers as host/target. MODULE_SOURCES += $(addprefix $(MODULE_OUT)/intermediates/,$($(THIS_MODULE)_gensrc)) MODULE_GENERATED_HEADERS := $(addprefix $(MODULE_OUT)/intermediates/,$($(THIS_MODULE)_genheaders)) -# -l flags for each library +# -l flags for each library. The rules are: +# - for all static libs, use -lfoo +# - for all in-tree or external libs, use $(libfoo_ldflags) if that +# variable is defined (empty counts as defined). Otherwise use +# -lfoo. MODULE_LIBRARY_FLAGS := $(addprefix -l, $($(THIS_MODULE)_staticlibs)) $(addprefix -l,$($(THIS_MODULE)_libs)) $(foreach _lib,$($(THIS_MODULE)_extlibs),$(if $(filter undefined,$(origin lib$(_lib)_ldflags)),-l$(_lib),$(lib$(_lib)_ldflags))) -# pkg-config integration; primarily used by X.org +# pkg-config integration; primarily used by X.Org # FIXME: We don't support arbitrary CFLAGS yet (just includes) $(foreach _package,$($(THIS_MODULE)_packages),\ $(eval MODULE_INCLUDE_FLAGS += `pkg-config --cflags-only-I $(_package)`)\ diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap4430_android/Makefile b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap4430_android/Makefile index 45cdb6f..0d9ba11 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap4430_android/Makefile +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap4430_android/Makefile @@ -67,7 +67,7 @@ endif export SGXCORE export SGX_CORE_REV -SUPPORT_ACTIVE_POWER_MANAGEMENT := 1 +SUPPORT_ACTIVE_POWER_MANAGEMENT := 0 SGX_DYNAMIC_TIMING_INFO := 1 diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap_android/Makefile b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap_android/Makefile new file mode 100644 index 0000000..35d9fd1 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap_android/Makefile @@ -0,0 +1,221 @@ +########################################################################### ### +#@Title Root makefile for omap4430 Android. Builds everything else. +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### + +# If a TARGET_PRODUCT is specified but not a TARGET_DEVICE, try to +# derive the TARGET_DEVICE from TARGET_PRODUCT. +# +ifeq ($(TARGET_DEVICE),) +override TARGET_DEVICE := \ + $(patsubst mini_%,%,$(patsubst full_%,%,$(TARGET_PRODUCT))) +endif + +ifeq ($(TARGET_DEVICE),) +override TARGET_DEVICE := jacinto6evm +endif + +# Customize this build as per the TARGET_DEVICE setting +# +ifneq ($(filter blaze blaze_tablet panda tuna maguro toro mysid yakju,$(TARGET_DEVICE)),) +SGXCORE := 540 +SGX_CORE_REV := 120 +HAL_VARIANT := omap4 +endif +ifneq ($(filter blaze.4470 blaze_tablet.4470,$(TARGET_DEVICE)),) +SGXCORE := 544 +SGX_CORE_REV := 112 +HAL_VARIANT := omap4 +endif +ifneq ($(filter jacinto6evm omap5sevm panda5,$(TARGET_DEVICE)),) +SGXCORE := 544 +SGX_CORE_REV := 116 +SGX_FEATURE_MP := 1 +SGX_FEATURE_SYSTEM_CACHE := 1 +SGX_FEATURE_MP_CORE_COUNT := 2 +HAL_VARIANT := jacinto6 + +# OMAP Product Version +VS_PRODUCT_VERSION := 5 + +# FIXME: Re-enable this ASAP +SUPPORT_ACTIVE_POWER_MANAGEMENT := 0 +endif + +# Handle any TARGET_DEVICE remapping. Not all DDK TARGET_DEVICEs +# require new Android TARGET_DEVICE builds. +# +ifeq ($(TARGET_DEVICE),blaze.4470) +override TARGET_DEVICE := blaze +endif +ifeq ($(TARGET_DEVICE),blaze_tablet.4470) +override TARGET_DEVICE := blaze_tablet +endif + +SGX_DYNAMIC_TIMING_INFO := 1 + +SUPPORT_LINUX_USING_WORKQUEUES := 1 + +SUPPORT_PVRSRV_ANDROID_SYSTRACE := 0 + +ifneq ($(SUPPORT_PVRSRV_DEVICE_CLASS),0) +#DISPLAY_CONTROLLER := omaplfb +endif + +PVR_SYSTEM := omap + +KERNEL_CROSS_COMPILE ?= arm-none-linux-gnueabi- + +# We have more memory on OMAP platforms, so we can spare to make the +# pool larger, and have higher resolutions which benefit from it. +# +PVR_LINUX_MEM_AREA_POOL_MAX_PAGES ?= 10800 + +include ../common/android/paths.mk +include ../common/android/armv7-a.mk +include ../common/android/features.mk + +ifneq ($(strip $(KERNELDIR)),) + include ../kernel_version.mk + ifeq ($(call kernel-version-at-least,2,6,35),true) + PVR_NO_OMAP_TIMER := 1 + endif + ifeq ($(call kernel-version-at-least,2,6,39),true) + ifeq ($(LDM_PLATFORM),1) + PVR_LDM_PLATFORM_PRE_REGISTERED := 1 + PVR_LDM_PLATFORM_PRE_REGISTERED_DEV := "\"pvrsrvkm\"" + endif + endif + ifeq ($(call kernel-version-at-least,3,0),true) + SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED := 1 + SYS_OMAP_HAS_DVFS_FRAMEWORK := 1 + endif +else + $(warning "KERNELDIR is not set, so can't feature check DVFS or dsscomp.") + $(warning "Assuming we want DVFS and dsscomp support.") + SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED := 1 + SYS_OMAP_HAS_DVFS_FRAMEWORK := 1 +endif + +ifneq ($(LDM_PLATFORM),1) +SUPPORT_LINUX_USING_WORKQUEUES := 0 +SUPPORT_LINUX_USING_SHARED_WORKQUEUES := 1 +SUPPORT_ACTIVE_POWER_MANAGEMENT := 0 +ifneq ($(SUPPORT_PVRSRV_DEVICE_CLASS),0) +DISPLAY_CONTROLLER := pvrlfb +DISPLAY_CONTROLLER_COMPONENT := linux_framebuffer +OMAP_NON_FLIP_DISPLAY := 1 +endif +else # LDM_PLATFORM != 1 +ifneq ($(SUPPORT_PVRSRV_DEVICE_CLASS),0) +#DISPLAY_CONTROLLER_COMPONENT := dc_omapfb3_linux +endif +endif # LDM_PLATFORM != 1 + +ifeq ($(SUPPORT_DRI_DRM),1) +ifeq ($(PVR_LDM_PLATFORM_PRE_REGISTERED),1) +PVR_DRI_DRM_PLATFORM_DEV := 1 +PVR_DRI_DRM_STATIC_BUS_ID := 1 +PVR_DRI_DRM_DEV_BUS_ID := "\"platform:pvrsrvkm"\" +else +PVR_DRI_DRM_NOT_PCI := 1 +KERNEL_COMPONENTS += linux_drm +endif +ifneq ($(SUPPORT_PVRSRV_DEVICE_CLASS),0) +EXTRA_PVRSRVKM_COMPONENTS += $(DISPLAY_CONTROLLER_COMPONENT) +endif +EXTRA_KBUILD_SOURCE := $(KERNELDIR) +# FIXME: Only required for comparison with X's KM +PVR_SECURE_DRM_AUTH_EXPORT := 1 +ifneq ($(OMAP_NON_FLIP_DISPLAY),1) +PVR_DISPLAY_CONTROLLER_DRM_IOCTL := 1 +endif +else # SUPPORT_DRI_DRM == 1 +ifneq ($(SUPPORT_PVRSRV_DEVICE_CLASS),0) +KERNEL_COMPONENTS += $(DISPLAY_CONTROLLER_COMPONENT) +endif +endif # SUPPORT_DRI_DRM == 1 + +SUPPORT_ANDROID_OMAP_NV12 := 1 + +PVR_ANDROID_USE_WINDOW_TRANSFORM_HINT := 1 + +PVR_ANDROID_PLATFORM_HAS_LINUX_FBDEV := 1 + +# Handle Google's OMAP-based products +# +ifneq ($(filter tuna maguro toro mysid yakju,$(TARGET_DEVICE)),) +# These default on in tuna_defconfig +PVRSRV_USSE_EDM_STATUS_DEBUG ?= 1 +PVRSRV_DUMP_MK_TRACE ?= 1 +# Go back to the old compiler for tuna kernel modules +KERNEL_CROSS_COMPILE := arm-eabi- +endif + +ifeq ($(NO_HARDWARE),1) +ifeq ($(SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED),1) +$(info WARNING: SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED=1 is incompatible with NO_HARDWARE=1) +$(info WARNING: Setting SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED=0 and switching to dc_nohw) +override SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED := 0 +ifneq ($(SUPPORT_PVRSRV_DEVICE_CLASS),0) +override DISPLAY_CONTROLLER := dcnohw +KERNEL_COMPONENTS += dc_nohw +endif +endif # SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED == 1 +endif # NO_HARDWARE == 1 + +include ../config/core.mk +include ../common/android/extra_config.mk +include ../common/dridrm.mk +include ../common/opencl.mk +include ../common/omap4.mk + +# Not all OMAP kernels have a compatible DVFS framework +# +$(eval $(call TunableKernelConfigC,SYS_OMAP_HAS_DVFS_FRAMEWORK,)) + +# If set, services allows two flips to enter the processing queue, +# and does not add read dependencies to the set of buffers last +# flipped to. This is necessary for DSS composition on OMAP. +# +$(eval $(call TunableKernelConfigC,SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED,)) + +# On OMAP a TILER-specific NV12 format is supported. +# +$(eval $(call TunableUserConfigMake,SUPPORT_ANDROID_OMAP_NV12,)) diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap_linux/Makefile b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap_linux/Makefile new file mode 100644 index 0000000..8a65e7d --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/omap_linux/Makefile @@ -0,0 +1,261 @@ +########################################################################### ### +#@Title Root makefile for OMAP4430 Linux. Builds everything else. +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### + +# If a product wasn't specified, we're an OMAP4430 blaze. +# +TARGET_PRODUCT ?= jacinto6evm + +# Customize this build as per the TARGET_PRODUCT setting +# +ifneq ($(filter blaze blaze_tablet panda,$(TARGET_PRODUCT)),) +SGXCORE := 540 +SGX_CORE_REV := 120 +endif +ifneq ($(filter blaze.4470 blaze_tablet.4470,$(TARGET_PRODUCT)),) +SGXCORE := 544 +SGX_CORE_REV := 112 +endif +ifneq ($(filter omap5sevm panda5,$(TARGET_PRODUCT)),) +SGXCORE := 544 +SGX_CORE_REV := 105 +SGX_FEATURE_MP := 1 +SGX_FEATURE_SYSTEM_CACHE := 1 +SGX_FEATURE_MP_CORE_COUNT := 2 +PVR_OMAPLFB_DRM_FB := 0 +SYS_OMAP_HAS_DVFS_FRAMEWORK := 1 + +# OMAP Product Version +VS_PRODUCT_VERSION := 5 + +# FIXME: Re-enable this ASAP +SUPPORT_ACTIVE_POWER_MANAGEMENT := 0 +endif +ifneq ($(filter jacinto6evm omap5uevm,$(TARGET_PRODUCT)),) +SGXCORE := 544 +SGX_CORE_REV := 116 +SGX_FEATURE_MP := 1 +SGX_FEATURE_SYSTEM_CACHE := 1 +SGX_FEATURE_MP_CORE_COUNT := 2 + +SYS_OMAP5_UEVM := 1 + +# OMAP Product Version +VS_PRODUCT_VERSION := 5 +endif + +PVR_SYSTEM := omap + +KERNEL_COMPONENTS := srvkm bufferclass_example + +SUPPORT_OLD_ION_API := 1 + +include ../kernel_version.mk + +# Only enable active power management if passive power management is +# enabled, as indicated by LDM_PLATFORM being set to 1. On OMAP, +# the system can suspend in the case where active power management is +# enabled in the SGX driver, but passive power management isn't. As +# passive power management isn't enabled, the driver won't see the +# system suspend/resume events, and so won't take appropriate action. +LDM_PLATFORM ?= 1 + +ifeq ($(LDM_PLATFORM),1) +SUPPORT_LINUX_USING_WORKQUEUES := 1 +DISPLAY_CONTROLLER_COMPONENT += dc_omapfb3_linux +DISPLAY_CONTROLLER := omaplfb +else +SUPPORT_LINUX_USING_SHARED_WORKQUEUES := 1 +OMAP_NON_FLIP_DISPLAY := 1 +DISPLAY_CONTROLLER_COMPONENT += linux_framebuffer +DISPLAY_CONTROLLER := pvrlfb +endif + +SYS_CFLAGS := -march=armv7-a + +UBUNTU_TOOLCHAIN := +ifeq ($(CROSS_COMPILE),) +UBUNTU_TOOLCHAIN = 1 +endif +ifeq ($(CROSS_COMPILE),arm-linux-gnueabi-) +UBUNTU_TOOLCHAIN = 1 +endif +ifeq ($(CROSS_COMPILE),arm-linux-gnueabihf-) +UBUNTU_TOOLCHAIN = 1 +endif + +ifeq ($(UBUNTU_TOOLCHAIN),) +OPTIM := -Os + +ifneq ($(CROSS_COMPILE),) +SYS_CFLAGS += -mtls-dialect=arm +endif + +SUPPORT_OMAP4430_NEON ?= 1 + +ifeq ($(SUPPORT_OMAP4430_NEON),1) +SYS_CFLAGS += -ftree-vectorize -mfpu=neon -mfloat-abi=softfp +endif +endif # UBUNTU_TOOLCHAIN + +LIBGCC := $(shell $(CROSS_COMPILE)gcc -print-libgcc-file-name) + +SGX_DYNAMIC_TIMING_INFO := 1 +SYS_CUSTOM_POWERLOCK_WRAP := 1 + +ifeq ($(OMAP_NON_FLIP_DISPLAY),1) +OPK_DEFAULT := libpvrPVR2D_BLITWSEGL.so +else +OPK_DEFAULT := libpvrPVR2D_FLIPWSEGL.so +endif + +ifeq ($(SYS_OMAP5_UEVM),1) +PVR_LDM_PLATFORM_PRE_REGISTERED := 1 +PVR_LDM_PLATFORM_PRE_REGISTERED_DEV := "\"omapdrm_pvr\"" +XORG_EXPLICIT_PVR_SERVICES_LOAD := 1 +PVR_OMAPLFB_DRM_FB := 0 +PVR_OMAPLFB_DONT_USE_FB_PAN_DISPLAY := 1 +else +ifeq ($(call kernel-version-at-least,2,6,35),true) +# Work around flipping problems seen with the Taal LCDs on Blaze. +# The work around is safe to use with other types of screen on Blaze +# (e.g. HDMI) and on other platforms (e.g. Panda board). +PVR_OMAPLFB_DONT_USE_FB_PAN_DISPLAY := 1 +ifeq ($(LDM_PLATFORM),1) +PVR_LDM_PLATFORM_PRE_REGISTERED := 1 +ifeq ($(call kernel-version-at-least,2,6,35,7),true) +# Not all variants of the OMAP4 kernel have a DRM based framebuffer. +# Note that a non-X.Org version of the driver does not have to be built +# with DRM support if the kernel has a DRM based framebuffer. +PVR_OMAPLFB_DRM_FB ?= 1 +ifeq ($(PVR_OMAPLFB_DRM_FB),1) +PVR_LDM_PLATFORM_PRE_REGISTERED_DEV := "\"pvrsrvkm_pvr\"" +# There is already a "pvrsrvkm" driver (part of the DRM framebuffer code), +# so use the pre-registered device name instead. +PVR_LDM_DRIVER_REGISTRATION_NAME := "\"pvrsrvkm_pvr"\" +# The DRM library will not load the Services module on behalf of the X Server, +# as a DRM module has already been loaded (the DRM based framebuffer), so +# load the Services module before starting the X Server. +XORG_EXPLICIT_PVR_SERVICES_LOAD := 1 +else +PVR_LDM_PLATFORM_PRE_REGISTERED_DEV := "\"pvrsrvkm\"" +endif +endif +endif +endif +endif + +include ../common/xorg_test.mk +ifeq ($(SUPPORT_BUILD_XORG),1) +SUPPORT_DRI_DRM := 1 +endif + +ifeq ($(SUPPORT_DRI_DRM),1) +ifeq ($(SYS_OMAP5_UEVM),1) +PVR_DRI_DRM_PLATFORM_DEV := 1 +PVR_DRI_DRM_STATIC_BUS_ID := 1 +PVR_DRI_DRM_DEV_BUS_ID := "\"platform:omapdrm_pvr:00"\" +else +ifeq ($(call kernel-version-at-least,2,6,35),true) +PVR_DRI_DRM_PLATFORM_DEV := 1 +PVR_DRI_DRM_STATIC_BUS_ID := 1 +ifeq ($(call kernel-version-at-least,2,6,35,7),true) +ifeq ($(PVR_OMAPLFB_DRM_FB),1) +SUPPORT_DRI_DRM_PLUGIN := 1 +endif +ifeq ($(call kernel-version-at-least,2,6,36),true) +PVR_DRI_DRM_DEV_BUS_ID := "\"platform:pvrsrvkm"\" +else +PVR_DRI_DRM_DEV_BUS_ID := "\"platform:pvrsrvkm:00"\" +endif # kernel-version-at-least,2,6,36 +endif # kernel-version-at-least,2,6,35,7 +else # kernel-version-at-least,2,6,35 +PVR_DRI_DRM_NOT_PCI := 1 +endif # kernel-version-at-least,2,6,35 +endif # ($(SYS_OMAP5_UEVM),1) +endif # SUPPORT_DRI_DRM + +ifeq ($(SUPPORT_BUILD_XORG),1) +ifeq ($(call kernel-version-at-least,2,6,35,7),true) +# A client DRI authorisation failure, whilst switched away from the X Server +# VT, prevents all other attempts at DRI authorisation, even after +# switching back to the X server VT, so don't perform a DRM drop master +# call. +PVR_XORG_DONT_DROP_MASTER_IN_LEAVE_VT := 1 +endif +XORG_PVR_VIDEO ?= omap4 + +OPK_FALLBACK := libpvrPVR2D_DRIWSEGL.so + +ifneq ($(OMAP_NON_FLIP_DISPLAY),1) +PVR_DISPLAY_CONTROLLER_DRM_IOCTL := 1 +endif + +else # xorg isn't excluded + +OPK_FALLBACK := libpvrPVR2D_BLITWSEGL.so + +endif # xorg isn't excluded + +ifeq ($(SUPPORT_DRI_DRM),1) +ifeq ($(PVR_DRI_DRM_NOT_PCI),1) +KERNEL_COMPONENTS += linux_drm +EXTRA_KBUILD_SOURCE := $(KERNELDIR) +endif +EXTRA_PVRSRVKM_COMPONENTS += $(DISPLAY_CONTROLLER_COMPONENT) +else +KERNEL_COMPONENTS += $(DISPLAY_CONTROLLER_COMPONENT) +endif + +include ../config/core.mk +include ../common/xorg.mk +include ../common/dridrm.mk +include ../common/opencl.mk +include ../common/omap4.mk + +# We only need this for pvr_video's includes, which should +# really be done differently, as DISPLAY_CONTROLLER_DIR is +# now obsolete.. +# +$(eval $(call UserConfigMake,DISPLAY_CONTROLLER_DIR,3rdparty/$(DISPLAY_CONTROLLER_COMPONENT))) + +$(eval $(call TunableKernelConfigC,SYS_OMAP5_UEVM,)) + +$(eval $(call TunableKernelConfigC,SYS_OMAP_HAS_DVFS_FRAMEWORK,)) diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/prepare_tree.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/prepare_tree.mk index 05e4fe3..75dcca6 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/prepare_tree.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/prepare_tree.mk @@ -40,10 +40,6 @@ .PHONY: prepare_tree --include eurasiacon/build/linux2/kbuild/external_tarball.mk - -# If there's no external tarball, there's nothing to do -# prepare_tree: INTERNAL_INCLUDED_PREPARE_HEADERS := diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/sunxi_android/Makefile b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/sunxi_android/Makefile new file mode 100644 index 0000000..4473d62 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/sunxi_android/Makefile @@ -0,0 +1,123 @@ +########################################################################### ### +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### + +# If a TARGET_PRODUCT is specified but not a TARGET_DEVICE, try to +# derive the TARGET_DEVICE from TARGET_PRODUCT. +# +ifeq ($(TARGET_DEVICE),) +override TARGET_DEVICE := \ + $(patsubst mini_%,%,$(patsubst full_%,%,$(TARGET_PRODUCT))) +ifneq ($(filter fiber_w02 v972v1 v972v2 novo9spark,$(TARGET_DEVICE)),) +override TARGET_DEVICE := sun6i +endif +endif + +ifeq ($(TARGET_DEVICE),) +override TARGET_DEVICE := sun6i +endif + +SGXCORE := 544 +SGX_CORE_REV := 115 +SUPPORT_SLC := 1 +SGX_FEATURE_MP := 1 +SGX_FEATURE_MP_CORE_COUNT := 2 + +PVR_SYSTEM := sunxi +HAL_VARIANT := sun6i +DISPLAY_CONTROLLER := dc_sunxi + +LDM_PLATFORM := 1 + +SUPPORT_LINUX_USING_WORKQUEUES := 1 +SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED := 1 + +PVR_ANDROID_USE_WINDOW_TRANSFORM_HINT ?= 1 +PVR_ANDROID_PLATFORM_HAS_LINUX_FBDEV := 1 + +PVRSRV_USSE_EDM_STATUS_DEBUG ?= 1 +PVRSRV_DUMP_MK_TRACE ?= 1 + +SUPPORT_ANDROID_SUNXI ?= 1 + +ION_DEFAULT_HEAP_MASK := ION_HEAP_CARVEOUT_MASK + +# We have more memory on the sun6i platform, so we can spare to make +# the pool larger, and have higher resolutions which benefit from it. +# +PVR_LINUX_MEM_AREA_POOL_MAX_PAGES ?= 10800 + +SGX_DYNAMIC_TIMING_INFO := 1 + +SUPPORT_PVRSRV_ANDROID_SYSTRACE := 1 + +KERNEL_CROSS_COMPILE ?= arm-eabi- + +include ../common/android/paths.mk +include ../common/android/armv7-a.mk +include ../common/android/features.mk + +ifneq ($(strip $(KERNELDIR)),) + include ../kernel_version.mk + KERNEL_COMPONENTS += $(DISPLAY_CONTROLLER) +endif + +ifeq ($(NO_HARDWARE),1) +ifeq ($(SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED),1) +$(info WARNING: SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED=1 is incompatible with NO_HARDWARE=1) +$(info WARNING: Setting SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED=0 and switching to dc_nohw) +override SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED := 0 +override DISPLAY_CONTROLLER := dcnohw +KERNEL_COMPONENTS += dc_nohw +endif +endif + +include ../config/core.mk +include ../common/android/extra_config.mk +include ../common/opencl.mk + +# If set, services allows two flips to enter the processing queue, +# and does not add read dependencies to the set of buffers last +# flipped to. +# +$(eval $(call TunableKernelConfigC,SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED,)) + +# On sun6i, A31-specific NV12 and NV21 formats are supported. +# +$(eval $(call TunableUserConfigMake,SUPPORT_ANDROID_SUNXI,)) diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/tools/cc-check.sh b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/tools/cc-check.sh index 6cef8fa..9566c73 100755 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/tools/cc-check.sh +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/tools/cc-check.sh @@ -44,24 +44,36 @@ LANG=C export LANG usage() { - echo "usage: $0 [--64] --cc CC --out OUT [cflag]" + echo "usage: $0 [--64] [--clang] --cc CC [--out OUT] [cflag]" exit 1 } -# NOTE: The program passed to the compiler is deliberately incorrect -# (`return;' should be `return 0;') but we do this to emit a warning. -# -# Emitting a warning is necessary to get GCC to print out additional -# warnings about any unsupported -Wno options, so we can handle these -# as unsupported by the build. -# +check_clang() { + $CC -dM -E - </dev/null | grep __clang__ >/dev/null 2>&1 + if [ "$?" = "0" ]; then + # Clang must be passed a program with a main() that returns 0. + # It will produce an error if main() is improperly specified. + IS_CLANG=1 + TEST_PROGRAM="int main(void){return 0;}" + else + # If we're not clang, assume we're GCC. GCC needs to be passed + # a program with a faulty return in main() so that another + # warning (unrelated to the flag being tested) is emitted. + # This will cause GCC to warn about the unsupported warning flag. + IS_CLANG=0 + TEST_PROGRAM="int main(void){return;}" + fi +} + do_cc() { - echo "int main(void){return;}" | $CC -W -Wall $3 -xc -c - -o $1 >$2 2>&1 + echo "$TEST_PROGRAM" | $CC -W -Wall $3 -xc -c - -o $1 >$2 2>&1 } while [ 1 ]; do if [ "$1" = "--64" ]; then - BIT_CHECK=1 + [ -z $CLANG ] && BIT_CHECK=1 + elif [ "$1" = "--clang" ]; then + [ -z $BIT_CHECK ] && CLANG=1 elif [ "$1" = "--cc" ]; then [ "x$2" = "x" ] && usage CC="$2" && shift @@ -77,20 +89,28 @@ while [ 1 ]; do done [ "x$CC" = "x" ] && usage -[ "x$OUT" = "x" ] && usage +[ "x$CLANG" = "x" -a "x$OUT" = "x" ] && usage ccof=$OUT/cc-sanity-check log=${ccof}.log +check_clang + if [ "x$BIT_CHECK" = "x1" ]; then do_cc $ccof $log "" file $ccof | grep 64-bit >/dev/null 2>&1 [ "$?" = "0" ] && echo true || echo false +elif [ "x$CLANG" = "x1" ]; then + [ "x$IS_CLANG" = "x1" ] && echo true || echo false else [ "x$1" = "x" ] && usage do_cc $ccof $log $1 if [ "$?" = "0" ]; then # compile passed, but was the warning unrecognized? - grep -q "^cc1: warning: unrecognized command line option \"$1\"" $log + if [ "x$IS_CLANG" = "x1" ]; then + grep "^warning: unknown warning option '$1'" $log >/dev/null 2>&1 + else + grep "^cc1: warning: unrecognized command line option \"$1\"" $log >/dev/null 2>&1 + fi [ "$?" = "1" ] && echo $1 fi fi diff --git a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/toplevel.mk b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/toplevel.mk index 26b1198..81ecb9e 100644 --- a/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/toplevel.mk +++ b/jacinto6/sgx_src/eurasia_km/eurasiacon/build/linux2/toplevel.mk @@ -60,6 +60,7 @@ $(call directory-must-exist,$(TOP)) RELATIVE_OUT := $(patsubst $(TOP)/%,%,$(OUT)) HOST_OUT := $(RELATIVE_OUT)/host TARGET_OUT := $(RELATIVE_OUT)/target +DOCS_OUT := $(RELATIVE_OUT)/docs CONFIG_MK := $(RELATIVE_OUT)/config.mk CONFIG_H := $(RELATIVE_OUT)/config.h CONFIG_KERNEL_MK := $(RELATIVE_OUT)/config_kernel.mk @@ -82,9 +83,9 @@ ifneq ($(INTERNAL_CLOBBER_ONLY),true) # $(shell mkdir -p $(OUT)) -# Provide rules to create $(HOST_OUT) and $(TARGET_OUT) -.SECONDARY: $(HOST_OUT) $(TARGET_OUT) -$(HOST_OUT) $(TARGET_OUT): +# Provide rules to create the directories for binaries and documentation +.SECONDARY: $(HOST_OUT) $(TARGET_OUT) $(DOCS_OUT) +$(HOST_OUT) $(TARGET_OUT) $(DOCS_OUT): $(make-directory) # If these generated files differ from any pre-existing ones, @@ -201,13 +202,15 @@ endif # You can say 'make all_modules' to attempt to make everything, or 'make # components' to only make the things which are listed (in the per-build # makefiles) as components of the build. -.PHONY: all_modules components +.PHONY: all_modules all_docs components all_modules: $(ALL_MODULES) +all_docs: ; components: $(COMPONENTS) +docs: $(DOCS) # Cleaning .PHONY: clean clobber -clean: MODULE_DIRS_TO_REMOVE := $(OUT)/host/intermediates $(OUT)/target/intermediates $(OUT)/target/kbuild +clean: MODULE_DIRS_TO_REMOVE := $(HOST_OUT) $(TARGET_OUT) $(DOCS_OUT) clean: $(clean-dirs) clobber: MODULE_DIRS_TO_REMOVE := $(OUT) @@ -217,10 +220,14 @@ clobber: # Saying 'make clean-MODULE' removes the intermediates for MODULE. # clobber-MODULE deletes the output files as well clean-%: - $(if $(V),,@echo " RM " $(call relative-to-top,$(OUT)/host/intermediates/$* $(OUT)/target/intermediates/$*)) - $(RM) -rf $(OUT)/host/intermediates/$*/* $(OUT)/target/intermediates/$*/* + $(if $(V),,@echo " RM " $(call relative-to-top,$(OUT)/host/intermediates/$* $(OUT)/target/intermediates/$* $(OUT)/docs/intermediates/$*)) + $(RM) -rf $(OUT)/host/intermediates/$*/* $(OUT)/target/intermediates/$*/* $(OUT)/docs/intermediates/$*/* clobber-%: $(if $(V),,@echo " RM " $(call relative-to-top,$(OUT)/host/intermediates/$* $(OUT)/target/intermediates/$* $(INTERNAL_TARGETS_FOR_$*))) - $(RM) -rf $(OUT)/host/intermediates/$* $(OUT)/target/intermediates/$* $(INTERNAL_TARGETS_FOR_$*) + $(RM) -rf $(OUT)/host/intermediates/$* $(OUT)/target/intermediates/$* $(OUT)/docs/intermediates/$* $(INTERNAL_TARGETS_FOR_$*) include $(MAKE_TOP)/bits.mk + +# D=nobuild stops the build before any recipes are run. This line should +# come at the end of this makefile. +$(if $(filter nobuild,$(D)),$(error D=nobuild given),) diff --git a/jacinto6/sgx_src/eurasia_km/include4/img_defs.h b/jacinto6/sgx_src/eurasia_km/include4/img_defs.h index 375ed99..bf0c360 100644 --- a/jacinto6/sgx_src/eurasia_km/include4/img_defs.h +++ b/jacinto6/sgx_src/eurasia_km/include4/img_defs.h @@ -147,6 +147,71 @@ typedef char TCHAR, *PTCHAR, *PTSTR; #define IMG_UNDEF (~0UL) #endif +/* + Do the right thing when using printf to output cpu addresses, + depending on architecture. + */ +#if defined (_WIN64) + #define UINTPTR_FMT "%016llX" +#else + #if defined (__x86_64__) + #define UINTPTR_FMT "%016lX" + #else + #define UINTPTR_FMT "%08lX" + #endif +#endif + +/* + Similarly for DEV_ and SYS_ PHYSADDRs, but this is dependent on 32/36-bit MMU + capability, in addition to host architecture. + */ +#if IMG_ADDRSPACE_PHYSADDR_BITS == 32 + #if defined(IMG_UINT32_IS_ULONG) + #define CPUPADDR_FMT "%08lX" + #define DEVPADDR_FMT "%08lX" + #define SYSPADDR_FMT "%08lX" + #else + #define CPUPADDR_FMT "%08X" + #define DEVPADDR_FMT "%08X" + #define SYSPADDR_FMT "%08X" + #endif +#else + #if defined(__x86_64__) + #define CPUPADDR_FMT "%016lX" + #define DEVPADDR_FMT "%016lX" + #define SYSPADDR_FMT "%016lX" + #else + + #define CPUPADDR_FMT "%016llX" + #define DEVPADDR_FMT "%016llX" + #define SYSPADDR_FMT "%016llX" + #endif +#endif + +/* + Define a printf format macro for the length property of the format-specifier + for size_t, that allows avoidance of C99 dependency on compilers that don't + support this, while still ensuring that whatever the size of size_t (eg 32, + 64 bit Linux builds, or Win32/64 builds), a size_t (or IMG_SIZE_T) can be + passed to printf-type functions without a cast. +*/ +#if defined LINUX + /* Use C99 format specifier where possible */ + #define SIZE_T_FMT_LEN "z" +#elif defined _WIN64 + #define SIZE_T_FMT_LEN "I" +#else + #define SIZE_T_FMT_LEN "l" /* May need to be updated as required, for other OSs */ +#endif + + +#if defined (__x86_64__) + #define IMG_UINT64_FMT "l" +#else + #define IMG_UINT64_FMT "ll" /* May need to be updated as required, for other OSs */ +#endif + + #endif /* #if !defined (__IMG_DEFS_H__) */ /***************************************************************************** End of file (IMG_DEFS.H) diff --git a/jacinto6/sgx_src/eurasia_km/include4/img_types.h b/jacinto6/sgx_src/eurasia_km/include4/img_types.h index 7f5137e..3e04e4a 100644 --- a/jacinto6/sgx_src/eurasia_km/include4/img_types.h +++ b/jacinto6/sgx_src/eurasia_km/include4/img_types.h @@ -75,17 +75,16 @@ typedef signed long IMG_INT32, *IMG_PINT32; #endif #if defined(USE_CODE) - -typedef unsigned __int64 IMG_UINT64, *IMG_PUINT64; -typedef __int64 IMG_INT64, *IMG_PINT64; - + typedef unsigned __int64 IMG_UINT64, *IMG_PUINT64; + typedef __int64 IMG_INT64, *IMG_PINT64; +#elif defined(LINUX) && defined (__x86_64) + typedef unsigned long IMG_UINT64, *IMG_PUINT64; + typedef long IMG_INT64, *IMG_PINT64; +#elif defined(LINUX) || defined(__METAG) || defined (__QNXNTO__) + typedef unsigned long long IMG_UINT64, *IMG_PUINT64; + typedef long long IMG_INT64, *IMG_PINT64; #else - #if defined(LINUX) || defined(__METAG) || defined (__QNXNTO__) - typedef unsigned long long IMG_UINT64, *IMG_PUINT64; - typedef long long IMG_INT64, *IMG_PINT64; - #else - #error("define an OS") - #endif + #error("define an OS") #endif #if !(defined(LINUX) && defined (__KERNEL__)) @@ -107,11 +106,19 @@ typedef IMG_INT32 IMG_RESULT; #if defined(_WIN64) typedef unsigned __int64 IMG_UINTPTR_T; + typedef signed __int64 IMG_INTPTR_T; typedef signed __int64 IMG_PTRDIFF_T; typedef IMG_UINT64 IMG_SIZE_T; #else - typedef unsigned int IMG_UINTPTR_T; - typedef IMG_UINT32 IMG_SIZE_T; + #if defined (__x86_64__) + typedef IMG_UINT64 IMG_SIZE_T; + typedef unsigned long IMG_UINTPTR_T; + typedef signed long IMG_INTPTR_T; + #else + typedef IMG_UINT32 IMG_SIZE_T; + typedef unsigned long IMG_UINTPTR_T; + typedef signed long IMG_INTPTR_T; + #endif #endif typedef IMG_PVOID IMG_HANDLE; @@ -121,9 +128,9 @@ typedef void** IMG_HVOID, * IMG_PHVOID; #define IMG_NULL 0 /* services/stream ID */ -typedef IMG_UINT32 IMG_SID; +typedef IMG_UINTPTR_T IMG_SID; -typedef IMG_UINT32 IMG_EVENTSID; +typedef IMG_UINTPTR_T IMG_EVENTSID; /* * Address types. @@ -184,7 +191,12 @@ typedef IMG_UINT32 IMG_DEVMEM_SIZE_T; typedef struct _IMG_CPU_PHYADDR { /* variable sized type (32,64) */ - IMG_UINTPTR_T uiAddr; +#if IMG_ADDRSPACE_PHYSADDR_BITS == 32 + /* variable sized type (32,64) */ + IMG_UINT32 uiAddr; +#else + IMG_UINT64 uiAddr; +#endif } IMG_CPU_PHYADDR; /* device physical address */ @@ -192,10 +204,9 @@ typedef struct _IMG_DEV_PHYADDR { #if IMG_ADDRSPACE_PHYSADDR_BITS == 32 /* variable sized type (32,64) */ - IMG_UINTPTR_T uiAddr; -#else IMG_UINT32 uiAddr; - IMG_UINT32 uiHighAddr; +#else + IMG_UINT64 uiAddr; #endif } IMG_DEV_PHYADDR; @@ -203,7 +214,12 @@ typedef struct _IMG_DEV_PHYADDR typedef struct _IMG_SYS_PHYADDR { /* variable sized type (32,64) */ - IMG_UINTPTR_T uiAddr; +#if IMG_ADDRSPACE_PHYSADDR_BITS == 32 + /* variable sized type (32,64) */ + IMG_UINT32 uiAddr; +#else + IMG_UINT64 uiAddr; +#endif } IMG_SYS_PHYADDR; #include "img_defs.h" diff --git a/jacinto6/sgx_src/eurasia_km/include4/pdumpdefs.h b/jacinto6/sgx_src/eurasia_km/include4/pdumpdefs.h index 112e9ee..989488b 100644 --- a/jacinto6/sgx_src/eurasia_km/include4/pdumpdefs.h +++ b/jacinto6/sgx_src/eurasia_km/include4/pdumpdefs.h @@ -115,7 +115,7 @@ typedef enum _PDUMP_POLL_OPERATOR PDUMP_POLL_OPERATOR_LESSEQUAL = 2, PDUMP_POLL_OPERATOR_GREATER = 3, PDUMP_POLL_OPERATOR_GREATEREQUAL = 4, - PDUMP_POLL_OPERATOR_NOTEQUAL = 5, + PDUMP_POLL_OPERATOR_NOTEQUAL = 5 } PDUMP_POLL_OPERATOR; diff --git a/jacinto6/sgx_src/eurasia_km/include4/pvr_debug.h b/jacinto6/sgx_src/eurasia_km/include4/pvr_debug.h index 7e05666..fcc0275 100644 --- a/jacinto6/sgx_src/eurasia_km/include4/pvr_debug.h +++ b/jacinto6/sgx_src/eurasia_km/include4/pvr_debug.h @@ -53,16 +53,17 @@ extern "C" { #define PVR_MAX_DEBUG_MESSAGE_LEN (512) /* These are privately used by pvr_debug, use the PVR_DBG_ defines instead */ -#define DBGPRIV_FATAL 0x01UL -#define DBGPRIV_ERROR 0x02UL -#define DBGPRIV_WARNING 0x04UL -#define DBGPRIV_MESSAGE 0x08UL -#define DBGPRIV_VERBOSE 0x10UL -#define DBGPRIV_CALLTRACE 0x20UL -#define DBGPRIV_ALLOC 0x40UL -#define DBGPRIV_DBGDRV_MESSAGE 0x80UL - -#define DBGPRIV_DBGLEVEL_COUNT 8 +#define DBGPRIV_FATAL 0x001UL +#define DBGPRIV_ERROR 0x002UL +#define DBGPRIV_WARNING 0x004UL +#define DBGPRIV_MESSAGE 0x008UL +#define DBGPRIV_VERBOSE 0x010UL +#define DBGPRIV_CALLTRACE 0x020UL +#define DBGPRIV_ALLOC 0x040UL +#define DBGPRIV_BUFFERED 0x080UL +#define DBGPRIV_DBGDRV_MESSAGE 0x100UL + +#define DBGPRIV_DBGLEVEL_COUNT 9 #if !defined(PVRSRV_NEED_PVR_ASSERT) && defined(DEBUG) #define PVRSRV_NEED_PVR_ASSERT @@ -143,27 +144,29 @@ IMG_IMPORT IMG_VOID IMG_CALLCONV PVRSRVDebugAssertFail(const IMG_CHAR *pszFile, #define PVR_DBG_VERBOSE DBGPRIV_VERBOSE #define PVR_DBG_CALLTRACE DBGPRIV_CALLTRACE #define PVR_DBG_ALLOC DBGPRIV_ALLOC + #define PVR_DBG_BUFFERED DBGPRIV_BUFFERED #define PVR_DBGDRIV_MESSAGE DBGPRIV_DBGDRV_MESSAGE /* These levels are always on with PVRSRV_NEED_PVR_DPF */ - #define __PVR_DPF_0x01UL(x...) PVRSRVDebugPrintf(DBGPRIV_FATAL, x) - #define __PVR_DPF_0x02UL(x...) PVRSRVDebugPrintf(DBGPRIV_ERROR, x) + #define __PVR_DPF_0x001UL(x...) PVRSRVDebugPrintf(DBGPRIV_FATAL, x) + #define __PVR_DPF_0x002UL(x...) PVRSRVDebugPrintf(DBGPRIV_ERROR, x) + #define __PVR_DPF_0x080UL(x...) PVRSRVDebugPrintf(DBGPRIV_BUFFERED, x) /* Some are compiled out completely in release builds */ #if defined(DEBUG) - #define __PVR_DPF_0x04UL(x...) PVRSRVDebugPrintf(DBGPRIV_WARNING, x) - #define __PVR_DPF_0x08UL(x...) PVRSRVDebugPrintf(DBGPRIV_MESSAGE, x) - #define __PVR_DPF_0x10UL(x...) PVRSRVDebugPrintf(DBGPRIV_VERBOSE, x) - #define __PVR_DPF_0x20UL(x...) PVRSRVDebugPrintf(DBGPRIV_CALLTRACE, x) - #define __PVR_DPF_0x40UL(x...) PVRSRVDebugPrintf(DBGPRIV_ALLOC, x) - #define __PVR_DPF_0x80UL(x...) PVRSRVDebugPrintf(DBGPRIV_DBGDRV_MESSAGE, x) + #define __PVR_DPF_0x004UL(x...) PVRSRVDebugPrintf(DBGPRIV_WARNING, x) + #define __PVR_DPF_0x008UL(x...) PVRSRVDebugPrintf(DBGPRIV_MESSAGE, x) + #define __PVR_DPF_0x010UL(x...) PVRSRVDebugPrintf(DBGPRIV_VERBOSE, x) + #define __PVR_DPF_0x020UL(x...) PVRSRVDebugPrintf(DBGPRIV_CALLTRACE, x) + #define __PVR_DPF_0x040UL(x...) PVRSRVDebugPrintf(DBGPRIV_ALLOC, x) + #define __PVR_DPF_0x100UL(x...) PVRSRVDebugPrintf(DBGPRIV_DBGDRV_MESSAGE, x) #else - #define __PVR_DPF_0x04UL(x...) - #define __PVR_DPF_0x08UL(x...) - #define __PVR_DPF_0x10UL(x...) - #define __PVR_DPF_0x20UL(x...) - #define __PVR_DPF_0x40UL(x...) - #define __PVR_DPF_0x80UL(x...) + #define __PVR_DPF_0x004UL(x...) + #define __PVR_DPF_0x008UL(x...) + #define __PVR_DPF_0x010UL(x...) + #define __PVR_DPF_0x020UL(x...) + #define __PVR_DPF_0x040UL(x...) + #define __PVR_DPF_0x100UL(x...) #endif /* Translate the different log levels to separate macros @@ -188,6 +191,7 @@ IMG_IMPORT IMG_VOID IMG_CALLCONV PVRSRVDebugAssertFail(const IMG_CHAR *pszFile, #define PVR_DBG_VERBOSE DBGPRIV_VERBOSE,__FILE__, __LINE__ #define PVR_DBG_CALLTRACE DBGPRIV_CALLTRACE,__FILE__, __LINE__ #define PVR_DBG_ALLOC DBGPRIV_ALLOC,__FILE__, __LINE__ + #define PVR_DBG_BUFFERED DBGPRIV_BUFFERED,__FILE__, __LINE__ #define PVR_DBGDRIV_MESSAGE DBGPRIV_DBGDRV_MESSAGE, "", 0 #define PVR_DPF(X) PVRSRVDebugPrintf X @@ -200,13 +204,14 @@ IMG_IMPORT IMG_VOID IMG_CALLCONV PVRSRVDebugPrintf(IMG_UINT32 ui32DebugLevel, const IMG_CHAR *pszFormat, ...) IMG_FORMAT_PRINTF(4, 5); +IMG_IMPORT IMG_VOID IMG_CALLCONV PVRSRVDebugPrintfDumpCCB(void); + #else /* defined(PVRSRV_NEED_PVR_DPF) */ #define PVR_DPF(X) #endif /* defined(PVRSRV_NEED_PVR_DPF) */ - /* PVR_TRACE() handling */ #if defined(PVRSRV_NEED_PVR_TRACE) diff --git a/jacinto6/sgx_src/eurasia_km/include4/pvr_sync_user.h b/jacinto6/sgx_src/eurasia_km/include4/pvr_sync_user.h new file mode 100644 index 0000000..0220098 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/include4/pvr_sync_user.h @@ -0,0 +1,125 @@ +/*************************************************************************/ /*! +@File pvr_sync_user.h +@Title Userspace definitions to use the kernel sync driver +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@Description Version numbers and strings for PVR Consumer services + components. +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#ifndef _PVR_SYNC_USER_H_ +#define _PVR_SYNC_USER_H_ + +#include <linux/ioctl.h> + +#ifdef __KERNEL__ +#include "sgxapi_km.h" +#else +#include "sgxapi.h" +#endif + +#include "servicesext.h" // PVRSRV_SYNC_DATA +#include "img_types.h" + +/* This matches the sw_sync create ioctl data */ +struct PVR_SYNC_CREATE_IOCTL_DATA +{ + /* Input: Name of this sync pt. Passed to base sync driver. */ + char name[32]; + + /* Input: An fd from a previous call to ALLOC ioctl. Cannot be <0. */ + __s32 allocdSyncInfo; + + /* Output: An fd returned from the CREATE ioctl. */ + __s32 fence; +}; + +struct PVR_SYNC_ALLOC_IOCTL_DATA +{ + /* Output: An fd returned from the ALLOC ioctl */ + __s32 fence; + + /* Output: IMG_TRUE if the timeline looked idle at alloc time */ + __u32 bTimelineIdle; +}; + +#define PVR_SYNC_DEBUG_MAX_POINTS 3 + +typedef struct +{ + /* Output: A globally unique stamp/ID for the sync */ + IMG_UINT64 ui64Stamp; + + /* Output: The WOP snapshot for the sync */ + IMG_UINT32 ui32WriteOpsPendingSnapshot; +} +PVR_SYNC_DEBUG; + +struct PVR_SYNC_DEBUG_IOCTL_DATA +{ + /* Input: Fence to acquire debug for */ + int iFenceFD; + + /* Output: Number of points merged into this fence */ + IMG_UINT32 ui32NumPoints; + + struct + { + /* Output: Metadata for sync point */ + PVR_SYNC_DEBUG sMetaData; + + /* Output: 'Live' sync information. */ + PVRSRV_SYNC_DATA sSyncData; + } + sSync[PVR_SYNC_DEBUG_MAX_POINTS]; +}; + +#define PVR_SYNC_IOC_MAGIC 'W' + +#define PVR_SYNC_IOC_CREATE_FENCE \ + _IOWR(PVR_SYNC_IOC_MAGIC, 0, struct PVR_SYNC_CREATE_IOCTL_DATA) + +#define PVR_SYNC_IOC_DEBUG_FENCE \ + _IOWR(PVR_SYNC_IOC_MAGIC, 1, struct PVR_SYNC_DEBUG_IOCTL_DATA) + +#define PVR_SYNC_IOC_ALLOC_FENCE \ + _IOWR(PVR_SYNC_IOC_MAGIC, 2, struct PVR_SYNC_ALLOC_IOCTL_DATA) + +#define PVRSYNC_MODNAME "pvr_sync" + +#endif /* _PVR_SYNC_USER_H_ */ diff --git a/jacinto6/sgx_src/eurasia_km/include4/pvrversion.h b/jacinto6/sgx_src/eurasia_km/include4/pvrversion.h index 933ed79..ed4025f 100644 --- a/jacinto6/sgx_src/eurasia_km/include4/pvrversion.h +++ b/jacinto6/sgx_src/eurasia_km/include4/pvrversion.h @@ -49,21 +49,20 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define PVR_STR2(X) PVR_STR(X) #define PVRVERSION_MAJ 1 -#define PVRVERSION_MIN 9 -#define PVRVERSION_BRANCH 19 +#define PVRVERSION_MIN 12 #define PVRVERSION_FAMILY "sgxddk" -#define PVRVERSION_BRANCHNAME "1.9" -#define PVRVERSION_BUILD 2291151 -#define PVRVERSION_BSCONTROL "SGX_DDK_Android" +#define PVRVERSION_BRANCHNAME "1.12" +#define PVRVERSION_BUILD 2701748 +#define PVRVERSION_BSCONTROL "SGX_DDK" -#define PVRVERSION_STRING "SGX_DDK_Android sgxddk 19 1.9@" PVR_STR2(PVRVERSION_BUILD) -#define PVRVERSION_STRING_SHORT "1.9@" PVR_STR2(PVRVERSION_BUILD) +#define PVRVERSION_STRING "SGX_DDK sgxddk 1.12@" PVR_STR2(PVRVERSION_BUILD) +#define PVRVERSION_STRING_SHORT "1.12@" PVR_STR2(PVRVERSION_BUILD) "" #define COPYRIGHT_TXT "Copyright (c) Imagination Technologies Ltd. All Rights Reserved." -#define PVRVERSION_BUILD_HI 229 -#define PVRVERSION_BUILD_LO 1151 +#define PVRVERSION_BUILD_HI 270 +#define PVRVERSION_BUILD_LO 1748 #define PVRVERSION_STRING_NUMERIC PVR_STR2(PVRVERSION_MAJ) "." PVR_STR2(PVRVERSION_MIN) "." PVR_STR2(PVRVERSION_BUILD_HI) "." PVR_STR2(PVRVERSION_BUILD_LO) #endif /* _PVRVERSION_H_ */ diff --git a/jacinto6/sgx_src/eurasia_km/include4/services.h b/jacinto6/sgx_src/eurasia_km/include4/services.h index bfa7fb0..8828fa9 100644 --- a/jacinto6/sgx_src/eurasia_km/include4/services.h +++ b/jacinto6/sgx_src/eurasia_km/include4/services.h @@ -105,17 +105,12 @@ extern "C" { #define PVRSRV_HAP_SINGLE_PROCESS (1U<<16) #define PVRSRV_HAP_MULTI_PROCESS (1U<<17) #define PVRSRV_HAP_FROM_EXISTING_PROCESS (1U<<18) -#define PVRSRV_HAP_NO_CPU_VIRTUAL (1U<<19) -#define PVRSRV_MAP_GC_MMU (1UL<<20) -#define PVRSRV_HAP_GPU_PAGEABLE (1U<<21) -#define PVRSRV_HAP_NO_GPU_VIRTUAL_ON_ALLOC (1U<<22) +#define PVRSRV_HAP_NO_CPU_VIRTUAL (1U<<19) #define PVRSRV_HAP_MAPTYPE_MASK (PVRSRV_HAP_KERNEL_ONLY \ |PVRSRV_HAP_SINGLE_PROCESS \ |PVRSRV_HAP_MULTI_PROCESS \ - |PVRSRV_HAP_FROM_EXISTING_PROCESS) -#define PVRSRV_HAP_MAPPING_CTRL_MASK (PVRSRV_HAP_NO_CPU_VIRTUAL\ - |PVRSRV_HAP_GPU_PAGEABLE \ - |PVRSRV_HAP_NO_GPU_VIRTUAL_ON_ALLOC) + |PVRSRV_HAP_FROM_EXISTING_PROCESS \ + |PVRSRV_HAP_NO_CPU_VIRTUAL) /* Allows user allocations to override heap attributes @@ -137,7 +132,7 @@ extern "C" { */ #define PVRSRV_MAP_NOUSERVIRTUAL (1UL<<27) #define PVRSRV_MEM_XPROC (1U<<28) -#define PVRSRV_MEM_ION (1U<<29) +/* Bit 29 is unused */ #define PVRSRV_MEM_ALLOCATENONCACHEDMEM (1UL<<30) /* @@ -199,9 +194,11 @@ extern "C" { Flags for PVRSRVModifySyncOps WO_INC - Used to increment "WriteOpsPending/complete of sync info" RO_INC - Used to increment "ReadOpsPending/complete of sync info" + RO2_INC - Used to increment "ReadOps2Pending/complete of sync info" */ -#define PVRSRV_MODIFYSYNCOPS_FLAGS_WO_INC 0x00000001 -#define PVRSRV_MODIFYSYNCOPS_FLAGS_RO_INC 0x00000002 +#define PVRSRV_MODIFYSYNCOPS_FLAGS_WO_INC (1U<<0) +#define PVRSRV_MODIFYSYNCOPS_FLAGS_RO_INC (1U<<1) +#define PVRSRV_MODIFYSYNCOPS_FLAGS_RO2_INC (1U<<2) /* Flags for Services connection. @@ -215,19 +212,6 @@ extern "C" { */ #define PVRSRV_PDUMP_FLAGS_CONTINUOUS 0x1 -/* Number of MM planes supported for the meminfo */ -#define PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES 3 - -/* Invalid Device Virtual Address Value */ -#define PVRSRV_BAD_DEVICE_ADDRESS 0 - -/* Maximum array size of the meminfo's when invoking - * PVRSRVMultiManageDevMem() in shared mode */ -#define PVRSRV_MULTI_MANAGE_DEV_MEM_MAX_SIZE 128 - -/* Maximum array size of the meminfo's when invoking - * PVRSRVMultiManageDevMem() in direct (copy) mode */ -#define PVRSRV_MULTI_MANAGE_DEV_MEM_MAX_DIRECT_SIZE 8 /****************************************************************************** * Enums @@ -294,6 +278,7 @@ typedef enum IMG_OPENCL = 0x0000000F, #endif + IMG_MODULE_UNDEF = 0xFFFFFFFF } IMG_MODULE_ID; @@ -372,11 +357,7 @@ typedef struct _PVRSRV_CONNECTION_ typedef struct _PVRSRV_DEV_DATA_ { IMG_CONST PVRSRV_CONNECTION *psConnection; /*!< Services connection info */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; /*!< Dev cookie */ -#else IMG_HANDLE hDevCookie; /*!< Dev cookie */ -#endif } PVRSRV_DEV_DATA; @@ -445,16 +426,6 @@ typedef struct _PVRSRV_CLIENT_MEM_INFO_ /* ptr to associated client sync info - NULL if no sync */ struct _PVRSRV_CLIENT_SYNC_INFO_ *psClientSyncInfo; -#if defined (SUPPORT_SID_INTERFACE) - /* handle to client mapping data (OS specific) */ - IMG_SID hMappingInfo; - - /* handle to kernel mem info */ - IMG_SID hKernelMemInfo; - - /* resman handle for UM mapping clean-up */ - IMG_SID hResItem; -#else /* handle to client mapping data (OS specific) */ IMG_HANDLE hMappingInfo; @@ -463,7 +434,6 @@ typedef struct _PVRSRV_CLIENT_MEM_INFO_ /* resman handle for UM mapping clean-up */ IMG_HANDLE hResItem; -#endif #if defined(SUPPORT_MEMINFO_IDS) #if !defined(USE_CODE) @@ -474,9 +444,9 @@ typedef struct _PVRSRV_CLIENT_MEM_INFO_ IMG_UINT32 dummy2; #endif /* !defined(USE_CODE) */ #endif /* defined(SUPPORT_MEMINFO_IDS) */ - - /* Sub-system ID that allocated the buffer */ - IMG_UINT64 uiSubSystem; +#if defined(SUPPORT_ION) + IMG_SIZE_T uiIonBufferSize; +#endif /* defined(SUPPORT_ION) */ /* ptr to next mem info @@ -484,68 +454,8 @@ typedef struct _PVRSRV_CLIENT_MEM_INFO_ */ struct _PVRSRV_CLIENT_MEM_INFO_ *psNext; - /* Device Virtual Addresses for the YUV MM planes */ - IMG_UINT32 planeOffsets[PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES]; } PVRSRV_CLIENT_MEM_INFO, *PPVRSRV_CLIENT_MEM_INFO; -/* - Multiple buffer device virtual mapping management -*/ -typedef enum -{ - PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_INVALID = 0, - /* We may not have GPU virtual address */ - PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_MAP = 1, - PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_LOCK_MAP, - PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_SWAP_MAP_FROM_PREV, - /* We have GPU virtual address */ - PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_UNMAP, - PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_UNLOCK_MAP, - PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_SWAP_MAP_TO_NEXT, - PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_LAST = (IMG_UINT32)-1 -} PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_TYPE; - -typedef struct _PVRSRV_MANAGE_DEV_MEM_REQUEST -{ - PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_TYPE eReqType; - IMG_UINT32 ui32FieldSize; /* valid if equal to the size of the structure */ - IMG_HANDLE hKernelMemInfo; - IMG_HANDLE hKernelSyncInfo; - PVRSRV_CLIENT_MEM_INFO *psClientMemInfo; /* Client side reference */ - IMG_UINT32 ui32Hints; - IMG_UINT32 ui32Attribs; - IMG_SIZE_T uSize; - IMG_SIZE_T uAlignment; - IMG_PVOID pvLinAddr; /* CPU Virtual Address */ - IMG_UINT32 ui32CpuMapRefCount; - IMG_DEV_VIRTADDR sDevVAddr; /* Device Virtual Address */ - IMG_UINT32 ui32GpuMapRefCount; - IMG_UINT32 ui32TransferFromToReqSlotIndx; /* Transfer GPU virtual mapping from index */ - IMG_UINT64 uiSubSystem; - PVRSRV_ERROR eError; -}PVRSRV_MANAGE_DEV_MEM_REQUEST; - -typedef PVRSRV_MANAGE_DEV_MEM_REQUEST PVRSRV_MANAGE_DEV_MEM_RESPONSE; - -typedef struct _PVRSRV_MULTI_MANAGE_DEV_MEM_REQUESTS -{ - IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ - #if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - /* handle to kernel shared memory */ - IMG_SID hKernelMemInfo; - #else - IMG_HANDLE hDevCookie; - /* handle to kernel shared memory*/ - IMG_HANDLE hKernelMemInfo; - #endif - PVRSRV_CLIENT_MEM_INFO *psSharedMemClientMemInfo; /* NULL if direct (not through shared) */ - IMG_UINT32 ui32MaxNumberOfRequests; /* Must be <= PVRSRV_MULTI_MANAGE_DEV_MEM_MAX_DIRECT_SIZE for direct */ - IMG_UINT32 ui32NumberOfValidRequests; /* Must be <= ui32MaxNumberOfRequests */ - IMG_UINT32 ui32CtrlFlags; - IMG_UINT32 ui32StatusFlags; - PVRSRV_MANAGE_DEV_MEM_REQUEST sMemRequests[PVRSRV_MULTI_MANAGE_DEV_MEM_MAX_DIRECT_SIZE]; /* Memory Requests Array */ -}PVRSRV_MULTI_MANAGE_DEV_MEM_REQUESTS; /*! ****************************************************************************** @@ -555,11 +465,7 @@ typedef struct _PVRSRV_MULTI_MANAGE_DEV_MEM_REQUESTS typedef struct _PVRSRV_HEAP_INFO_ { IMG_UINT32 ui32HeapID; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemHeap; -#else IMG_HANDLE hDevMemHeap; -#endif IMG_DEV_VIRTADDR sDevVAddrBase; IMG_UINT32 ui32HeapByteSize; IMG_UINT32 ui32Attribs; @@ -577,11 +483,7 @@ typedef struct _PVRSRV_EVENTOBJECT_ /* globally unique name of the event object */ IMG_CHAR szName[EVENTOBJNAME_MAXLENGTH]; /* kernel specific handle for the event object */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hOSEventKM; -#else IMG_HANDLE hOSEventKM; -#endif } PVRSRV_EVENTOBJECT; @@ -607,13 +509,8 @@ typedef struct _PVRSRV_MISC_INFO_ /*!< SOC Timer register */ IMG_VOID *pvSOCTimerRegisterKM; IMG_VOID *pvSOCTimerRegisterUM; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSOCTimerRegisterOSMemHandle; - IMG_SID hSOCTimerRegisterMappingInfo; -#else IMG_HANDLE hSOCTimerRegisterOSMemHandle; IMG_HANDLE hSOCTimerRegisterMappingInfo; -#endif /*!< SOC Clock Gating registers */ IMG_VOID *pvSOCClockGateRegs; @@ -625,11 +522,7 @@ typedef struct _PVRSRV_MISC_INFO_ /* global event object */ PVRSRV_EVENTOBJECT sGlobalEventObject;//FIXME: should be private to services -#if defined (SUPPORT_SID_INTERFACE) - IMG_EVENTSID hOSGlobalEvent; -#else IMG_HANDLE hOSGlobalEvent; -#endif /* Note: add misc. items as required */ IMG_UINT32 aui32DDKVersion[4]; @@ -647,7 +540,6 @@ typedef struct _PVRSRV_MISC_INFO_ * directly in the srvclient PVRSRVGetMiscInfo code, and then convert it * to a kernel meminfo if required. Try to not waste space. */ -#if !defined (SUPPORT_SID_INTERFACE) union { /*!< Input client meminfo (UM side) */ @@ -656,7 +548,6 @@ typedef struct _PVRSRV_MISC_INFO_ /*!< Output kernel meminfo (Bridge+KM side) */ struct _PVRSRV_KERNEL_MEM_INFO_ *psKernelMemInfo; } u; -#endif /*!< Offset in MemInfo to start cache op */ IMG_VOID *pvBaseVAddr; @@ -672,7 +563,6 @@ typedef struct _PVRSRV_MISC_INFO_ * directly in the srvclient PVRSRVGetMiscInfo code, and then convert it * to a kernel meminfo if required. Try to not waste space. */ -#if !defined(SUPPORT_SID_INTERFACE) union { /*!< Input client meminfo (UM side) */ @@ -681,7 +571,6 @@ typedef struct _PVRSRV_MISC_INFO_ /*!< Output kernel meminfo (Bridge+KM side) */ struct _PVRSRV_KERNEL_MEM_INFO_ *psKernelMemInfo; } u; -#endif /*!< Resulting refcount */ IMG_UINT32 ui32RefCount; @@ -701,11 +590,7 @@ typedef struct _PVRSRV_SYNC_TOKEN_ The fields are hidden in sPrivate in order to reinforce this. */ struct { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfo; -#else IMG_HANDLE hKernelSyncInfo; -#endif IMG_UINT32 ui32ReadOpsPendingSnapshot; IMG_UINT32 ui32WriteOpsPendingSnapshot; IMG_UINT32 ui32ReadOps2PendingSnapshot; @@ -718,7 +603,7 @@ typedef struct _PVRSRV_SYNC_TOKEN_ *****************************************************************************/ typedef enum _PVRSRV_CLIENT_EVENT_ { - PVRSRV_CLIENT_EVENT_HWTIMEOUT = 0, + PVRSRV_CLIENT_EVENT_HWTIMEOUT = 0 } PVRSRV_CLIENT_EVENT; typedef IMG_VOID (*PFN_QUEUE_COMMAND_COMPLETE)(IMG_HANDLE hCallbackData); @@ -754,11 +639,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVReleaseMiscInfo (IMG_CONST PVRSRV_CONNECTION *ps IMG_IMPORT PVRSRV_ERROR PVRSRVPollForValue ( const PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hOSEvent, -#else IMG_HANDLE hOSEvent, -#endif volatile IMG_UINT32 *pui32LinMemAddr, IMG_UINT32 ui32Value, IMG_UINT32 ui32Mask, @@ -768,30 +649,18 @@ PVRSRV_ERROR PVRSRVPollForValue ( const PVRSRV_CONNECTION *psConnection, /* memory APIs */ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateDeviceMemContext(IMG_CONST PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID *phDevMemContext, -#else IMG_HANDLE *phDevMemContext, -#endif IMG_UINT32 *pui32SharedHeapCount, PVRSRV_HEAP_INFO *psHeapInfo); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVDestroyDeviceMemContext(IMG_CONST PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemContext -#else IMG_HANDLE hDevMemContext -#endif ); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDeviceMemHeapInfo(IMG_CONST PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemContext, -#else IMG_HANDLE hDevMemContext, -#endif IMG_UINT32 *pui32SharedHeapCount, PVRSRV_HEAP_INFO *psHeapInfo); @@ -808,11 +677,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDeviceMemHeapInfo(IMG_CONST PVRSRV_DEV_DATA * IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVAllocDeviceMem2(IMG_CONST PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemHeap, -#else IMG_HANDLE hDevMemHeap, -#endif IMG_UINT32 ui32Attribs, IMG_SIZE_T ui32Size, IMG_SIZE_T ui32Alignment, @@ -822,11 +687,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVAllocDeviceMem2(IMG_CONST PVRSRV_DEV_DATA *psDev IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVAllocDeviceMem(IMG_CONST PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemHeap, -#else IMG_HANDLE hDevMemHeap, -#endif IMG_UINT32 ui32Attribs, IMG_SIZE_T ui32Size, IMG_SIZE_T ui32Alignment, @@ -837,37 +698,14 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVFreeDeviceMem(IMG_CONST PVRSRV_DEV_DATA *psDevDa PVRSRV_CLIENT_MEM_INFO *psMemInfo); IMG_IMPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVMultiManageDevMem(IMG_CONST PVRSRV_DEV_DATA *psDevData, - IMG_UINT32 ui32ControlFlags, PVRSRV_MULTI_MANAGE_DEV_MEM_REQUESTS * psMultiMemDevRequest, - IMG_UINT32 *ui32StatusFlags, IMG_UINT32 *ui32IndexError); - -IMG_IMPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVManageDevMem(IMG_CONST PVRSRV_DEV_DATA *psDevData, - PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_TYPE eReq, PVRSRV_CLIENT_MEM_INFO *psMemInfo, - IMG_UINT32 *ui32StatusFlags); - -IMG_IMPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVManageDevMemSwapGpuVirtAddr(IMG_CONST PVRSRV_DEV_DATA *psDevData, - PVRSRV_CLIENT_MEM_INFO *psMemInfoSourceArray, PVRSRV_CLIENT_MEM_INFO *psMemInfoTargetArray, - IMG_UINT32 ui32NumBuff, IMG_UINT32 *ui32StatusFlags); - -IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVExportDeviceMem(IMG_CONST PVRSRV_DEV_DATA *psDevData, PVRSRV_CLIENT_MEM_INFO *psMemInfo, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID *phMemInfo -#else IMG_HANDLE *phMemInfo -#endif ); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVReserveDeviceVirtualMem(IMG_CONST PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemHeap, -#else IMG_HANDLE hDevMemHeap, -#endif IMG_DEV_VIRTADDR *psDevVAddr, IMG_SIZE_T ui32Size, IMG_SIZE_T ui32Alignment, @@ -878,13 +716,8 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVFreeDeviceVirtualMem(IMG_CONST PVRSRV_DEV_DATA * IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceMemory (IMG_CONST PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo, - IMG_SID hDstDevMemHeap, -#else IMG_HANDLE hKernelMemInfo, IMG_HANDLE hDstDevMemHeap, -#endif PVRSRV_CLIENT_MEM_INFO **ppsDstMemInfo); IMG_IMPORT @@ -903,11 +736,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVUnmapExtMemory (IMG_CONST PVRSRV_DEV_DATA *psDev IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVWrapExtMemory(IMG_CONST PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemContext, -#else IMG_HANDLE hDevMemContext, -#endif IMG_SIZE_T ui32ByteSize, IMG_SIZE_T ui32PageOffset, IMG_BOOL bPhysContig, @@ -924,20 +753,6 @@ PVRSRV_ERROR PVRSRVChangeDeviceMemoryAttributes(IMG_CONST PVRSRV_DEV_DATA *psD IMG_UINT32 ui32Attribs); IMG_IMPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemory (IMG_CONST PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemContext, - IMG_SID hDeviceClassBuffer, -#else - IMG_HANDLE hDevMemContext, - IMG_HANDLE hDeviceClassBuffer, -#endif - PVRSRV_CLIENT_MEM_INFO **ppsMemInfo); -IMG_IMPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVUnmapDeviceClassMemory (IMG_CONST PVRSRV_DEV_DATA *psDevData, - PVRSRV_CLIENT_MEM_INFO *psMemInfo); - -IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVMapPhysToUserSpace(IMG_CONST PVRSRV_DEV_DATA *psDevData, IMG_SYS_PHYADDR sSysPhysAddr, IMG_UINT32 uiSizeInBytes, @@ -952,9 +767,6 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVUnmapPhysToUserSpace(IMG_CONST PVRSRV_DEV_DATA * #if defined(LINUX) IMG_IMPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVCloseExportedDeviceMemHanle(const PVRSRV_DEV_DATA *psDevData, - IMG_INT i32Fd); -IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVExportDeviceMem2(IMG_CONST PVRSRV_DEV_DATA *psDevData, PVRSRV_CLIENT_MEM_INFO *psMemInfo, IMG_INT *iFd); @@ -962,23 +774,18 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVExportDeviceMem2(IMG_CONST PVRSRV_DEV_DATA *psDe IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceMemory2(IMG_CONST PVRSRV_DEV_DATA *psDevData, IMG_INT iFd, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDstDevMemHeap, -#else IMG_HANDLE hDstDevMemHeap, -#endif PVRSRV_CLIENT_MEM_INFO **ppsDstMemInfo); #endif /* defined(LINUX) */ #if defined(SUPPORT_ION) PVRSRV_ERROR PVRSRVMapIonHandle(const PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemContext, -#else - IMG_HANDLE hDevMemContext, -#endif - IMG_INT32 uiFD, - IMG_UINT32 uiSize, + IMG_HANDLE hDevMemHeap, + IMG_UINT32 ui32NumFDs, + IMG_INT *paiBufferFDs, + IMG_UINT32 ui32ChunkCount, + IMG_SIZE_T *pauiOffset, + IMG_SIZE_T *pauiSize, IMG_UINT32 ui32Attribs, PVRSRV_CLIENT_MEM_INFO **ppsMemInfo); @@ -989,11 +796,7 @@ PVRSRV_ERROR PVRSRVUnmapIonHandle(const PVRSRV_DEV_DATA *psDevData, IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVAllocDeviceMemSparse(const PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemHeap, -#else IMG_HANDLE hDevMemHeap, -#endif IMG_UINT32 ui32Attribs, IMG_SIZE_T uAlignment, IMG_UINT32 ui32ChunkSize, @@ -1009,7 +812,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVAllocDeviceMemSparse(const PVRSRV_DEV_DATA *psDe typedef enum _PVRSRV_SYNCVAL_MODE_ { PVRSRV_SYNCVAL_READ = IMG_TRUE, - PVRSRV_SYNCVAL_WRITE = IMG_FALSE, + PVRSRV_SYNCVAL_WRITE = IMG_FALSE } PVRSRV_SYNCVAL_MODE, *PPVRSRV_SYNCVAL_MODE; @@ -1036,6 +839,16 @@ IMG_IMPORT IMG_BOOL PVRSRVTestAllOpsNotComplete(PPVRSRV_CLIENT_MEM_INFO psMemInf IMG_IMPORT PVRSRV_SYNCVAL PVRSRVGetPendingOpSyncVal(PPVRSRV_CLIENT_MEM_INFO psMemInfo, PVRSRV_SYNCVAL_MODE eMode); +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) + +IMG_IMPORT +PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemory (IMG_CONST PVRSRV_DEV_DATA *psDevData, + IMG_HANDLE hDevMemContext, + IMG_HANDLE hDeviceClassBuffer, + PVRSRV_CLIENT_MEM_INFO **ppsMemInfo); +IMG_IMPORT +PVRSRV_ERROR IMG_CALLCONV PVRSRVUnmapDeviceClassMemory (IMG_CONST PVRSRV_DEV_DATA *psDevData, + PVRSRV_CLIENT_MEM_INFO *psMemInfo); /****************************************************************************** * Common Device Class Enumeration @@ -1069,11 +882,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVEnumDCDims (IMG_HANDLE hDevice, IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDCSystemBuffer(IMG_HANDLE hDevice, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID *phBuffer -#else IMG_HANDLE *phBuffer -#endif ); IMG_IMPORT @@ -1088,117 +897,69 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateDCSwapChain (IMG_HANDLE hDevice, IMG_UINT32 ui32BufferCount, IMG_UINT32 ui32OEMFlags, IMG_UINT32 *pui32SwapChainID, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID *phSwapChain -#else IMG_HANDLE *phSwapChain -#endif ); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVDestroyDCSwapChain (IMG_HANDLE hDevice, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSwapChain -#else IMG_HANDLE hSwapChain -#endif ); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVSetDCDstRect (IMG_HANDLE hDevice, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSwapChain, -#else IMG_HANDLE hSwapChain, -#endif IMG_RECT *psDstRect); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVSetDCSrcRect (IMG_HANDLE hDevice, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSwapChain, -#else IMG_HANDLE hSwapChain, -#endif IMG_RECT *psSrcRect); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVSetDCDstColourKey (IMG_HANDLE hDevice, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSwapChain, -#else IMG_HANDLE hSwapChain, -#endif IMG_UINT32 ui32CKColour); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVSetDCSrcColourKey (IMG_HANDLE hDevice, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSwapChain, -#else IMG_HANDLE hSwapChain, -#endif IMG_UINT32 ui32CKColour); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDCBuffers(IMG_HANDLE hDevice, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSwapChain, - IMG_SID *phBuffer -#else IMG_HANDLE hSwapChain, IMG_HANDLE *phBuffer -#endif ); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDCBuffers2(IMG_HANDLE hDevice, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSwapChain, - IMG_SID *phBuffer, -#else IMG_HANDLE hSwapChain, IMG_HANDLE *phBuffer, -#endif IMG_SYS_PHYADDR *psPhyAddr); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVSwapToDCBuffer (IMG_HANDLE hDevice, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hBuffer, -#else IMG_HANDLE hBuffer, -#endif IMG_UINT32 ui32ClipRectCount, IMG_RECT *psClipRect, IMG_UINT32 ui32SwapInterval, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hPrivateTag -#else IMG_HANDLE hPrivateTag -#endif ); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVSwapToDCBuffer2 (IMG_HANDLE hDevice, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hBuffer, -#else IMG_HANDLE hBuffer, -#endif IMG_UINT32 ui32SwapInterval, PVRSRV_CLIENT_MEM_INFO **ppsMemInfos, - IMG_UINT32 ui32NumMemInfos, + PVRSRV_CLIENT_SYNC_INFO **ppsSyncInfos, + IMG_UINT32 ui32NumMemSyncInfos, IMG_PVOID pvPrivData, - IMG_UINT32 ui32PrivDataLength); + IMG_UINT32 ui32PrivDataLength, + IMG_HANDLE *phFence); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVSwapToDCSystem (IMG_HANDLE hDevice, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSwapChain -#else IMG_HANDLE hSwapChain -#endif ); /****************************************************************************** @@ -1219,13 +980,10 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetBCBufferInfo(IMG_HANDLE hDevice, IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetBCBuffer(IMG_HANDLE hDevice, IMG_UINT32 ui32BufferIndex, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID *phBuffer -#else IMG_HANDLE *phBuffer -#endif ); +#endif /* #if defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ /****************************************************************************** * PDUMP Function prototypes... @@ -1241,11 +999,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpStopInitPhase(IMG_CONST PVRSRV_CONNECTION * IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpMemPol(IMG_CONST PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo, -#else PVRSRV_CLIENT_MEM_INFO *psMemInfo, -#endif IMG_UINT32 ui32Offset, IMG_UINT32 ui32Value, IMG_UINT32 ui32Mask, @@ -1254,22 +1008,14 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpMemPol(IMG_CONST PVRSRV_CONNECTION *psConne IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpSyncPol(IMG_CONST PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfo, -#else PVRSRV_CLIENT_SYNC_INFO *psClientSyncInfo, -#endif IMG_BOOL bIsRead, IMG_UINT32 ui32Value, IMG_UINT32 ui32Mask); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpSyncPol2(IMG_CONST PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfo, -#else PVRSRV_CLIENT_SYNC_INFO *psClientSyncInfo, -#endif IMG_BOOL bIsRead); IMG_IMPORT @@ -1321,11 +1067,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpPDDevPAddr(IMG_CONST PVRSRV_CONNECTION *psC #if !defined(USE_CODE) IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpMemPages(IMG_CONST PVRSRV_DEV_DATA *psDevData, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo, -#else IMG_HANDLE hKernelMemInfo, -#endif IMG_DEV_PHYADDR *pPages, IMG_UINT32 ui32NumPages, IMG_DEV_VIRTADDR sDevVAddr, @@ -1378,11 +1120,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVPDumpBitmap(IMG_CONST PVRSRV_DEV_DATA *psDevData IMG_UINT32 ui32Height, IMG_UINT32 ui32StrideInBytes, IMG_DEV_VIRTADDR sDevBaseAddr, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemContext, -#else IMG_HANDLE hDevMemContext, -#endif IMG_UINT32 ui32Size, PDUMP_PIXEL_FORMAT ePixelFormat, PDUMP_MEM_FORMAT eMemFormat, @@ -1437,12 +1175,12 @@ IMG_IMPORT IMG_BOOL IMG_CALLCONV PVRSRVGetAppHint(IMG_VOID *pvHintState, *****************************************************************************/ /* Exported APIs */ -IMG_IMPORT IMG_PVOID IMG_CALLCONV PVRSRVAllocUserModeMem (IMG_SIZE_T ui32Size); -IMG_IMPORT IMG_PVOID IMG_CALLCONV PVRSRVCallocUserModeMem (IMG_SIZE_T ui32Size); -IMG_IMPORT IMG_PVOID IMG_CALLCONV PVRSRVReallocUserModeMem (IMG_PVOID pvBase, IMG_SIZE_T uNewSize); +IMG_IMPORT IMG_PVOID IMG_CALLCONV PVRSRVAllocUserModeMem (IMG_SIZE_T uiSize); +IMG_IMPORT IMG_PVOID IMG_CALLCONV PVRSRVCallocUserModeMem (IMG_SIZE_T uiSize); +IMG_IMPORT IMG_PVOID IMG_CALLCONV PVRSRVReallocUserModeMem (IMG_PVOID pvBase, IMG_SIZE_T uiNewSize); IMG_IMPORT IMG_VOID IMG_CALLCONV PVRSRVFreeUserModeMem (IMG_PVOID pvMem); -IMG_IMPORT IMG_VOID PVRSRVMemCopy(IMG_VOID *pvDst, const IMG_VOID *pvSrc, IMG_SIZE_T ui32Size); -IMG_IMPORT IMG_VOID PVRSRVMemSet(IMG_VOID *pvDest, IMG_UINT8 ui8Value, IMG_SIZE_T ui32Size); +IMG_IMPORT IMG_VOID PVRSRVMemCopy(IMG_VOID *pvDst, const IMG_VOID *pvSrc, IMG_SIZE_T uiSize); +IMG_IMPORT IMG_VOID PVRSRVMemSet(IMG_VOID *pvDest, IMG_UINT8 ui8Value, IMG_SIZE_T uiSize); struct _PVRSRV_MUTEX_OPAQUE_STRUCT_; typedef struct _PVRSRV_MUTEX_OPAQUE_STRUCT_ *PVRSRV_MUTEX_HANDLE; @@ -1591,11 +1329,7 @@ IMG_IMPORT IMG_PVOID IMG_CALLCONV PVRSRVReallocUserModeMemTracking(IMG_VOID *pvM *****************************************************************************/ IMG_IMPORT PVRSRV_ERROR PVRSRVEventObjectWait(const PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - IMG_EVENTSID hOSEvent -#else IMG_HANDLE hOSEvent -#endif ); /*! @@ -1608,11 +1342,7 @@ IMG_IMPORT PVRSRV_ERROR PVRSRVEventObjectWait(const PVRSRV_CONNECTION *psConnect ******************************************************************************/ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateSyncInfoModObj(const PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID *phKernelSyncInfoModObj -#else IMG_HANDLE *phKernelSyncInfoModObj -#endif ); /*! @@ -1625,11 +1355,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateSyncInfoModObj(const PVRSRV_CONNECTION *ps ******************************************************************************/ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVDestroySyncInfoModObj(const PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfoModObj -#else IMG_HANDLE hKernelSyncInfoModObj -#endif ); @@ -1664,11 +1390,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVDestroySyncInfoModObj(const PVRSRV_CONNECTION *p ******************************************************************************/ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVModifyPendingSyncOps(const PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfoModObj, -#else IMG_HANDLE hKernelSyncInfoModObj, -#endif PVRSRV_CLIENT_SYNC_INFO *psSyncInfo, IMG_UINT32 ui32ModifyFlags, IMG_UINT32 *pui32ReadOpsPending, @@ -1689,11 +1411,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVModifyPendingSyncOps(const PVRSRV_CONNECTION *ps ******************************************************************************/ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVModifyCompleteSyncOps(const PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfoModObj -#else IMG_HANDLE hKernelSyncInfoModObj -#endif ); /*! @@ -1719,11 +1437,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVModifyCompleteSyncOps(const PVRSRV_CONNECTION *p ******************************************************************************/ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVSyncOpsTakeToken(const PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - const IMG_SID hKernelSyncInfo, -#else const PVRSRV_CLIENT_SYNC_INFO *psSyncInfo, -#endif PVRSRV_SYNC_TOKEN *psSyncToken); /*! ****************************************************************************** @@ -1743,11 +1457,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVSyncOpsTakeToken(const PVRSRV_CONNECTION *psConn ******************************************************************************/ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVSyncOpsFlushToToken(const PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - const IMG_SID hKernelSyncInfo, -#else const PVRSRV_CLIENT_SYNC_INFO *psSyncInfo, -#endif const PVRSRV_SYNC_TOKEN *psSyncToken, IMG_BOOL bWait); /*! @@ -1770,11 +1480,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVSyncOpsFlushToToken(const PVRSRV_CONNECTION *psC ******************************************************************************/ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVSyncOpsFlushToModObj(const PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfoModObj, -#else IMG_HANDLE hKernelSyncInfoModObj, -#endif IMG_BOOL bWait); /*! diff --git a/jacinto6/sgx_src/eurasia_km/include4/servicesext.h b/jacinto6/sgx_src/eurasia_km/include4/servicesext.h index 80df117..a0aff8c 100644 --- a/jacinto6/sgx_src/eurasia_km/include4/servicesext.h +++ b/jacinto6/sgx_src/eurasia_km/include4/servicesext.h @@ -645,6 +645,9 @@ typedef enum _PVRSRV_PIXEL_FORMAT_ { PVRSRV_PIXEL_FORMAT_RAW512 = 224, PVRSRV_PIXEL_FORMAT_RAW1024 = 225, + /* Same as NV12 but with interleaved VU rather than interleaved UV */ + PVRSRV_PIXEL_FORMAT_NV21 = 226, + PVRSRV_PIXEL_FORMAT_FORCE_I32 = 0x7fffffff } PVRSRV_PIXEL_FORMAT; @@ -657,7 +660,7 @@ typedef enum _PVRSRV_ALPHA_FORMAT_ { PVRSRV_ALPHA_FORMAT_UNKNOWN = 0x00000000, PVRSRV_ALPHA_FORMAT_PRE = 0x00000001, PVRSRV_ALPHA_FORMAT_NONPRE = 0x00000002, - PVRSRV_ALPHA_FORMAT_MASK = 0x0000000F, + PVRSRV_ALPHA_FORMAT_MASK = 0x0000000F } PVRSRV_ALPHA_FORMAT; /*! @@ -668,7 +671,7 @@ typedef enum _PVRSRV_COLOURSPACE_FORMAT_ { PVRSRV_COLOURSPACE_FORMAT_UNKNOWN = 0x00000000, PVRSRV_COLOURSPACE_FORMAT_LINEAR = 0x00010000, PVRSRV_COLOURSPACE_FORMAT_NONLINEAR = 0x00020000, - PVRSRV_COLOURSPACE_FORMAT_MASK = 0x000F0000, + PVRSRV_COLOURSPACE_FORMAT_MASK = 0x000F0000 } PVRSRV_COLOURSPACE_FORMAT; @@ -744,17 +747,10 @@ typedef struct _PVRSRV_CLIENT_SYNC_INFO_ IMG_DEV_VIRTADDR sReadOps2CompleteDevVAddr; /* handle to client mapping data (OS specific) */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hMappingInfo; - - /* handle to kernel sync info */ - IMG_SID hKernelSyncInfo; -#else IMG_HANDLE hMappingInfo; /* handle to kernel sync info */ IMG_HANDLE hKernelSyncInfo; -#endif } PVRSRV_CLIENT_SYNC_INFO, *PPVRSRV_CLIENT_SYNC_INFO; @@ -803,7 +799,7 @@ typedef struct _IMG_RECT_16_ typedef PVRSRV_ERROR (*PFN_GET_BUFFER_ADDR)(IMG_HANDLE, IMG_HANDLE, IMG_SYS_PHYADDR**, - IMG_SIZE_T*, + IMG_UINT32*, IMG_VOID**, IMG_HANDLE*, IMG_BOOL*, diff --git a/jacinto6/sgx_src/eurasia_km/include4/sgx_options.h b/jacinto6/sgx_src/eurasia_km/include4/sgx_options.h index b64cd39..230e8ad 100644 --- a/jacinto6/sgx_src/eurasia_km/include4/sgx_options.h +++ b/jacinto6/sgx_src/eurasia_km/include4/sgx_options.h @@ -87,17 +87,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -#if defined (SUPPORT_SID_INTERFACE) -#define PVR_SECURE_HANDLES_SET_OFFSET OPTIONS_BIT4 -#define OPTIONS_BIT4 (0x1U << 4) -#else #if defined(PVR_SECURE_HANDLES) || defined (INTERNAL_TEST) #define PVR_SECURE_HANDLES_SET_OFFSET OPTIONS_BIT4 #define OPTIONS_BIT4 (0x1U << 4) #else #define OPTIONS_BIT4 0x0 #endif /* PVR_SECURE_HANDLES */ -#endif #if defined(SGX_BYPASS_SYSTEM_CACHE) || defined (INTERNAL_TEST) #define SGX_BYPASS_SYSTEM_CACHE_SET_OFFSET OPTIONS_BIT5 @@ -206,13 +201,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define OPTIONS_BIT21 0x0 #endif /* SUPPORT_SGX_LOW_LATENCY_SCHEDULING */ -#if defined(USE_SUPPORT_NO_TA3D_OVERLAP) || defined (INTERNAL_TEST) -#define USE_SUPPORT_NO_TA3D_OVERLAP_SET_OFFSET OPTIONS_BIT22 -#define OPTIONS_BIT22 (0x1U << 22) -#else -#define OPTIONS_BIT22 0x0 -#endif /* USE_SUPPORT_NO_TA3D_OVERLAP */ - #if defined(SGX_FEATURE_MP) || defined (INTERNAL_TEST) #if defined(SGX_FEATURE_MP_CORE_COUNT) #define OPTIONS_HIGHBYTE ((SGX_FEATURE_MP_CORE_COUNT-1) << SGX_FEATURE_MP_CORE_COUNT_SET_OFFSET) @@ -253,6 +241,5 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. OPTIONS_BIT19 |\ OPTIONS_BIT20 |\ OPTIONS_BIT21 |\ - OPTIONS_BIT22 |\ OPTIONS_HIGHBYTE diff --git a/jacinto6/sgx_src/eurasia_km/include4/sgxapi_km.h b/jacinto6/sgx_src/eurasia_km/include4/sgxapi_km.h index bb8776a..d001e6f 100644 --- a/jacinto6/sgx_src/eurasia_km/include4/sgxapi_km.h +++ b/jacinto6/sgx_src/eurasia_km/include4/sgxapi_km.h @@ -83,11 +83,8 @@ extern "C" { #if defined(SUPPORT_MEMORY_TILING) #define SGX_VPB_TILED_HEAP_ID 14 #endif -#if defined(SUPPORT_ION) -#define SGX_ION_HEAP_ID 15 -#endif -#define SGX_MAX_HEAP_ID 16 +#define SGX_MAX_HEAP_ID 15 /* * Keep SGX_3DPARAMETERS_HEAP_ID as TQ full custom @@ -119,9 +116,9 @@ extern "C" { /* sync info structure array size */ #define SGX_MAX_SRC_SYNCS_TA 32 #define SGX_MAX_DST_SYNCS_TA 1 -/* note: there is implicitly 1 3D Dst Sync */ -#define SGX_MAX_SRC_SYNCS_TQ 8 -#define SGX_MAX_DST_SYNCS_TQ 1 +/* note: only one dst sync is supported by the 2D paths */ +#define SGX_MAX_SRC_SYNCS_TQ 6 +#define SGX_MAX_DST_SYNCS_TQ 2 #endif @@ -142,6 +139,9 @@ extern "C" { #define PVRSRV_SGX_HWPERF_POWER 0x6 #define PVRSRV_SGX_HWPERF_PERIODIC 0x7 #define PVRSRV_SGX_HWPERF_3DSPM 0x8 +#define PVRSRV_SGX_HWPERF_TA_OCL 0x9 +#define PVRSRV_SGX_HWPERF_3D_OCL 0xA +#define PVRSRV_SGX_HWPERF_3DSPM_OCL 0xB #define PVRSRV_SGX_HWPERF_MK_EVENT 0x101 #define PVRSRV_SGX_HWPERF_MK_TA 0x102 @@ -154,6 +154,7 @@ extern "C" { #define PVRSRV_SGX_HWPERF_MK_TA_LOCKUP 0x109 #define PVRSRV_SGX_HWPERF_MK_3D_LOCKUP 0x10A #define PVRSRV_SGX_HWPERF_MK_2D_LOCKUP 0x10B +#define PVRSRV_SGX_HWPERF_MK_HK 0x10C #define PVRSRV_SGX_HWPERF_TYPE_STARTEND_BIT 28 #define PVRSRV_SGX_HWPERF_TYPE_OP_MASK ((1UL << PVRSRV_SGX_HWPERF_TYPE_STARTEND_BIT) - 1) @@ -173,6 +174,12 @@ extern "C" { #define PVRSRV_SGX_HWPERF_TYPE_PERIODIC (PVRSRV_SGX_HWPERF_PERIODIC) #define PVRSRV_SGX_HWPERF_TYPE_3DSPM_START (PVRSRV_SGX_HWPERF_3DSPM | PVRSRV_SGX_HWPERF_TYPE_OP_START) #define PVRSRV_SGX_HWPERF_TYPE_3DSPM_END (PVRSRV_SGX_HWPERF_3DSPM | PVRSRV_SGX_HWPERF_TYPE_OP_END) +#define PVRSRV_SGX_HWPERF_TYPE_3DSPM_OCL_START (PVRSRV_SGX_HWPERF_3DSPM_OCL | PVRSRV_SGX_HWPERF_TYPE_OP_START) +#define PVRSRV_SGX_HWPERF_TYPE_3DSPM_OCL_END (PVRSRV_SGX_HWPERF_3DSPM_OCL | PVRSRV_SGX_HWPERF_TYPE_OP_END) +#define PVRSRV_SGX_HWPERF_TYPE_TA_OCL_START (PVRSRV_SGX_HWPERF_TA_OCL | PVRSRV_SGX_HWPERF_TYPE_OP_START) +#define PVRSRV_SGX_HWPERF_TYPE_TA_OCL_END (PVRSRV_SGX_HWPERF_TA_OCL | PVRSRV_SGX_HWPERF_TYPE_OP_END) +#define PVRSRV_SGX_HWPERF_TYPE_3D_OCL_START (PVRSRV_SGX_HWPERF_3D_OCL | PVRSRV_SGX_HWPERF_TYPE_OP_START) +#define PVRSRV_SGX_HWPERF_TYPE_3D_OCL_END (PVRSRV_SGX_HWPERF_3D_OCL | PVRSRV_SGX_HWPERF_TYPE_OP_END) #define PVRSRV_SGX_HWPERF_TYPE_MK_TRANSFER_DUMMY_START (PVRSRV_SGX_HWPERF_MK_TRANSFER_DUMMY | PVRSRV_SGX_HWPERF_TYPE_OP_START) #define PVRSRV_SGX_HWPERF_TYPE_MK_TRANSFER_DUMMY_END (PVRSRV_SGX_HWPERF_MK_TRANSFER_DUMMY | PVRSRV_SGX_HWPERF_TYPE_OP_END) #define PVRSRV_SGX_HWPERF_TYPE_MK_TA_DUMMY_START (PVRSRV_SGX_HWPERF_MK_TA_DUMMY | PVRSRV_SGX_HWPERF_TYPE_OP_START) @@ -193,6 +200,9 @@ extern "C" { #define PVRSRV_SGX_HWPERF_TYPE_MK_3D_END (PVRSRV_SGX_HWPERF_MK_3D | PVRSRV_SGX_HWPERF_TYPE_OP_END) #define PVRSRV_SGX_HWPERF_TYPE_MK_2D_START (PVRSRV_SGX_HWPERF_MK_2D | PVRSRV_SGX_HWPERF_TYPE_OP_START) #define PVRSRV_SGX_HWPERF_TYPE_MK_2D_END (PVRSRV_SGX_HWPERF_MK_2D | PVRSRV_SGX_HWPERF_TYPE_OP_END) +#define PVRSRV_SGX_HWPERF_TYPE_MK_HK_START (PVRSRV_SGX_HWPERF_MK_HK | PVRSRV_SGX_HWPERF_TYPE_OP_START) +#define PVRSRV_SGX_HWPERF_TYPE_MK_HK_END (PVRSRV_SGX_HWPERF_MK_HK | PVRSRV_SGX_HWPERF_TYPE_OP_END) + #define PVRSRV_SGX_HWPERF_STATUS_OFF (0x0) #define PVRSRV_SGX_HWPERF_STATUS_RESET_COUNTERS (1UL << 0) @@ -236,6 +246,7 @@ typedef struct _CTL_STATUS_ typedef enum _SGX_MISC_INFO_REQUEST_ { SGX_MISC_INFO_REQUEST_CLOCKSPEED = 0, + SGX_MISC_INFO_REQUEST_CLOCKSPEED_SLCSIZE, SGX_MISC_INFO_REQUEST_SGXREV, SGX_MISC_INFO_REQUEST_DRIVER_SGXREV, #if defined(SUPPORT_SGX_EDM_MEMORY_DEBUG) @@ -254,6 +265,9 @@ typedef enum _SGX_MISC_INFO_REQUEST_ SGX_MISC_INFO_REQUEST_SPM, SGX_MISC_INFO_REQUEST_ACTIVEPOWER, SGX_MISC_INFO_REQUEST_LOCKUPS, +#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) + SGX_MISC_INFO_REQUEST_EDM_STATUS_BUFFER_INFO, +#endif SGX_MISC_INFO_REQUEST_FORCE_I16 = 0x7fff } SGX_MISC_INFO_REQUEST; @@ -275,11 +289,24 @@ typedef struct _PVRSRV_SGX_MISCINFO_FEATURES #if defined(SUPPORT_SGX_EDM_MEMORY_DEBUG) IMG_UINT32 ui32DeviceMemValue; /*!< device mem value read from ukernel */ #endif +} PVRSRV_SGX_MISCINFO_FEATURES; + +typedef struct _PVRSRV_SGX_MISCINFO_QUERY_CLOCKSPEED_SLCSIZE +{ + IMG_UINT32 ui32SGXClockSpeed; + IMG_UINT32 ui32SGXSLCSize; +} PVRSRV_SGX_MISCINFO_QUERY_CLOCKSPEED_SLCSIZE; + #if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) +/****************************************************************************** + * Struct for getting access to the EDM Status Buffer + ******************************************************************************/ +typedef struct _PVRSRV_SGX_MISCINFO_EDM_STATUS_BUFFER_INFO +{ IMG_DEV_VIRTADDR sDevVAEDMStatusBuffer; /*!< DevVAddr of the EDM status buffer */ IMG_PVOID pvEDMStatusBuffer; /*!< CPUVAddr of the EDM status buffer */ +} PVRSRV_SGX_MISCINFO_EDM_STATUS_BUFFER_INFO; #endif -} PVRSRV_SGX_MISCINFO_FEATURES; /****************************************************************************** @@ -389,6 +416,7 @@ typedef struct _SGX_MISC_INFO_ IMG_UINT32 reserved; /*!< Unused: ensures valid code in the case everything else is compiled out */ PVRSRV_SGX_MISCINFO_FEATURES sSGXFeatures; IMG_UINT32 ui32SGXClockSpeed; + PVRSRV_SGX_MISCINFO_QUERY_CLOCKSPEED_SLCSIZE sQueryClockSpeedSLCSize; PVRSRV_SGX_MISCINFO_ACTIVEPOWER sActivePower; PVRSRV_SGX_MISCINFO_LOCKUPS sLockups; PVRSRV_SGX_MISCINFO_SPM sSPM; @@ -396,6 +424,10 @@ typedef struct _SGX_MISC_INFO_ SGX_BREAKPOINT_INFO sSGXBreakpointInfo; #endif PVRSRV_SGX_MISCINFO_SET_HWPERF_STATUS sSetHWPerfStatus; + +#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) + PVRSRV_SGX_MISCINFO_EDM_STATUS_BUFFER_INFO sEDMStatusBufferInfo; +#endif } uData; } SGX_MISC_INFO; @@ -439,7 +471,6 @@ typedef struct _PVRSRV_SGX_PDUMP_CONTEXT_ } PVRSRV_SGX_PDUMP_CONTEXT; -#if !defined (SUPPORT_SID_INTERFACE) typedef struct _SGX_KICKTA_DUMP_ROFF_ { IMG_HANDLE hKernelMemInfo; /*< Buffer handle */ @@ -448,13 +479,8 @@ typedef struct _SGX_KICKTA_DUMP_ROFF_ IMG_UINT32 ui32Value; /*< Actual value to dump */ IMG_PCHAR pszName; /*< Name of buffer */ } SGX_KICKTA_DUMP_ROFF, *PSGX_KICKTA_DUMP_ROFF; -#endif -#if defined (SUPPORT_SID_INTERFACE) -typedef struct _SGX_KICKTA_DUMP_BUFFER_KM_ -#else typedef struct _SGX_KICKTA_DUMP_BUFFER_ -#endif { IMG_UINT32 ui32SpaceUsed; IMG_UINT32 ui32Start; /*< Byte offset of start to dump */ @@ -475,13 +501,8 @@ typedef struct _SGX_KICKTA_DUMP_BUFFER_ #if defined (__QNXNTO__) IMG_UINT32 ui32NameLength; /*< Number of characters in buffer name */ #endif -#if defined (SUPPORT_SID_INTERFACE) -} SGX_KICKTA_DUMP_BUFFER_KM, *PSGX_KICKTA_DUMP_BUFFER_KM; -#else } SGX_KICKTA_DUMP_BUFFER, *PSGX_KICKTA_DUMP_BUFFER; -#endif -#if !defined (SUPPORT_SID_INTERFACE) #ifdef PDUMP /* PDUMP version of above kick structure @@ -501,7 +522,6 @@ typedef struct _SGX_KICKTA_PDUMP_ IMG_UINT32 ui32ROffArraySize; } SGX_KICKTA_PDUMP, *PSGX_KICKTA_PDUMP; #endif /* PDUMP */ -#endif /* #if !defined (SUPPORT_SID_INTERFACE) */ #if defined(TRANSFER_QUEUE) #if defined(SGX_FEATURE_2D_HARDWARE) diff --git a/jacinto6/sgx_src/eurasia_km/include4/sgxscript.h b/jacinto6/sgx_src/eurasia_km/include4/sgxscript.h index 46b89d2..7e663b1 100644 --- a/jacinto6/sgx_src/eurasia_km/include4/sgxscript.h +++ b/jacinto6/sgx_src/eurasia_km/include4/sgxscript.h @@ -42,11 +42,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef __SGXSCRIPT_H__ #define __SGXSCRIPT_H__ +#include "sgxfeaturedefs.h" #if defined (__cplusplus) extern "C" { #endif #define SGX_MAX_INIT_COMMANDS 64 +#define SGX_MAX_PRINT_COMMANDS 64 #define SGX_MAX_DEINIT_COMMANDS 16 typedef enum _SGX_INIT_OPERATION @@ -54,6 +56,7 @@ typedef enum _SGX_INIT_OPERATION SGX_INIT_OP_ILLEGAL = 0, SGX_INIT_OP_WRITE_HW_REG, SGX_INIT_OP_READ_HW_REG, + SGX_INIT_OP_PRINT_HW_REG, #if defined(PDUMP) SGX_INIT_OP_PDUMP_HW_REG, #endif @@ -71,6 +74,7 @@ typedef union _SGX_INIT_COMMAND struct { SGX_INIT_OPERATION eOp; IMG_UINT32 ui32Offset; + IMG_UINT32 ui32Value; } sReadHWReg; #if defined(PDUMP) struct { @@ -86,6 +90,10 @@ typedef struct _SGX_INIT_SCRIPTS_ SGX_INIT_COMMAND asInitCommandsPart1[SGX_MAX_INIT_COMMANDS]; SGX_INIT_COMMAND asInitCommandsPart2[SGX_MAX_INIT_COMMANDS]; SGX_INIT_COMMAND asDeinitCommands[SGX_MAX_DEINIT_COMMANDS]; +#if defined(SGX_FEATURE_MP) + SGX_INIT_COMMAND asSGXREGDebugCommandsMaster[SGX_MAX_PRINT_COMMANDS]; +#endif + SGX_INIT_COMMAND asSGXREGDebugCommandsSlave[SGX_MAX_PRINT_COMMANDS]; } SGX_INIT_SCRIPTS; #if defined(__cplusplus) diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/Kbuild.mk b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/Kbuild.mk new file mode 100644 index 0000000..8f5720e --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/Kbuild.mk @@ -0,0 +1,45 @@ +########################################################################### ### +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### +ccflags-y += -I$(TOP)/services4/3rdparty/bufferclass_example + +bc_example-y += \ + services4/3rdparty/bufferclass_example/bufferclass_example.o \ + services4/3rdparty/bufferclass_example/bufferclass_example_linux.o \ + services4/3rdparty/bufferclass_example/bufferclass_example_private.o diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/Linux.mk b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/Linux.mk new file mode 100644 index 0000000..f2e44a6 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/Linux.mk @@ -0,0 +1,45 @@ +########################################################################### ### +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### + +modules := bufferclass_example + +bufferclass_example_type := kernel_module +bufferclass_example_target := bc_example.ko +bufferclass_example_makefile := $(THIS_DIR)/Kbuild.mk diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example.c b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example.c new file mode 100644 index 0000000..2669888 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example.c @@ -0,0 +1,626 @@ +/*************************************************************************/ /*! +@Title bufferclass_example kernel driver +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +/************************************************************************** + The 3rd party driver is a specification of an API to integrate the IMG POWERVR + Services driver with a 3rd Party 'buffer device'. It is NOT a specification for + a 'buffer device' driver, rather a specification to extend the API for a + pre-existing driver for the 'buffer device' hardware. + + The 3rd party driver interface provides IMG POWERVR client drivers (e.g. PVR2D) + with an API abstraction of the system's underlying buffer device hardware, + allowing the client drivers to indirectly control the buffer device hardware + and access its associated memory. + + Functions of the API include + - query buffer device surface attributes (width, height, stride, pixel format, + CPU physical and virtual address) + + Note: having queried surface attributes the client drivers are able to map the + buffer device memory to any IMG POWERVR Services device by calling + PVRSRVMapDeviceClassMemory with the buffer device surface handle. + + This code is intended to be an example of how a pre-existing buffer device + driver may be extended to support the 3rd Party buffer device interface to + POWERVR Services + - IMG is not providing a buffer device driver implementation. + **************************************************************************/ +#if defined(__linux__) +#include <linux/string.h> +#else +#include <string.h> +#endif + +#include "bufferclass_example.h" + + + +#define BUFFERCLASS_DEVICE_NAME "Example Bufferclass Device (SW)" + +/* top level 'hook ptr' */ +static void *gpvAnchor = NULL; +static PFN_BC_GET_PVRJTABLE pfnGetPVRJTable = IMG_NULL; + +/* + Kernel services is a kernel module and must be loaded first. + This driver is also a kernel module and must be loaded after the pvr services module. + This driver should be able to retrieve the + address of the services PVRGetBufferClassJTable from (the already loaded) + kernel services module. +*/ + +/* returns anchor pointer */ +BC_EXAMPLE_DEVINFO * GetAnchorPtr(void) +{ + return (BC_EXAMPLE_DEVINFO *)gpvAnchor; +} + +/* sets anchor pointer */ +static void SetAnchorPtr(BC_EXAMPLE_DEVINFO *psDevInfo) +{ + gpvAnchor = (void *)psDevInfo; +} + + +/* Open device function, called from services */ +static PVRSRV_ERROR OpenBCDevice(IMG_UINT32 ui32DeviceID, IMG_HANDLE *phDevice) +{ + BC_EXAMPLE_DEVINFO *psDevInfo; + + /* + bufferclass_example manages only one BufferClass device + therefore there is no need to track ID numbers. + */ + UNREFERENCED_PARAMETER(ui32DeviceID); + + psDevInfo = GetAnchorPtr(); + + /* return handle to the devinfo */ + *phDevice = (IMG_HANDLE)psDevInfo; + + return (PVRSRV_OK); +} + + +/* Close device function, called from services */ +static PVRSRV_ERROR CloseBCDevice(IMG_UINT32 ui32DeviceID, IMG_HANDLE hDevice) +{ + UNREFERENCED_PARAMETER(hDevice); + + return (PVRSRV_OK); +} + +/* Passes in the sync data for a buffer, and returns the handle */ +/* called from services */ +static PVRSRV_ERROR GetBCBuffer(IMG_HANDLE hDevice, + IMG_UINT32 ui32BufferNumber, + PVRSRV_SYNC_DATA *psSyncData, + IMG_HANDLE *phBuffer) +{ + BC_EXAMPLE_DEVINFO *psDevInfo; + + if(!hDevice || !phBuffer) + { + return (PVRSRV_ERROR_INVALID_PARAMS); + } + + psDevInfo = (BC_EXAMPLE_DEVINFO*)hDevice; + + if( ui32BufferNumber < psDevInfo->sBufferInfo.ui32BufferCount ) + { + psDevInfo->psSystemBuffer[ui32BufferNumber].psSyncData = psSyncData; + *phBuffer = (IMG_HANDLE)&psDevInfo->psSystemBuffer[ui32BufferNumber]; + } + else + { + return (PVRSRV_ERROR_INVALID_PARAMS); + } + + return (PVRSRV_OK); +} + + +/* get buffer info function, called from services */ +static PVRSRV_ERROR GetBCInfo(IMG_HANDLE hDevice, BUFFER_INFO *psBCInfo) +{ + BC_EXAMPLE_DEVINFO *psDevInfo; + + if(!hDevice || !psBCInfo) + { + return (PVRSRV_ERROR_INVALID_PARAMS); + } + + psDevInfo = (BC_EXAMPLE_DEVINFO*)hDevice; + + *psBCInfo = psDevInfo->sBufferInfo; + + return (PVRSRV_OK); +} + + +/* get buffer address function, called from services */ +static PVRSRV_ERROR GetBCBufferAddr(IMG_HANDLE hDevice, + IMG_HANDLE hBuffer, + IMG_SYS_PHYADDR **ppsSysAddr, + IMG_UINT32 *pui32ByteSize, + IMG_VOID **ppvCpuVAddr, + IMG_HANDLE *phOSMapInfo, + IMG_BOOL *pbIsContiguous, + IMG_UINT32 *pui32TilingStride) +{ + BC_EXAMPLE_BUFFER *psBuffer; + + PVR_UNREFERENCED_PARAMETER(pui32TilingStride); + + if(!hDevice || !hBuffer || !ppsSysAddr || !pui32ByteSize) + { + return (PVRSRV_ERROR_INVALID_PARAMS); + } + + psBuffer = (BC_EXAMPLE_BUFFER *) hBuffer; + + *ppvCpuVAddr = psBuffer->sCPUVAddr; + + *phOSMapInfo = IMG_NULL; + *pui32ByteSize = (IMG_UINT32)psBuffer->ulSize; + +#if defined(BC_DISCONTIG_BUFFERS) + *ppsSysAddr = psBuffer->psSysAddr; + *pbIsContiguous = IMG_FALSE; +#else + *ppsSysAddr = &psBuffer->sPageAlignSysAddr; + *pbIsContiguous = IMG_TRUE; +#endif + + return (PVRSRV_OK); +} + + +/* + * Register the device with services module srvkm. + * This should only be done once at boot time. + */ +BCE_ERROR BC_Example_Register(void) +{ + BC_EXAMPLE_DEVINFO *psDevInfo; + + /* + - connect to services + - register with services + - allocate and setup private data structure + */ + + + /* + in kernel driver, data structures must be anchored to something for subsequent retrieval + this may be a single global pointer or TLS or something else - up to you + call API to retrieve this ptr + */ + + /* + get the anchor pointer + */ + psDevInfo = GetAnchorPtr(); + + if (psDevInfo == NULL) + { + /* allocate device info. structure */ + psDevInfo = (BC_EXAMPLE_DEVINFO *)BCAllocKernelMem(sizeof(BC_EXAMPLE_DEVINFO)); + + if(!psDevInfo) + { + return (BCE_ERROR_OUT_OF_MEMORY);/* failure */ + } + + /* set the top-level anchor */ + SetAnchorPtr((void*)psDevInfo); + + /* set ref count */ + psDevInfo->ulRefCount = 0; + + + if(BCOpenPVRServices(&psDevInfo->hPVRServices) != BCE_OK) + { + return (BCE_ERROR_INIT_FAILURE);/* failure */ + } + if(BCGetLibFuncAddr (psDevInfo->hPVRServices, "PVRGetBufferClassJTable", &pfnGetPVRJTable) != BCE_OK) + { + return (BCE_ERROR_INIT_FAILURE);/* failure */ + } + + /* got the kernel services function table */ + if(!(*pfnGetPVRJTable)(&psDevInfo->sPVRJTable)) + { + return (BCE_ERROR_INIT_FAILURE);/* failure */ + } + + /* + Setup the devinfo + */ + + psDevInfo->ulNumBuffers = 0; + + psDevInfo->psSystemBuffer = BCAllocKernelMem(sizeof(BC_EXAMPLE_BUFFER) * BC_EXAMPLE_NUM_BUFFERS); + + if(!psDevInfo->psSystemBuffer) + { + return (BCE_ERROR_OUT_OF_MEMORY);/* failure */ + } + + /* Setup Buffer Info */ + psDevInfo->sBufferInfo.pixelformat = PVRSRV_PIXEL_FORMAT_UNKNOWN; + psDevInfo->sBufferInfo.ui32Width = 0; + psDevInfo->sBufferInfo.ui32Height = 0; + psDevInfo->sBufferInfo.ui32ByteStride = 0; + psDevInfo->sBufferInfo.ui32BufferDeviceID = BC_EXAMPLE_DEVICEID; + psDevInfo->sBufferInfo.ui32Flags = 0; + psDevInfo->sBufferInfo.ui32BufferCount = (IMG_UINT32)psDevInfo->ulNumBuffers; + + strncpy(psDevInfo->sBufferInfo.szDeviceName, BUFFERCLASS_DEVICE_NAME, MAX_BUFFER_DEVICE_NAME_SIZE); + + /* + Bsetup the BC Jtable so SRVKM can call into this driver + */ + psDevInfo->sBCJTable.ui32TableSize = sizeof(PVRSRV_BC_SRV2BUFFER_KMJTABLE); + psDevInfo->sBCJTable.pfnOpenBCDevice = OpenBCDevice; + psDevInfo->sBCJTable.pfnCloseBCDevice = CloseBCDevice; + psDevInfo->sBCJTable.pfnGetBCBuffer = GetBCBuffer; + psDevInfo->sBCJTable.pfnGetBCInfo = GetBCInfo; + psDevInfo->sBCJTable.pfnGetBufferAddr = GetBCBufferAddr; + + + /* register device with services and retrieve device index */ + /* This example only registers 1 device, but for multiple buffer streams, register more devices */ + if(psDevInfo->sPVRJTable.pfnPVRSRVRegisterBCDevice (&psDevInfo->sBCJTable, + (IMG_UINT32*)&psDevInfo->ulDeviceID ) != PVRSRV_OK) + { + return (BCE_ERROR_DEVICE_REGISTER_FAILED);/* failure */ + } + } + + /* increment the ref count */ + psDevInfo->ulRefCount++; + + /* return success */ + return (BCE_OK); +} + +/* + * Unregister the device with services module srvkm. + */ +BCE_ERROR BC_Example_Unregister(void) +{ + BC_EXAMPLE_DEVINFO *psDevInfo; + + psDevInfo = GetAnchorPtr(); + + /* check DevInfo has been setup */ + if (psDevInfo == NULL) + { + return (BCE_ERROR_GENERIC);/* failure */ + } + /* decrement ref count */ + psDevInfo->ulRefCount--; + + if (psDevInfo->ulRefCount == 0) + { + /* all references gone - de-init device information */ + PVRSRV_BC_BUFFER2SRV_KMJTABLE *psJTable = &psDevInfo->sPVRJTable; + + + /* Remove the device from kernel services device register */ + if (psJTable->pfnPVRSRVRemoveBCDevice(psDevInfo->ulDeviceID) != PVRSRV_OK) + { + return (BCE_ERROR_GENERIC);/* failure */ + } + + if (BCClosePVRServices(psDevInfo->hPVRServices) != BCE_OK) + { + psDevInfo->hPVRServices = NULL; + return (BCE_ERROR_GENERIC);/* failure */ + } + + if (psDevInfo->psSystemBuffer) + { + BCFreeKernelMem(psDevInfo->psSystemBuffer); + } + + /* de-allocate data structure */ + BCFreeKernelMem(psDevInfo); + + /* clear the top-level anchor */ + SetAnchorPtr(NULL); + } + + /* return success */ + return (BCE_OK); +} + + +/* + * Create shared buffers. + */ +BCE_ERROR BC_Example_Buffers_Create(void) +{ + BC_EXAMPLE_DEVINFO *psDevInfo; + unsigned long i; +#if !defined(BC_DISCONTIG_BUFFERS) + IMG_CPU_PHYADDR sSystemBufferCPUPAddr; +#endif + PVRSRV_PIXEL_FORMAT pixelformat = BC_EXAMPLE_PIXELFORMAT; + static IMG_UINT32 ui32Width = BC_EXAMPLE_WIDTH; + static IMG_UINT32 ui32Height = BC_EXAMPLE_HEIGHT; + static IMG_UINT32 ui32ByteStride = BC_EXAMPLE_STRIDE; + + IMG_UINT32 ui32MaxWidth = 320 * 4; + + /* + get the anchor pointer + */ + psDevInfo = GetAnchorPtr(); + if (psDevInfo == NULL) + { + /* + * This device was not correctly registered/created. + */ + return (BCE_ERROR_DEVICE_REGISTER_FAILED); + } + if (psDevInfo->ulNumBuffers) + { + /* Buffers already allocated */ + return (BCE_ERROR_GENERIC); + } + + /* Setup Buffer Info */ + psDevInfo->sBufferInfo.pixelformat = BC_EXAMPLE_PIXELFORMAT; + psDevInfo->sBufferInfo.ui32Width = ui32Width; + psDevInfo->sBufferInfo.ui32Height = ui32Height; + psDevInfo->sBufferInfo.ui32ByteStride = ui32ByteStride; + psDevInfo->sBufferInfo.ui32BufferDeviceID = BC_EXAMPLE_DEVICEID; + psDevInfo->sBufferInfo.ui32Flags = PVRSRV_BC_FLAGS_YUVCSC_FULL_RANGE | PVRSRV_BC_FLAGS_YUVCSC_BT601; + + for(i=psDevInfo->ulNumBuffers; i < BC_EXAMPLE_NUM_BUFFERS; i++) + { + unsigned long ulSize = (unsigned long)(ui32Height * ui32ByteStride); + + if(psDevInfo->sBufferInfo.pixelformat == PVRSRV_PIXEL_FORMAT_NV12) + { + /* Second plane is quarter size, but 2bytes per pixel */ + ulSize += ((ui32ByteStride >> 1) * (ui32Height >> 1) << 1); + } + else if(psDevInfo->sBufferInfo.pixelformat == PVRSRV_PIXEL_FORMAT_YV12) + { + /* Second plane is quarter size, but 1byte per pixel */ + ulSize += (ui32ByteStride >> 1) * (ui32Height >> 1); + + /* third plane is quarter size, but 1byte per pixel */ + ulSize += (ui32ByteStride >> 1) * (ui32Height >> 1); + } + +#if defined(BC_DISCONTIG_BUFFERS) + if (BCAllocDiscontigMemory(ulSize, + &psDevInfo->psSystemBuffer[i].hMemHandle, + &psDevInfo->psSystemBuffer[i].sCPUVAddr, + &psDevInfo->psSystemBuffer[i].psSysAddr) != BCE_OK) + { + break; + } +#else + /* Setup system buffer */ + if (BCAllocContigMemory(ulSize, + &psDevInfo->psSystemBuffer[i].hMemHandle, + &psDevInfo->psSystemBuffer[i].sCPUVAddr, + &sSystemBufferCPUPAddr) != BCE_OK) + { + break; + } + psDevInfo->psSystemBuffer[i].sSysAddr = CpuPAddrToSysPAddrBC(sSystemBufferCPUPAddr); + psDevInfo->psSystemBuffer[i].sPageAlignSysAddr.uiAddr = (psDevInfo->psSystemBuffer[i].sSysAddr.uiAddr & 0xFFFFF000); +#endif + + psDevInfo->ulNumBuffers++; + + psDevInfo->psSystemBuffer[i].ulSize = ulSize; + psDevInfo->psSystemBuffer[i].psSyncData = NULL; + } + + psDevInfo->sBufferInfo.ui32BufferCount = (IMG_UINT32)psDevInfo->ulNumBuffers; + + /* + Bsetup the BC Jtable so SRVKM can call into this driver + */ + psDevInfo->sBCJTable.ui32TableSize = sizeof(PVRSRV_BC_SRV2BUFFER_KMJTABLE); + psDevInfo->sBCJTable.pfnOpenBCDevice = OpenBCDevice; + psDevInfo->sBCJTable.pfnCloseBCDevice = CloseBCDevice; + psDevInfo->sBCJTable.pfnGetBCBuffer = GetBCBuffer; + psDevInfo->sBCJTable.pfnGetBCInfo = GetBCInfo; + psDevInfo->sBCJTable.pfnGetBufferAddr = GetBCBufferAddr; + + + + /* Update buffer's parameters for reconfiguration next time */ + if (ui32Width < ui32MaxWidth) + { + switch(pixelformat) + { + case PVRSRV_PIXEL_FORMAT_NV12: + case PVRSRV_PIXEL_FORMAT_YV12: + { + ui32Width += 320; + ui32Height += 160; + ui32ByteStride = ui32Width; + break; + } + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_VYUY: + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_UYVY: + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_YUYV: + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_YVYU: + { + ui32Width += 320; + ui32Height += 160; + ui32ByteStride = ui32Width*2; + break; + } + case PVRSRV_PIXEL_FORMAT_RGB565: + { + ui32Width += 320; + ui32Height += 160; + ui32ByteStride = ui32Width*2; + break; + } + default: + { + return (BCE_ERROR_INVALID_PARAMS); + } + } + } + else + { + ui32Width = BC_EXAMPLE_WIDTH; + ui32Height = BC_EXAMPLE_HEIGHT; + ui32ByteStride = BC_EXAMPLE_STRIDE; + } + + /* return success */ + return (BCE_OK); +} + + +/* + * Destroy shared buffers. + */ +BCE_ERROR BC_Example_Buffers_Destroy(void) +{ + BC_EXAMPLE_DEVINFO *psDevInfo; + unsigned long i; + + psDevInfo = GetAnchorPtr(); + + /* check DevInfo has been setup */ + if (psDevInfo == NULL) + { + /* + This device was not correctly registered/created. + */ + return (BCE_ERROR_DEVICE_REGISTER_FAILED); + } + + /* + Free all allocated surfaces + */ + for(i = 0; i < psDevInfo->ulNumBuffers; i++) + { +#if defined(BC_DISCONTIG_BUFFERS) + BCFreeDiscontigMemory(psDevInfo->psSystemBuffer[i].ulSize, + psDevInfo->psSystemBuffer[i].hMemHandle, + psDevInfo->psSystemBuffer[i].sCPUVAddr, + psDevInfo->psSystemBuffer[i].psSysAddr); +#else + BCFreeContigMemory(psDevInfo->psSystemBuffer[i].ulSize, + psDevInfo->psSystemBuffer[i].hMemHandle, + psDevInfo->psSystemBuffer[i].sCPUVAddr, + SysPAddrToCpuPAddrBC(psDevInfo->psSystemBuffer[i].sSysAddr)); +#endif + } + psDevInfo->ulNumBuffers = 0; + + /* Reset buffer info */ + psDevInfo->sBufferInfo.pixelformat = PVRSRV_PIXEL_FORMAT_UNKNOWN; + psDevInfo->sBufferInfo.ui32Width = 0; + psDevInfo->sBufferInfo.ui32Height = 0; + psDevInfo->sBufferInfo.ui32ByteStride = 0; + psDevInfo->sBufferInfo.ui32BufferDeviceID = BC_EXAMPLE_DEVICEID; + psDevInfo->sBufferInfo.ui32Flags = 0; + psDevInfo->sBufferInfo.ui32BufferCount = (IMG_UINT32)psDevInfo->ulNumBuffers; + + /* return success */ + return (BCE_OK); +} + + +/* + * This function does both registration and buffer allocation at + * boot time. + */ +BCE_ERROR BC_Example_Init(void) +{ + BCE_ERROR eError; + + eError = BC_Example_Register(); + if (eError != BCE_OK) + { + return eError; + } + + eError = BC_Example_Buffers_Create(); + if (eError != BCE_OK) + { + return eError; + } + + return (BCE_OK); +} + +/* + * Destroy buffers and unregister device. + */ +BCE_ERROR BC_Example_Deinit(void) +{ + BCE_ERROR eError; + + eError = BC_Example_Buffers_Destroy(); + if (eError != BCE_OK) + { + return eError; + } + + eError = BC_Example_Unregister(); + if (eError != BCE_OK) + { + return eError; + } + + return (BCE_OK); +} + +/****************************************************************************** + End of file (bufferclass_example.c) +******************************************************************************/ diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example.h b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example.h new file mode 100644 index 0000000..4cdeb39 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example.h @@ -0,0 +1,238 @@ +/*************************************************************************/ /*! +@Title bufferclass_example kernel driver structures and prototypes +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ +#ifndef __BC_EXAMPLE_H__ +#define __BC_EXAMPLE_H__ + +/* IMG services headers */ +#include "img_defs.h" +#include "servicesext.h" +#include "kernelbuffer.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +#define BC_EXAMPLE_NUM_BUFFERS 3 + +#define NV12 1 +//#define YV12 1 +//#define YUV422 1 + +#ifdef NV12 + +#define BC_EXAMPLE_WIDTH (320) +#define BC_EXAMPLE_HEIGHT (160) +#define BC_EXAMPLE_STRIDE (320) +#define BC_EXAMPLE_PIXELFORMAT (PVRSRV_PIXEL_FORMAT_NV12) + +#else +#ifdef YV12 + +#define BC_EXAMPLE_WIDTH (320) +#define BC_EXAMPLE_HEIGHT (160) +#define BC_EXAMPLE_STRIDE (320) +#define BC_EXAMPLE_PIXELFORMAT (PVRSRV_PIXEL_FORMAT_YV12) + +#else +#ifdef YUV422 + +#define BC_EXAMPLE_WIDTH (320) +#define BC_EXAMPLE_HEIGHT (160) +#define BC_EXAMPLE_STRIDE (320*2) +#define BC_EXAMPLE_PIXELFORMAT (PVRSRV_PIXEL_FORMAT_FOURCC_ORG_UYVY) + +#else + +#define BC_EXAMPLE_WIDTH (320) +#define BC_EXAMPLE_HEIGHT (160) +#define BC_EXAMPLE_STRIDE (320*2) +#define BC_EXAMPLE_PIXELFORMAT (PVRSRV_PIXEL_FORMAT_RGB565) + +#endif +#endif +#endif + +#define BC_EXAMPLE_DEVICEID 0 + +typedef void * BCE_HANDLE; + +typedef enum tag_bce_bool +{ + BCE_FALSE = 0, + BCE_TRUE = 1, +} BCE_BOOL, *BCE_PBOOL; + +/* BC_NOHW buffer structure */ +typedef struct BC_EXAMPLE_BUFFER_TAG +{ + unsigned long ulSize; + BCE_HANDLE hMemHandle; + + /* IMG structures used, to minimise API function code */ + /* replace with own structures where necessary */ +#if defined(BC_DISCONTIG_BUFFERS) + IMG_SYS_PHYADDR *psSysAddr; +#else + IMG_SYS_PHYADDR sSysAddr; + IMG_SYS_PHYADDR sPageAlignSysAddr; +#endif + IMG_CPU_VIRTADDR sCPUVAddr; + PVRSRV_SYNC_DATA *psSyncData; + + struct BC_EXAMPLE_BUFFER_TAG *psNext; +} BC_EXAMPLE_BUFFER; + + +/* kernel device information structure */ +typedef struct BC_EXAMPLE_DEVINFO_TAG +{ + unsigned long ulDeviceID; + + BC_EXAMPLE_BUFFER *psSystemBuffer; + + /* number of supported buffers */ + unsigned long ulNumBuffers; + + /* jump table into PVR services */ + PVRSRV_BC_BUFFER2SRV_KMJTABLE sPVRJTable; + + /* jump table into BC */ + PVRSRV_BC_SRV2BUFFER_KMJTABLE sBCJTable; + + /* + handle for connection to kernel services + - OS specific - may not be required + */ + BCE_HANDLE hPVRServices; + + /* ref count */ + unsigned long ulRefCount; + + /* IMG structures used, to minimise API function code */ + /* replace with own structures where necessary */ + BUFFER_INFO sBufferInfo; + +} BC_EXAMPLE_DEVINFO; + + +/*! + ***************************************************************************** + * Error values + *****************************************************************************/ +typedef enum _BCE_ERROR_ +{ + BCE_OK = 0, + BCE_ERROR_GENERIC = 1, + BCE_ERROR_OUT_OF_MEMORY = 2, + BCE_ERROR_TOO_FEW_BUFFERS = 3, + BCE_ERROR_INVALID_PARAMS = 4, + BCE_ERROR_INIT_FAILURE = 5, + BCE_ERROR_CANT_REGISTER_CALLBACK = 6, + BCE_ERROR_INVALID_DEVICE = 7, + BCE_ERROR_DEVICE_REGISTER_FAILED = 8, + BCE_ERROR_NO_PRIMARY = 9 +} BCE_ERROR; + + +#ifndef UNREFERENCED_PARAMETER +#define UNREFERENCED_PARAMETER(param) (param) = (param) +#endif + +#ifndef NULL +#define NULL 0 +#endif + +BCE_ERROR BC_Example_Register(void); +BCE_ERROR BC_Example_Unregister(void); +BCE_ERROR BC_Example_Buffers_Create(void); +BCE_ERROR BC_Example_Buffers_Destroy(void); +BCE_ERROR BC_Example_Init(void); +BCE_ERROR BC_Example_Deinit(void); + +/* OS Specific APIs */ +BCE_ERROR BCOpenPVRServices(BCE_HANDLE *phPVRServices); +BCE_ERROR BCClosePVRServices(BCE_HANDLE hPVRServices); + +void *BCAllocKernelMem(unsigned long ulSize); +void BCFreeKernelMem(void *pvMem); +#if defined(BC_DISCONTIG_BUFFERS) +BCE_ERROR BCAllocDiscontigMemory(unsigned long ulSize, + BCE_HANDLE unref__ *phMemHandle, + IMG_CPU_VIRTADDR *pLinAddr, + IMG_SYS_PHYADDR **ppPhysAddr); + +void BCFreeDiscontigMemory(unsigned long ulSize, + BCE_HANDLE unref__ hMemHandle, + IMG_CPU_VIRTADDR LinAddr, + IMG_SYS_PHYADDR *pPhysAddr); + +#else + +BCE_ERROR BCAllocContigMemory(unsigned long ulSize, + BCE_HANDLE *phMemHandle, + IMG_CPU_VIRTADDR *pLinAddr, + IMG_CPU_PHYADDR *pPhysAddr); + +void BCFreeContigMemory(unsigned long ulSize, + BCE_HANDLE hMemHandle, + IMG_CPU_VIRTADDR LinAddr, + IMG_CPU_PHYADDR PhysAddr); +#endif + +IMG_SYS_PHYADDR CpuPAddrToSysPAddrBC(IMG_CPU_PHYADDR cpu_paddr); +IMG_CPU_PHYADDR SysPAddrToCpuPAddrBC(IMG_SYS_PHYADDR sys_paddr); + +void *MapPhysAddr(IMG_SYS_PHYADDR sSysAddr, unsigned long ulSize); +void UnMapPhysAddr(void *pvAddr, unsigned long ulSize); + +BCE_ERROR BCGetLibFuncAddr (BCE_HANDLE hExtDrv, char *szFunctionName, PFN_BC_GET_PVRJTABLE *ppfnFuncTable); +BC_EXAMPLE_DEVINFO * GetAnchorPtr(void); + +#if defined(__cplusplus) +} +#endif + +#endif /* __BC_EXAMPLE_H__ */ + +/****************************************************************************** + End of file (bufferclass_example.h) +******************************************************************************/ + diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_linux.c b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_linux.c new file mode 100644 index 0000000..fdb8ce3 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_linux.c @@ -0,0 +1,610 @@ +/*************************************************************************/ /*! +@Title bufferclass example linux specific implementations +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +/************************************************************************** + The 3rd party driver is a specification of an API to integrate the IMG POWERVR + Services driver with 3rd Party display hardware. It is NOT a specification for + a display controller driver, rather a specification to extend the API for a + pre-existing driver for the display hardware. + + The 3rd party driver interface provides IMG POWERVR client drivers (e.g. PVR2D) + with an API abstraction of the system's underlying display hardware, allowing + the client drivers to indirectly control the display hardware and access its + associated memory. + + Functions of the API include + - query primary surface attributes (width, height, stride, pixel format, CPU + physical and virtual address) + - swap/flip chain creation and subsequent query of surface attributes + - asynchronous display surface flipping, taking account of asynchronous read + (flip) and write (render) operations to the display surface + + Note: having queried surface attributes the client drivers are able to map the + display memory to any IMG POWERVR Services device by calling + PVRSRVMapDeviceClassMemory with the display surface handle. + + This code is intended to be an example of how a pre-existing display driver may + be extended to support the 3rd Party Display interface to POWERVR Services + - IMG is not providing a display driver implementation. + **************************************************************************/ + +#include <linux/version.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/slab.h> +#include <linux/fs.h> +#include <asm/uaccess.h> +#include <asm/io.h> + +#if defined(LMA) +#include <linux/pci.h> +#else +#include <linux/dma-mapping.h> +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) +#include <linux/mutex.h> +#endif + +#if defined(BC_DISCONTIG_BUFFERS) +#include <linux/vmalloc.h> +#endif + +#include "bufferclass_example.h" +#include "bufferclass_example_linux.h" +#include "bufferclass_example_private.h" + +#include "pvrmodule.h" + +#define DEVNAME "bc_example" +#define DRVNAME DEVNAME + +#if defined(BCE_USE_SET_MEMORY) +#undef BCE_USE_SET_MEMORY +#endif + +#if (defined(__i386__) || defined(__x86_64__)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) && defined(SUPPORT_LINUX_X86_PAT) && defined(SUPPORT_LINUX_X86_WRITECOMBINE) +#include <asm/cacheflush.h> +#define BCE_USE_SET_MEMORY +#endif + +MODULE_SUPPORTED_DEVICE(DEVNAME); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) +static long BC_Example_Bridge_Unlocked(struct file *file, unsigned int cmd, unsigned long arg); +#else +static int BC_Example_Bridge(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) +static DEFINE_MUTEX(sBCExampleBridgeMutex); +#endif + +#if defined(LDM_PLATFORM) || defined(LDM_PCI) +/* + * Device class used for /sys entries (and udev device node creation) + */ +static struct class *psPvrClass; +#endif + +/* + * This is the major number we use for all nodes in /dev. + */ +static int AssignedMajorNumber; + +static struct file_operations bufferclass_example_fops = { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) + .unlocked_ioctl = BC_Example_Bridge_Unlocked +#else + .ioctl = BC_Example_Bridge +#endif +}; + + +#define unref__ __attribute__ ((unused)) + +#if defined(LMA) +#define PVR_BUFFERCLASS_MEMOFFSET (220 * 1024 * 1024) /* Must be after services localmem region */ +#define PVR_BUFFERCLASS_MEMSIZE (4 * 1024 * 1024) /* Must be before displayclass localmem region */ + +unsigned long g_ulMemBase = 0; +unsigned long g_ulMemCurrent = 0; + +/* PVR device vendor ID */ +#define VENDOR_ID_PVR 0x1010 +#define DEVICE_ID_PVR 0x1CF1 + +#define DEVICE_ID1_PVR 0x1CF2 + + +/* PDP mem (including HP mapping) on base register 2 */ +#define PVR_MEM_PCI_BASENUM 2 +#endif + + +/***************************************************************************** + Function Name: BC_Example_ModInit + Description : Insert the driver into the kernel. + + The device major number is allocated by the kernel dynamically + if AssignedMajorNumber is zero on entry. This means that the + device node (nominally /dev/bc_example) may need to be re-made if + the kernel varies the major number it assigns. The number + does seem to stay constant between runs, but I don't think + this is guaranteed. The node is made as root on the shell + with: + + mknod /dev/bc_example c ? 0 + + where ? is the major number reported by the printk() - look + at the boot log using `dmesg' to see this). + + __init places the function in a special memory section that + the kernel frees once the function has been run. Refer also + to module_init() macro call below. + +*****************************************************************************/ +static int __init BC_Example_ModInit(void) +{ +#if defined(LDM_PLATFORM) || defined(LDM_PCI) + struct device *psDev; +#endif + +#if defined(LMA) + struct pci_dev *psPCIDev; + int error; +#endif + +#if defined(LMA) + psPCIDev = pci_get_device(VENDOR_ID_PVR, DEVICE_ID_PVR, NULL); + if (psPCIDev == NULL) + { + /* Try an alternative PCI ID */ + psPCIDev = pci_get_device(VENDOR_ID_PVR, DEVICE_ID1_PVR, NULL); + } + + if (psPCIDev == NULL) + { + printk(KERN_ERR DRVNAME ": BC_Example_ModInit: pci_get_device failed\n"); + + goto ExitError; + } + + if ((error = pci_enable_device(psPCIDev)) != 0) + { + printk(KERN_ERR DRVNAME ": BC_Example_ModInit: pci_enable_device failed (%d)\n", error); + goto ExitError; + } +#endif + + AssignedMajorNumber = register_chrdev(0, DEVNAME, &bufferclass_example_fops); + + if (AssignedMajorNumber <= 0) + { + printk(KERN_ERR DRVNAME ": BC_Example_ModInit: unable to get major number\n"); + + goto ExitDisable; + } + +#if defined(DEBUG) + printk(KERN_ERR DRVNAME ": BC_Example_ModInit: major device %d\n", AssignedMajorNumber); +#endif + +#if defined(LDM_PLATFORM) || defined(LDM_PCI) + /* + * This code (using GPL symbols) facilitates automatic device + * node creation on platforms with udev (or similar). + */ + psPvrClass = class_create(THIS_MODULE, "bc_example"); + + if (IS_ERR(psPvrClass)) + { + printk(KERN_ERR DRVNAME ": BC_Example_ModInit: unable to create class (%ld)", PTR_ERR(psPvrClass)); + goto ExitUnregister; + } + + psDev = device_create(psPvrClass, NULL, MKDEV(AssignedMajorNumber, 0), +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26)) + NULL, +#endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26)) */ + DEVNAME); + if (IS_ERR(psDev)) + { + printk(KERN_ERR DRVNAME ": BC_Example_ModInit: unable to create device (%ld)", PTR_ERR(psDev)); + goto ExitDestroyClass; + } +#endif /* defined(LDM_PLATFORM) || defined(LDM_PCI) */ + +#if defined(LMA) + /* + * We don't do a pci_request_region for PVR_MEM_PCI_BASENUM, + * we assume the SGX driver has done this already. + */ + g_ulMemBase = pci_resource_start(psPCIDev, PVR_MEM_PCI_BASENUM) + PVR_BUFFERCLASS_MEMOFFSET; +#endif + + if(BC_Example_Init() != BCE_OK) + { + printk (KERN_ERR DRVNAME ": BC_Example_ModInit: can't init device\n"); + goto ExitUnregister; + } + +#if defined(LMA) + /* + * To prevent possible problems with system suspend/resume, we don't + * keep the device enabled, but rely on the fact that the SGX driver + * will have done a pci_enable_device. + */ + pci_disable_device(psPCIDev); +#endif + + return 0; + +#if defined(LDM_PLATFORM) || defined(LDM_PCI) +ExitDestroyClass: + class_destroy(psPvrClass); +#endif +ExitUnregister: + unregister_chrdev(AssignedMajorNumber, DEVNAME); +ExitDisable: +#if defined(LMA) + pci_disable_device(psPCIDev); +ExitError: +#endif + return -EBUSY; +} /*BC_Example_ModInit*/ + +/***************************************************************************** + Function Name: BC_Example_ModInit + Description : Remove the driver from the kernel. + + __exit places the function in a special memory section that + the kernel frees once the function has been run. Refer also + to module_exit() macro call below. + +*****************************************************************************/ +static void __exit BC_Example_ModCleanup(void) +{ +#if defined(LDM_PLATFORM) || defined(LDM_PCI) + device_destroy(psPvrClass, MKDEV(AssignedMajorNumber, 0)); + class_destroy(psPvrClass); +#endif + + unregister_chrdev(AssignedMajorNumber, DEVNAME); + + if(BC_Example_Deinit() != BCE_OK) + { + printk (KERN_ERR DRVNAME ": BC_Example_ModCleanup: can't deinit device\n"); + } + +} /*BC_Example_ModCleanup*/ + + +void *BCAllocKernelMem(unsigned long ulSize) +{ + return kmalloc(ulSize, GFP_KERNEL); +} + +void BCFreeKernelMem(void *pvMem) +{ + kfree(pvMem); +} + +#if defined(BC_DISCONTIG_BUFFERS) + +#define RANGE_TO_PAGES(range) (((range) + (PAGE_SIZE - 1)) >> PAGE_SHIFT) +#define VMALLOC_TO_PAGE_PHYS(vAddr) page_to_phys(vmalloc_to_page(vAddr)) + +BCE_ERROR BCAllocDiscontigMemory(unsigned long ulSize, + BCE_HANDLE unref__ *phMemHandle, + IMG_CPU_VIRTADDR *pLinAddr, + IMG_SYS_PHYADDR **ppPhysAddr) +{ + unsigned long ulPages = RANGE_TO_PAGES(ulSize); + IMG_SYS_PHYADDR *pPhysAddr; + unsigned long ulPage; + IMG_CPU_VIRTADDR LinAddr; + + LinAddr = __vmalloc(ulSize, GFP_KERNEL | __GFP_HIGHMEM, pgprot_noncached(PAGE_KERNEL)); + if (!LinAddr) + { + return BCE_ERROR_OUT_OF_MEMORY; + } + + pPhysAddr = kmalloc(ulPages * sizeof(IMG_SYS_PHYADDR), GFP_KERNEL); + if (!pPhysAddr) + { + vfree(LinAddr); + return BCE_ERROR_OUT_OF_MEMORY; + } + + *pLinAddr = LinAddr; + + for (ulPage = 0; ulPage < ulPages; ulPage++) + { + pPhysAddr[ulPage].uiAddr = VMALLOC_TO_PAGE_PHYS(LinAddr); + + LinAddr += PAGE_SIZE; + } + + *ppPhysAddr = pPhysAddr; + + return BCE_OK; +} + +void BCFreeDiscontigMemory(unsigned long ulSize, + BCE_HANDLE unref__ hMemHandle, + IMG_CPU_VIRTADDR LinAddr, + IMG_SYS_PHYADDR *pPhysAddr) +{ + kfree(pPhysAddr); + + vfree(LinAddr); +} +#else /* defined(BC_DISCONTIG_BUFFERS) */ + +BCE_ERROR BCAllocContigMemory(unsigned long ulSize, + BCE_HANDLE unref__ *phMemHandle, + IMG_CPU_VIRTADDR *pLinAddr, + IMG_CPU_PHYADDR *pPhysAddr) +{ +#if defined(LMA) + void *pvLinAddr; + + /* Only allowed a certain amount of memory for bufferclass buffers */ + if(g_ulMemCurrent + ulSize >= PVR_BUFFERCLASS_MEMSIZE) + { + return (BCE_ERROR_OUT_OF_MEMORY); + } + + pvLinAddr = ioremap(g_ulMemBase + g_ulMemCurrent, ulSize); + + if(pvLinAddr) + { + pPhysAddr->uiAddr = g_ulMemBase + g_ulMemCurrent; + *pLinAddr = pvLinAddr; + + /* Not a real allocator; just increment the current address */ + g_ulMemCurrent += ulSize; + return (BCE_OK); + } + return (BCE_ERROR_OUT_OF_MEMORY); +#else /* defined(LMA) */ +#if defined(BCE_USE_SET_MEMORY) + void *pvLinAddr; + unsigned long ulAlignedSize = PAGE_ALIGN(ulSize); + int iPages = (int)(ulAlignedSize >> PAGE_SHIFT); + int iError; + + pvLinAddr = kmalloc(ulAlignedSize, GFP_KERNEL); + BUG_ON(((unsigned long)pvLinAddr) & ~PAGE_MASK); + + iError = set_memory_wc((unsigned long)pvLinAddr, iPages); + if (iError != 0) + { + printk(KERN_ERR DRVNAME ": BCAllocContigMemory: set_memory_wc failed (%d)\n", iError); + return (BCE_ERROR_OUT_OF_MEMORY); + } + + pPhysAddr->uiAddr = virt_to_phys(pvLinAddr); + *pLinAddr = pvLinAddr; + + return (BCE_OK); +#else /* BCE_USE_SET_MEMORY */ + dma_addr_t dma; + void *pvLinAddr; + + pvLinAddr = dma_alloc_coherent(NULL, ulSize, &dma, GFP_KERNEL); + if (pvLinAddr == NULL) + { + return (BCE_ERROR_OUT_OF_MEMORY); + } + + pPhysAddr->uiAddr = dma; + *pLinAddr = pvLinAddr; + + return (BCE_OK); +#endif /* BCE_USE_SET_MEMORY */ +#endif /* defined(LMA) */ +} + +void BCFreeContigMemory(unsigned long ulSize, + BCE_HANDLE unref__ hMemHandle, + IMG_CPU_VIRTADDR LinAddr, + IMG_CPU_PHYADDR PhysAddr) +{ +#if defined(LMA) + g_ulMemCurrent -= ulSize; + iounmap(LinAddr); +#else /* defined(LMA) */ +#if defined(BCE_USE_SET_MEMORY) + unsigned long ulAlignedSize = PAGE_ALIGN(ulSize); + int iError; + int iPages = (int)(ulAlignedSize >> PAGE_SHIFT); + + iError = set_memory_wb((unsigned long)LinAddr, iPages); + if (iError != 0) + { + printk(KERN_ERR DRVNAME ": BCFreeContigMemory: set_memory_wb failed (%d)\n", iError); + } + kfree(LinAddr); +#else /* BCE_USE_SET_MEMORY */ + dma_free_coherent(NULL, ulSize, LinAddr, (dma_addr_t)PhysAddr.uiAddr); +#endif /* BCE_USE_SET_MEMORY */ +#endif /* defined(LMA) */ +} +#endif /* defined(BC_DISCONTIG_BUFFERS) */ + +/************************************************************************** + FUNCTION: CpuPAddrToSysPAddrBC + PURPOSE: Compute a system physical address from a cpu physical + address. + PARAMETERS: In: cpu_paddr - cpu physical address. + RETURNS: system physical address. + **************************************************************************/ +IMG_SYS_PHYADDR CpuPAddrToSysPAddrBC(IMG_CPU_PHYADDR cpu_paddr) +{ + IMG_SYS_PHYADDR sys_paddr; + + /* This would only be an inequality if the CPU's MMU did not point to sys address 0, + ie. multi CPU system */ + sys_paddr.uiAddr = cpu_paddr.uiAddr; + return sys_paddr; +} + +/************************************************************************** + FUNCTION: SysPAddrToCpuPAddrBC + PURPOSE: Compute a cpu physical address + from a system physical address. + PARAMETERS: In: cpu_paddr - system physical address. + RETURNS: cpu physical address. + **************************************************************************/ +IMG_CPU_PHYADDR SysPAddrToCpuPAddrBC(IMG_SYS_PHYADDR sys_paddr) +{ + + IMG_CPU_PHYADDR cpu_paddr; + /* This would only be an inequality if the CPU's MMU did not point to sys address 0, + ie. multi CPU system */ + cpu_paddr.uiAddr = sys_paddr.uiAddr; + return cpu_paddr; +} + +BCE_ERROR BCOpenPVRServices (BCE_HANDLE *phPVRServices) +{ + /* Nothing to do - we have already checked services module insertion */ + *phPVRServices = 0; + return (BCE_OK); +} + + +BCE_ERROR BCClosePVRServices (BCE_HANDLE unref__ hPVRServices) +{ + /* Nothing to do */ + return (BCE_OK); +} + +BCE_ERROR BCGetLibFuncAddr (BCE_HANDLE unref__ hExtDrv, char *szFunctionName, PFN_BC_GET_PVRJTABLE *ppfnFuncTable) +{ + if(strcmp("PVRGetBufferClassJTable", szFunctionName) != 0) + { + return (BCE_ERROR_INVALID_PARAMS); + } + + /* Nothing to do - should be exported from pvrsrv.ko */ + *ppfnFuncTable = PVRGetBufferClassJTable; + + return (BCE_OK); +} + + +static int BC_Example_Bridge(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) +{ + int err = -EFAULT; + int command = _IOC_NR(cmd); + BC_Example_ioctl_package sBridge; + + PVR_UNREFERENCED_PARAMETER(inode); + + if (copy_from_user(&sBridge, (void *)arg, sizeof(sBridge)) != 0) + { + return err; + } + + switch(command) + { + case _IOC_NR(BC_Example_ioctl_fill_buffer): + { + if(FillBuffer(sBridge.inputparam) == -1) + { + return err; + } + break; + } + case _IOC_NR(BC_Example_ioctl_get_buffer_count): + { + if(GetBufferCount(&sBridge.outputparam) == -1) + { + return err; + } + break; + } + case _IOC_NR(BC_Example_ioctl_reconfigure_buffer): + { + if(ReconfigureBuffer(&sBridge.outputparam) == -1) + { + return err; + } + break; + } + default: + return err; + } + + if (copy_to_user((void *)arg, &sBridge, sizeof(sBridge)) != 0) + { + return err; + } + + return 0; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) +static long BC_Example_Bridge_Unlocked(struct file *file, unsigned int cmd, unsigned long arg) +{ + int res; + + mutex_lock(&sBCExampleBridgeMutex); + res = BC_Example_Bridge(NULL, file, cmd, arg); + mutex_unlock(&sBCExampleBridgeMutex); + + return res; +} +#endif + +/* + These macro calls define the initialisation and removal functions of the + driver. Although they are prefixed `module_', they apply when compiling + statically as well; in both cases they define the function the kernel will + run to start/stop the driver. +*/ +module_init(BC_Example_ModInit); +module_exit(BC_Example_ModCleanup); + diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_linux.h b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_linux.h new file mode 100644 index 0000000..65d7860 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_linux.h @@ -0,0 +1,67 @@ +/*************************************************************************/ /*! +@Title bufferclass_example kernel driver interface +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ +#ifndef __BC_EXAMPLE_LINUX_H__ +#define __BC_EXAMPLE_LINUX_H__ + +#include <linux/ioctl.h> + +typedef struct BC_Example_ioctl_package_TAG +{ + int inputparam; + int outputparam; + +}BC_Example_ioctl_package; + +/*!< Nov 2006: according to ioctl-number.txt 'g' wasn't in use. */ +#define BC_EXAMPLE_IOC_GID 'g' + +#define BC_EXAMPLE_IOWR(INDEX) _IOWR(BC_EXAMPLE_IOC_GID, INDEX, BC_Example_ioctl_package) + +#define BC_Example_ioctl_fill_buffer BC_EXAMPLE_IOWR(0) +#define BC_Example_ioctl_get_buffer_count BC_EXAMPLE_IOWR(1) +#define BC_Example_ioctl_reconfigure_buffer BC_EXAMPLE_IOWR(2) + +#endif /* __BC_EXAMPLE_H__ */ + +/****************************************************************************** + End of file (bufferclass_example.h) +******************************************************************************/ + diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_private.c b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_private.c new file mode 100644 index 0000000..d9dbfde --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_private.c @@ -0,0 +1,432 @@ +/*************************************************************************/ /*! +@Title Bufferclass example private functions. +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +/************************************************************************** + The 3rd party driver is a specification of an API to integrate the IMG POWERVR + Services driver with 3rd Party display hardware. It is NOT a specification for + a display controller driver, rather a specification to extend the API for a + pre-existing driver for the display hardware. + + The 3rd party driver interface provides IMG POWERVR client drivers (e.g. PVR2D) + with an API abstraction of the system's underlying display hardware, allowing + the client drivers to indirectly control the display hardware and access its + associated memory. + + Functions of the API include + - query primary surface attributes (width, height, stride, pixel format, CPU + physical and virtual address) + - swap/flip chain creation and subsequent query of surface attributes + - asynchronous display surface flipping, taking account of asynchronous read + (flip) and write (render) operations to the display surface + + Note: having queried surface attributes the client drivers are able to map the + display memory to any IMG POWERVR Services device by calling + PVRSRVMapDeviceClassMemory with the display surface handle. + + This code is intended to be an example of how a pre-existing display driver may + be extended to support the 3rd Party Display interface to POWERVR Services + - IMG is not providing a display driver implementation. + **************************************************************************/ + +#include "bufferclass_example.h" +#include "bufferclass_example_private.h" + +#define MIN(a,b) ((a)<(b)?(a):(b)) + +static void FillNV12Image(void *pvDest, int width, int height, int bytestride) +{ + static int iPhase = 0; + int i, j; + unsigned char u,v,y; + unsigned char *pui8y = (unsigned char *)pvDest; + unsigned short *pui16uv; + unsigned int count = 0; + + for(j=0;j<height;j++) + { + pui8y = (unsigned char *)pvDest + j * bytestride; + count = 0; + + for(i=0;i<width;i++) + { + y = (((i+iPhase)>>6)%(2)==0)? 0x7f:0x00; + + pui8y[count++] = y; + } + } + + for(j=0;j<height;j+=2) + { + pui16uv = (unsigned short *)((unsigned char *)pvDest + height * bytestride + (j / 2) * bytestride); + count = 0; + + for(i=0;i<width;i+=2) + { + u = (j<(height/2))? ((i<(width/2))? 0xFF:0x33) : ((i<(width/2))? 0x33:0xAA); + v = (j<(height/2))? ((i<(width/2))? 0xAC:0x0) : ((i<(width/2))? 0x03:0xEE); + + /* Byte order is VU */ + pui16uv[count++] = (v << 8) | u; + + } + } + + iPhase++; +} + +static void FillYV12Image(void *pvDest, int width, int height, int bytestride) +{ + static int iPhase = 0; + int i, j; + unsigned char u,v,y; + unsigned char *pui8y = (unsigned char *)pvDest; + unsigned char *pui8u, *pui8v; + unsigned int count = 0; + int uvplanestride = bytestride / 2; + int uvplaneheight = height / 2; + + for(j=0;j<height;j++) + { + pui8y = (unsigned char *)pvDest + j * bytestride; + count = 0; + + for(i=0;i<width;i++) + { + y = (((i+iPhase)>>6)%(2)==0)? 0x7f:0x00; + + pui8y[count++] = y; + } + } + + for(j=0;j<height;j+=2) + { + pui8v = (unsigned char *)pvDest + (height * bytestride) + ((j / 2) * uvplanestride); + count = 0; + + for(i=0;i<width;i+=2) + { + v = (j<(height/2))? ((i<(width/2))? 0xAC:0x0) : ((i<(width/2))? 0x03:0xEE); + + pui8v[count++] = v; + } + } + + for(j=0;j<height;j+=2) + { + pui8u = (unsigned char *)pvDest + (height * bytestride) + (uvplaneheight * uvplanestride) + (j / 2) * uvplanestride; + count = 0; + + for(i=0;i<width;i+=2) + { + u = (j<(height/2))? ((i<(width/2))? 0xFF:0x33) : ((i<(width/2))? 0x33:0xAA); + + pui8u[count++] = u; + + } + } + + iPhase++; +} + +static void FillYUV422Image(void *pvDest, int width, int height, int bytestride, PVRSRV_PIXEL_FORMAT pixelformat) +{ + static int iPhase = 0; + int x, y; + unsigned char u,v,y0,y1; + unsigned long *pui32yuv = (unsigned long *)pvDest; + unsigned int count = 0; + + for(y=0;y<height;y++) + { + pui32yuv = (unsigned long *)((unsigned char *)pvDest + y * bytestride); + count = 0; + + for(x=0;x<width; x+=2) + { + u = (y<(height/2))? ((x<(width/2))? 0xFF:0x33) : ((x<(width/2))? 0x33:0xAA); + v = (y<(height/2))? ((x<(width/2))? 0xAA:0x0) : ((x<(width/2))? 0x03:0xEE); + + y0 = y1 = (((x+iPhase)>>6)%(2)==0)? 0x7f:0x00; + + switch(pixelformat) + { + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_VYUY: + pui32yuv[count++] = (y1 << 24) | (u << 16) | (y0 << 8) | v; + break; + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_UYVY: + pui32yuv[count++] = (y1 << 24) | (v << 16) | (y0 << 8) | u; + break; + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_YUYV: + pui32yuv[count++] = (v << 24) | (y1 << 16) | (u << 8) | y0; + break; + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_YVYU: + pui32yuv[count++] = (u << 24) | (y1 << 16) | (v << 8) | y0; + break; + + default: + break; + + } + + } + } + + iPhase++; +} + +static void FillRGB565Image(void *pvDest, int width, int height, int bytestride) +{ + int i, Count; + unsigned long *pui32Addr = (unsigned long *)pvDest; + unsigned short *pui16Addr = (unsigned short *)pvDest; + unsigned long Colour32; + unsigned short Colour16; + static unsigned char Colour8 = 0;//debug colour + + Colour16 = (Colour8>>3) | ((Colour8>>2)<<5) | ((Colour8>>3)<<11); + Colour32 = Colour16 | Colour16 << 16; + + Count = (height * bytestride)>>2; + + for(i=0; i<Count; i++) + { + pui32Addr[i] = Colour32; + } + + Count = height; + + pui16Addr = (unsigned short *)((unsigned char *)pvDest + (2 * Colour8)); + + for(i=0; i<Count; i++) + { + *pui16Addr = 0xF800U; + + pui16Addr = (unsigned short *)((unsigned char *)pui16Addr + bytestride); + } + Count = bytestride >> 2; + + pui32Addr = (unsigned long *)((unsigned char *)pvDest + (bytestride * (MIN(height - 1, 0xFF) - Colour8))); + + for(i=0; i<Count; i++) + { + pui32Addr[i] = 0x001F001FUL; + } + + /* advance the colour */ + Colour8 = (Colour8 + 1) % MIN(height - 1, 0xFFU); +} + + +/*! +****************************************************************************** + + @Function FillBuffer + + @Description + + Fills pixels into a buffer specified by index + + @Input ui32BufferIndex - buffer index + + @Return 0 - success, -1 - failure + +******************************************************************************/ +int FillBuffer(unsigned int uiBufferIndex) +{ + BC_EXAMPLE_DEVINFO *psDevInfo = GetAnchorPtr(); + BC_EXAMPLE_BUFFER *psBuffer; + BUFFER_INFO *psBufferInfo; + PVRSRV_SYNC_DATA *psSyncData; + + /* check DevInfo has been setup */ + if(psDevInfo == NULL) + { + return -1;/* failure */ + } + + psBuffer = &psDevInfo->psSystemBuffer[uiBufferIndex]; + psBufferInfo = &psDevInfo->sBufferInfo; + + /* This may be NULL, as it is only registered once texture streaming starts. */ + psSyncData = psBuffer->psSyncData; + + if(psSyncData) + { + /* ensure all reads have flushed on the buffer */ + if(psSyncData->ui32ReadOpsPending != psSyncData->ui32ReadOpsComplete) + { + return -1;/* failure */ + } + + /* take a write-lock on the new buffer to capture to */ + psSyncData->ui32WriteOpsPending++; + } + + switch(psBufferInfo->pixelformat) + { + case PVRSRV_PIXEL_FORMAT_RGB565: + default: + { + FillRGB565Image(psBuffer->sCPUVAddr, + psBufferInfo->ui32Width, + psBufferInfo->ui32Height, + psBufferInfo->ui32ByteStride); + break; + } + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_VYUY: + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_UYVY: + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_YUYV: + case PVRSRV_PIXEL_FORMAT_FOURCC_ORG_YVYU: + { + FillYUV422Image(psBuffer->sCPUVAddr, + psBufferInfo->ui32Width, + psBufferInfo->ui32Height, + psBufferInfo->ui32ByteStride, + psBufferInfo->pixelformat); + break; + } + case PVRSRV_PIXEL_FORMAT_NV12: + { + FillNV12Image(psBuffer->sCPUVAddr, + psBufferInfo->ui32Width, + psBufferInfo->ui32Height, + psBufferInfo->ui32ByteStride); + break; + } + case PVRSRV_PIXEL_FORMAT_YV12: + { + FillYV12Image(psBuffer->sCPUVAddr, + psBufferInfo->ui32Width, + psBufferInfo->ui32Height, + psBufferInfo->ui32ByteStride); + break; + } + } + + /* unlock the buffer, signalling the writes are complete */ + if(psSyncData) + { + psSyncData->ui32WriteOpsComplete++; + + if (NULL != psDevInfo->sPVRJTable.pfnPVRSRVScheduleDevices) + { + (*psDevInfo->sPVRJTable.pfnPVRSRVScheduleDevices)(); + } + } + + return 0; +} + + +/*! +****************************************************************************** + + @Function GetBufferCount + + @Description + + returns buffer count + + @Output pulBufferCount - buffer count + + @Return 0 - success, -1 - failure + +******************************************************************************/ +int GetBufferCount(unsigned int *puiBufferCount) +{ + BC_EXAMPLE_DEVINFO *psDevInfo = GetAnchorPtr(); + + /* check DevInfo has been setup */ + if(psDevInfo == IMG_NULL) + { + return -1;/* failure */ + } + + /* return buffer count */ + *puiBufferCount = (unsigned int)psDevInfo->sBufferInfo.ui32BufferCount; + + return 0; +} + + + +/****************************************************************************** + + @Function ReconfigureBuffer + + @Description + + returns whether reconfiguration succeeds or not + + @Output uiSucceed : 1 - succeeded, 0 - failed + + @Return 0 - success, -1 - failure + +******************************************************************************/ +int ReconfigureBuffer(unsigned int *uiSucceed) +{ + BCE_ERROR eError; + + /* Destroy the shared buffers of the current buffer class device */ + eError = BC_Example_Buffers_Destroy(); + + if (eError != BCE_OK) + { + *uiSucceed = 0; + return -1; + } + + /* No need to un-register and then re-register the device with services module srvkm */ + + + /* Recreate shared buffers with reconfigured parameters */ + eError = BC_Example_Buffers_Create(); + + if (eError != BCE_OK) + { + *uiSucceed = 0; + return -1; + } + + /* return uiSucceed as succeeded 1 */ + *uiSucceed = 1; + return 0; +} diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_private.h b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_private.h new file mode 100644 index 0000000..8d95e2b --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/bufferclass_example/bufferclass_example_private.h @@ -0,0 +1,49 @@ +/*************************************************************************/ /*! +@Title Bufferclass example internal interfaces. +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#ifndef _BUFFERCLASS_EXAMPLE_PRIVATE_H_ +#define _BUFFERCLASS_EXAMPLE_PRIVATE_H_ + +int FillBuffer(unsigned int uiBufferIndex); +int GetBufferCount(unsigned int *puiBufferCount); +int ReconfigureBuffer(unsigned int *uiSucceed); + +#endif /* _BUFFERCLASS_EXAMPLE_PRIVATE_H_ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_nohw/dc_nohw_displayclass.c b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_nohw/dc_nohw_displayclass.c index d47a171..5a6f99f 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_nohw/dc_nohw_displayclass.c +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_nohw/dc_nohw_displayclass.c @@ -374,79 +374,90 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, { return (PVRSRV_ERROR_FLIP_CHAIN_EXISTS); } - - /* check the buffer count */ - if(ui32BufferCount > DC_NOHW_MAX_BACKBUFFERS) - { - return (PVRSRV_ERROR_TOOMANYBUFFERS); - } - - /* - verify the DST/SRC attributes - - SRC/DST must match the current display mode config - */ - if(psDstSurfAttrib->pixelformat != psDevInfo->sSysFormat.pixelformat - || psDstSurfAttrib->sDims.ui32ByteStride != psDevInfo->sSysDims.ui32ByteStride - || psDstSurfAttrib->sDims.ui32Width != psDevInfo->sSysDims.ui32Width - || psDstSurfAttrib->sDims.ui32Height != psDevInfo->sSysDims.ui32Height) - { - /* DST doesn't match the current mode */ - return (PVRSRV_ERROR_INVALID_PARAMS); - } - - if(psDstSurfAttrib->pixelformat != psSrcSurfAttrib->pixelformat - || psDstSurfAttrib->sDims.ui32ByteStride != psSrcSurfAttrib->sDims.ui32ByteStride - || psDstSurfAttrib->sDims.ui32Width != psSrcSurfAttrib->sDims.ui32Width - || psDstSurfAttrib->sDims.ui32Height != psSrcSurfAttrib->sDims.ui32Height) - { - /* DST doesn't match the SRC */ - return (PVRSRV_ERROR_INVALID_PARAMS); - } - - /* INTEGRATION_POINT: check the flags */ - UNREFERENCED_PARAMETER(ui32Flags); - + /* create a swapchain structure */ psSwapChain = (DC_NOHW_SWAPCHAIN*)AllocKernelMem(sizeof(DC_NOHW_SWAPCHAIN)); if(!psSwapChain) { return (PVRSRV_ERROR_OUT_OF_MEMORY); } - - psBuffer = (DC_NOHW_BUFFER*)AllocKernelMem(sizeof(DC_NOHW_BUFFER) * ui32BufferCount); - if(!psBuffer) - { - FreeKernelMem(psSwapChain); - return (PVRSRV_ERROR_OUT_OF_MEMORY); - } - - /* initialise allocations */ + memset(psSwapChain, 0, sizeof(DC_NOHW_SWAPCHAIN)); - memset(psBuffer, 0, sizeof(DC_NOHW_BUFFER) * ui32BufferCount); - - psSwapChain->ulBufferCount = (unsigned long)ui32BufferCount; - psSwapChain->psBuffer = psBuffer; - /* link the buffers */ - for(i=0; i<ui32BufferCount-1; i++) + if (ui32BufferCount) { - psBuffer[i].psNext = &psBuffer[i+1]; - } - /* and link last to first */ - psBuffer[i].psNext = &psBuffer[0]; - - /* populate the buffers */ - for(i=0; i<ui32BufferCount; i++) - { - psBuffer[i].psSyncData = ppsSyncData[i]; + + /* check the buffer count */ + if(ui32BufferCount > DC_NOHW_MAX_BACKBUFFERS) + { + return (PVRSRV_ERROR_TOOMANYBUFFERS); + } + + /* + verify the DST/SRC attributes + - SRC/DST must match the current display mode config + */ + if(psDstSurfAttrib->pixelformat != psDevInfo->sSysFormat.pixelformat + || psDstSurfAttrib->sDims.ui32ByteStride != psDevInfo->sSysDims.ui32ByteStride + || psDstSurfAttrib->sDims.ui32Width != psDevInfo->sSysDims.ui32Width + || psDstSurfAttrib->sDims.ui32Height != psDevInfo->sSysDims.ui32Height) + { + /* DST doesn't match the current mode */ + return (PVRSRV_ERROR_INVALID_PARAMS); + } + + if(psDstSurfAttrib->pixelformat != psSrcSurfAttrib->pixelformat + || psDstSurfAttrib->sDims.ui32ByteStride != psSrcSurfAttrib->sDims.ui32ByteStride + || psDstSurfAttrib->sDims.ui32Width != psSrcSurfAttrib->sDims.ui32Width + || psDstSurfAttrib->sDims.ui32Height != psSrcSurfAttrib->sDims.ui32Height) + { + /* DST doesn't match the SRC */ + return (PVRSRV_ERROR_INVALID_PARAMS); + } + + /* INTEGRATION_POINT: check the flags */ + UNREFERENCED_PARAMETER(ui32Flags); + + + + psBuffer = (DC_NOHW_BUFFER*)AllocKernelMem(sizeof(DC_NOHW_BUFFER) * ui32BufferCount); + if(!psBuffer) + { + FreeKernelMem(psSwapChain); + return (PVRSRV_ERROR_OUT_OF_MEMORY); + } + + /* initialise allocations */ + memset(psBuffer, 0, sizeof(DC_NOHW_BUFFER) * ui32BufferCount); + + psSwapChain->ulBufferCount = (unsigned long)ui32BufferCount; + psSwapChain->psBuffer = psBuffer; + + /* link the buffers */ + for(i=0; i<ui32BufferCount-1; i++) + { + psBuffer[i].psNext = &psBuffer[i+1]; + } + /* and link last to first */ + psBuffer[i].psNext = &psBuffer[0]; + + /* populate the buffers */ + for(i=0; i<ui32BufferCount; i++) + { + psBuffer[i].psSyncData = ppsSyncData[i]; #if defined(DC_NOHW_DISCONTIG_BUFFERS) - psBuffer[i].psSysAddr = psDevInfo->asBackBuffers[i].psSysAddr; + psBuffer[i].psSysAddr = psDevInfo->asBackBuffers[i].psSysAddr; #else - psBuffer[i].sSysAddr = psDevInfo->asBackBuffers[i].sSysAddr; + psBuffer[i].sSysAddr = psDevInfo->asBackBuffers[i].sSysAddr; #endif - psBuffer[i].sDevVAddr = psDevInfo->asBackBuffers[i].sDevVAddr; - psBuffer[i].sCPUVAddr = psDevInfo->asBackBuffers[i].sCPUVAddr; - psBuffer[i].hSwapChain = (DC_HANDLE)psSwapChain; + psBuffer[i].sDevVAddr = psDevInfo->asBackBuffers[i].sDevVAddr; + psBuffer[i].sCPUVAddr = psDevInfo->asBackBuffers[i].sCPUVAddr; + psBuffer[i].hSwapChain = (DC_HANDLE)psSwapChain; + } + } + else + { + psSwapChain->psBuffer = NULL; } /* mark swapchain's existence */ @@ -478,7 +489,10 @@ static PVRSRV_ERROR DestroyDCSwapChain(IMG_HANDLE hDevice, psSwapChain = (DC_NOHW_SWAPCHAIN*)hSwapChain; /* free resources */ - FreeKernelMem(psSwapChain->psBuffer); + if (psSwapChain->psBuffer) + { + FreeKernelMem(psSwapChain->psBuffer); + } FreeKernelMem(psSwapChain); /* mark swapchain as not existing */ @@ -598,8 +612,9 @@ static PVRSRV_ERROR SwapToDCBuffer(IMG_HANDLE hDevice, static DC_ERROR Flip(DC_NOHW_DEVINFO *psDevInfo, DC_NOHW_BUFFER *psBuffer) { + UNREFERENCED_PARAMETER(psBuffer); /* check parameters */ - if(!psDevInfo || !psBuffer) + if(!psDevInfo) { return (DC_ERROR_INVALID_PARAMS); } @@ -617,6 +632,8 @@ static IMG_BOOL ProcessFlip(IMG_HANDLE hCmdCookie, DISPLAYCLASS_FLIP_COMMAND *psFlipCmd; DC_NOHW_DEVINFO *psDevInfo; DC_NOHW_BUFFER *psBuffer; + + UNREFERENCED_PARAMETER(ui32DataSize); /* check parameters */ if(!hCmdCookie) @@ -626,7 +643,9 @@ static IMG_BOOL ProcessFlip(IMG_HANDLE hCmdCookie, /* validate data packet */ psFlipCmd = (DISPLAYCLASS_FLIP_COMMAND*)pvData; - if (psFlipCmd == IMG_NULL || sizeof(DISPLAYCLASS_FLIP_COMMAND) != ui32DataSize) + /* Under android, this may be a DISPLAYCLASS_FLIP_COMMAND2, but the structs + * are compatable for everything used by dc_nohw so it makes no difference */ + if (psFlipCmd == IMG_NULL) { return (IMG_FALSE); } diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/3rdparty_dc_drm_shared.h b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/3rdparty_dc_drm_shared.h new file mode 100644 index 0000000..dc327e3 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/3rdparty_dc_drm_shared.h @@ -0,0 +1,66 @@ +/*************************************************************************/ /*! +@Title OMAP Linux display driver shared DRM structures +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@Description OMAP Linux display driver DRM structures shared between + kernel and user space. +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ +#ifndef __3RDPARTY_DC_DRM_SHARED_H__ +#define __3RDPARTY_DC_DRM_SHARED_H__ +#if defined(SUPPORT_DRI_DRM) + +typedef struct drm_pvr_display_cmd_tag +{ + uint32_t cmd; + uint32_t dev; +} drm_pvr_display_cmd; + +#define PVR_DRM_DISP_CMD_ENTER_VT 1 +#define PVR_DRM_DISP_CMD_LEAVE_VT 2 + +#define PVR_DRM_DISP_CMD_ON 3 +#define PVR_DRM_DISP_CMD_STANDBY 4 +#define PVR_DRM_DISP_CMD_SUSPEND 5 +#define PVR_DRM_DISP_CMD_OFF 6 + +#endif /* defined(SUPPORT_DRI_DRM) */ +#endif /* __3RDPARTY_DC_DRM_SHARED_H__ */ + +/****************************************************************************** + End of file (3rdparty_dc_drm_shared.h) +******************************************************************************/ diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/Kbuild.mk b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/Kbuild.mk index 7f4fd99..d442f79 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/Kbuild.mk +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/Kbuild.mk @@ -40,8 +40,8 @@ ccflags-y += \ -I$(TOP)/services4/3rdparty/dc_omapfb3_linux \ - -I$(KERNELDIR)/drivers/video/omap2 \ - -I$(KERNELDIR)/arch/arm/plat-omap/include + -Idrivers/video/omap2 \ + -Iarch/arm/plat-omap/include omaplfb-y += \ services4/3rdparty/dc_omapfb3_linux/omaplfb_displayclass.o \ diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb.h b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb.h index 804695b..5ef5215 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb.h +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb.h @@ -65,6 +65,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define OMAPLFB_CONSOLE_UNLOCK() release_console_sem() #endif +#if defined(CONFIG_ION_OMAP) +#include <linux/ion.h> +#include <linux/omap_ion.h> +#endif /* defined(CONFIG_ION_OMAP) */ + #define unref__ __attribute__ ((unused)) typedef void * OMAPLFB_HANDLE; @@ -226,6 +231,10 @@ typedef struct OMAPLFB_DEVINFO_TAG OMAPLFB_ATOMIC_BOOL sLeaveVT; #endif +#if defined(CONFIG_ION_OMAP) + struct ion_client *psIONClient; +#endif + } OMAPLFB_DEVINFO; #define OMAPLFB_PAGE_SIZE 4096 @@ -265,7 +274,8 @@ typedef enum _OMAPLFB_UPDATE_MODE_ OMAPLFB_UPDATE_MODE_UNDEFINED = 0, OMAPLFB_UPDATE_MODE_MANUAL = 1, OMAPLFB_UPDATE_MODE_AUTO = 2, - OMAPLFB_UPDATE_MODE_DISABLED = 3 + OMAPLFB_UPDATE_MODE_DISABLED = 3, + OMAPLFB_UPDATE_MODE_VSYNC = 4 } OMAPLFB_UPDATE_MODE; #ifndef UNREFERENCED_PARAMETER diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb_displayclass.c b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb_displayclass.c index ebca814..5eeaea7 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb_displayclass.c +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb_displayclass.c @@ -87,20 +87,22 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "omaplfb.h" #if defined(CONFIG_DSSCOMP) - -#if !defined(CONFIG_ION_OMAP) +#if defined(CONFIG_ION_OMAP) +extern struct ion_device *omap_ion_device; +#else /* defined(CONFIG_ION_OMAP) */ #error CONFIG_DSSCOMP support requires CONFIG_ION_OMAP -#endif - -#include <linux/ion.h> -#include <linux/omap_ion.h> - -extern struct ion_client *gpsIONClient; - +#endif /* defined(CONFIG_ION_OMAP) */ +#if defined(CONFIG_DRM_OMAP_DMM_TILER) +#include <../drivers/staging/omapdrm/omap_dmm_tiler.h> +#include <../drivers/video/omap2/dsscomp/tiler-utils.h> +#elif defined(CONFIG_TI_TILER) #include <mach/tiler.h> +#else /* defined(CONFIG_DRM_OMAP_DMM_TILER) */ +#error CONFIG_DSSCOMP support requires either \ + CONFIG_DRM_OMAP_DMM_TILER or CONFIG_TI_TILER +#endif /* defined(CONFIG_DRM_OMAP_DMM_TILER) */ #include <video/dsscomp.h> #include <plat/dsscomp.h> - #endif /* defined(CONFIG_DSSCOMP) */ #define OMAPLFB_COMMAND_COUNT 1 @@ -117,6 +119,7 @@ static OMAPLFB_DEVINFO *gapsDevInfo[OMAPLFB_MAX_NUM_DEVICES]; /* Top level 'hook ptr' */ static PFN_DC_GET_PVRJTABLE gpfnGetPVRJTable = NULL; +#if !defined(CONFIG_DSSCOMP) /* Round x up to a multiple of y */ static inline unsigned long RoundUpToMultiple(unsigned long x, unsigned long y) { @@ -146,6 +149,7 @@ static unsigned long LCM(unsigned long x, unsigned long y) return (gcd == 0) ? 0 : ((x / gcd) * y); } +#endif unsigned OMAPLFBMaxFBDevIDPlusOne(void) { @@ -210,14 +214,17 @@ static IMG_VOID SetDCState(IMG_HANDLE hDevice, IMG_UINT32 ui32State) switch (ui32State) { case DC_STATE_FLUSH_COMMANDS: + /* Flush out any 'real' operation waiting for another flip. + * In flush state we won't pass any 'real' operations along + * to dsscomp_gralloc_queue(); we'll just CmdComplete them + * immediately. + */ + OMAPLFBFlip(psDevInfo, &psDevInfo->sSystemBuffer); OMAPLFBAtomicBoolSet(&psDevInfo->sFlushCommands, OMAPLFB_TRUE); break; case DC_STATE_NO_FLUSH_COMMANDS: OMAPLFBAtomicBoolSet(&psDevInfo->sFlushCommands, OMAPLFB_FALSE); break; - case DC_STATE_FORCE_SWAP_TO_SYSTEM: - OMAPLFBFlip(psDevInfo, &psDevInfo->sSystemBuffer); - break; default: break; } @@ -233,9 +240,16 @@ static PVRSRV_ERROR OpenDCDevice(IMG_UINT32 uiPVRDevID, { OMAPLFB_DEVINFO *psDevInfo; OMAPLFB_ERROR eError; - unsigned uiMaxFBDevIDPlusOne = OMAPLFBMaxFBDevIDPlusOne(); + unsigned uiMaxFBDevIDPlusOne; unsigned i; + if (!try_module_get(THIS_MODULE)) + { + return PVRSRV_ERROR_UNABLE_TO_OPEN_DC_DEVICE; + } + + uiMaxFBDevIDPlusOne = OMAPLFBMaxFBDevIDPlusOne(); + for (i = 0; i < uiMaxFBDevIDPlusOne; i++) { psDevInfo = OMAPLFBGetDevInfoPtr(i); @@ -248,7 +262,8 @@ static PVRSRV_ERROR OpenDCDevice(IMG_UINT32 uiPVRDevID, { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: PVR Device %u not found\n", __FUNCTION__, uiPVRDevID)); - return PVRSRV_ERROR_INVALID_DEVICE; + eError = PVRSRV_ERROR_INVALID_DEVICE; + goto ErrorModulePut; } /* store the system surface sync data */ @@ -259,13 +274,19 @@ static PVRSRV_ERROR OpenDCDevice(IMG_UINT32 uiPVRDevID, { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: OMAPLFBUnblankDisplay failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, eError)); - return PVRSRV_ERROR_UNBLANK_DISPLAY_FAILED; + eError = PVRSRV_ERROR_UNBLANK_DISPLAY_FAILED; + goto ErrorModulePut; } /* return handle to the devinfo */ *phDevice = (IMG_HANDLE)psDevInfo; return PVRSRV_OK; + +ErrorModulePut: + module_put(THIS_MODULE); + + return eError; } /* @@ -282,6 +303,8 @@ static PVRSRV_ERROR CloseDCDevice(IMG_HANDLE hDevice) #else UNREFERENCED_PARAMETER(hDevice); #endif + module_put(THIS_MODULE); + return PVRSRV_OK; } @@ -477,15 +500,14 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, IMG_HANDLE *phSwapChain, IMG_UINT32 *pui32SwapChainID) { - OMAPLFB_DEVINFO *psDevInfo; OMAPLFB_SWAPCHAIN *psSwapChain; - OMAPLFB_BUFFER *psBuffer; - IMG_UINT32 i; + OMAPLFB_DEVINFO *psDevInfo; PVRSRV_ERROR eError; - IMG_UINT32 ui32BuffersToSkip; + IMG_UINT32 i; UNREFERENCED_PARAMETER(ui32OEMFlags); - + UNREFERENCED_PARAMETER(ui32Flags); + /* Check parameters */ if(!hDevice || !psDstSurfAttrib @@ -512,60 +534,7 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, eError = PVRSRV_ERROR_FLIP_CHAIN_EXISTS; goto ExitUnLock; } - - /* Check the buffer count */ - if(ui32BufferCount > psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers) - { - eError = PVRSRV_ERROR_TOOMANYBUFFERS; - goto ExitUnLock; - } - - if ((psDevInfo->sFBInfo.ulRoundedBufferSize * (unsigned long)ui32BufferCount) > psDevInfo->sFBInfo.ulFBSize) - { - eError = PVRSRV_ERROR_TOOMANYBUFFERS; - goto ExitUnLock; - } - /* - * We will allocate the swap chain buffers at the back of the frame - * buffer area. This preserves the front portion, which may be being - * used by other Linux Framebuffer based applications. - */ - ui32BuffersToSkip = psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers - ui32BufferCount; - - /* - * Verify the DST/SRC attributes, - * SRC/DST must match the current display mode config - */ - if(psDstSurfAttrib->pixelformat != psDevInfo->sDisplayFormat.pixelformat - || psDstSurfAttrib->sDims.ui32ByteStride != psDevInfo->sDisplayDim.ui32ByteStride - || psDstSurfAttrib->sDims.ui32Width != psDevInfo->sDisplayDim.ui32Width - || psDstSurfAttrib->sDims.ui32Height != psDevInfo->sDisplayDim.ui32Height) - { - /* DST doesn't match the current mode */ - eError = PVRSRV_ERROR_INVALID_PARAMS; - goto ExitUnLock; - } - - if(psDstSurfAttrib->pixelformat != psSrcSurfAttrib->pixelformat - || psDstSurfAttrib->sDims.ui32ByteStride != psSrcSurfAttrib->sDims.ui32ByteStride - || psDstSurfAttrib->sDims.ui32Width != psSrcSurfAttrib->sDims.ui32Width - || psDstSurfAttrib->sDims.ui32Height != psSrcSurfAttrib->sDims.ui32Height) - { - /* DST doesn't match the SRC */ - eError = PVRSRV_ERROR_INVALID_PARAMS; - goto ExitUnLock; - } - - /* check flags if implementation requires them */ - UNREFERENCED_PARAMETER(ui32Flags); - -#if defined(PVR_OMAPFB3_UPDATE_MODE) - if (!OMAPLFBSetUpdateMode(psDevInfo, PVR_OMAPFB3_UPDATE_MODE)) - { - printk(KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Couldn't set frame buffer update mode %d\n", __FUNCTION__, psDevInfo->uiFBDevID, PVR_OMAPFB3_UPDATE_MODE); - } -#endif /* create a swapchain structure */ psSwapChain = (OMAPLFB_SWAPCHAIN*)OMAPLFBAllocKernelMem(sizeof(OMAPLFB_SWAPCHAIN)); if(!psSwapChain) @@ -574,57 +543,122 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, goto ExitUnLock; } - psBuffer = (OMAPLFB_BUFFER*)OMAPLFBAllocKernelMem(sizeof(OMAPLFB_BUFFER) * ui32BufferCount); - if(!psBuffer) + /* If services asks for a 0-length swap chain, it's probably Android. + * + * This will use only non-display memory posting via PVRSRVSwapToDCBuffers2(), + * and we can skip some useless sanity checking. + */ + if(ui32BufferCount > 0) { - eError = PVRSRV_ERROR_OUT_OF_MEMORY; - goto ErrorFreeSwapChain; - } + IMG_UINT32 ui32BuffersToSkip; - psSwapChain->ulBufferCount = (unsigned long)ui32BufferCount; - psSwapChain->psBuffer = psBuffer; - psSwapChain->bNotVSynced = OMAPLFB_TRUE; - psSwapChain->uiFBDevID = psDevInfo->uiFBDevID; + /* Check the buffer count */ + if(ui32BufferCount > psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers) + { + eError = PVRSRV_ERROR_TOOMANYBUFFERS; + goto ErrorFreeSwapChain; + } + + if ((psDevInfo->sFBInfo.ulRoundedBufferSize * (unsigned long)ui32BufferCount) > psDevInfo->sFBInfo.ulFBSize) + { + eError = PVRSRV_ERROR_TOOMANYBUFFERS; + goto ErrorFreeSwapChain; + } - /* Link the buffers */ - for(i=0; i<ui32BufferCount-1; i++) - { - psBuffer[i].psNext = &psBuffer[i+1]; - } - /* and link last to first */ - psBuffer[i].psNext = &psBuffer[0]; + /* + * We will allocate the swap chain buffers at the back of the frame + * buffer area. This preserves the front portion, which may be being + * used by other Linux Framebuffer based applications. + */ + ui32BuffersToSkip = psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers - ui32BufferCount; - /* Configure the swapchain buffers */ - for(i=0; i<ui32BufferCount; i++) - { - IMG_UINT32 ui32SwapBuffer = i + ui32BuffersToSkip; - IMG_UINT32 ui32BufferOffset = ui32SwapBuffer * (IMG_UINT32)psDevInfo->sFBInfo.ulRoundedBufferSize; + /* + * Verify the DST/SRC attributes, + * SRC/DST must match the current display mode config + */ + if(psDstSurfAttrib->pixelformat != psDevInfo->sDisplayFormat.pixelformat + || psDstSurfAttrib->sDims.ui32ByteStride != psDevInfo->sDisplayDim.ui32ByteStride + || psDstSurfAttrib->sDims.ui32Width != psDevInfo->sDisplayDim.ui32Width + || psDstSurfAttrib->sDims.ui32Height != psDevInfo->sDisplayDim.ui32Height) + { + /* DST doesn't match the current mode */ + eError = PVRSRV_ERROR_INVALID_PARAMS; + goto ErrorFreeSwapChain; + } -#if defined(CONFIG_DSSCOMP) - if (psDevInfo->sFBInfo.bIs2D) + if(psDstSurfAttrib->pixelformat != psSrcSurfAttrib->pixelformat + || psDstSurfAttrib->sDims.ui32ByteStride != psSrcSurfAttrib->sDims.ui32ByteStride + || psDstSurfAttrib->sDims.ui32Width != psSrcSurfAttrib->sDims.ui32Width + || psDstSurfAttrib->sDims.ui32Height != psSrcSurfAttrib->sDims.ui32Height) + { + /* DST doesn't match the SRC */ + eError = PVRSRV_ERROR_INVALID_PARAMS; + goto ErrorFreeSwapChain; + } + + psSwapChain->psBuffer = (OMAPLFB_BUFFER*)OMAPLFBAllocKernelMem(sizeof(OMAPLFB_BUFFER) * ui32BufferCount); + if(!psSwapChain->psBuffer) + { + eError = PVRSRV_ERROR_OUT_OF_MEMORY; + goto ErrorFreeSwapChain; + } + + /* Link the buffers */ + for(i = 0; i < ui32BufferCount - 1; i++) { - ui32BufferOffset = 0; + psSwapChain->psBuffer[i].psNext = &psSwapChain->psBuffer[i + 1]; } + + /* and link last to first */ + psSwapChain->psBuffer[i].psNext = &psSwapChain->psBuffer[0]; + + /* Configure the swapchain buffers */ + for(i = 0; i < ui32BufferCount; i++) + { + IMG_UINT32 ui32SwapBuffer = i + ui32BuffersToSkip; + IMG_UINT32 ui32BufferOffset = ui32SwapBuffer * (IMG_UINT32)psDevInfo->sFBInfo.ulRoundedBufferSize; + +#if defined(CONFIG_DSSCOMP) + if (psDevInfo->sFBInfo.bIs2D) + { + ui32BufferOffset = 0; + } #endif /* defined(CONFIG_DSSCOMP) */ - psBuffer[i].psSyncData = ppsSyncData[i]; + psSwapChain->psBuffer[i].psSyncData = ppsSyncData[i]; - psBuffer[i].sSysAddr.uiAddr = psDevInfo->sFBInfo.sSysAddr.uiAddr + ui32BufferOffset; - psBuffer[i].sCPUVAddr = psDevInfo->sFBInfo.sCPUVAddr + ui32BufferOffset; - psBuffer[i].ulYOffset = ui32BufferOffset / psDevInfo->sFBInfo.ulByteStride; - psBuffer[i].psDevInfo = psDevInfo; + psSwapChain->psBuffer[i].sSysAddr.uiAddr = psDevInfo->sFBInfo.sSysAddr.uiAddr + ui32BufferOffset; + psSwapChain->psBuffer[i].sCPUVAddr = psDevInfo->sFBInfo.sCPUVAddr + ui32BufferOffset; + psSwapChain->psBuffer[i].ulYOffset = ui32BufferOffset / psDevInfo->sFBInfo.ulByteStride; + psSwapChain->psBuffer[i].psDevInfo = psDevInfo; #if defined(CONFIG_DSSCOMP) - if (psDevInfo->sFBInfo.bIs2D) - { - psBuffer[i].sSysAddr.uiAddr += ui32SwapBuffer * - ALIGN((IMG_UINT32)psDevInfo->sFBInfo.ulWidth * psDevInfo->sFBInfo.uiBytesPerPixel, PAGE_SIZE); - } + if (psDevInfo->sFBInfo.bIs2D) + { + psSwapChain->psBuffer[i].sSysAddr.uiAddr += ui32SwapBuffer * + ALIGN((IMG_UINT32)psDevInfo->sFBInfo.ulWidth * psDevInfo->sFBInfo.uiBytesPerPixel, PAGE_SIZE); + } #endif /* defined(CONFIG_DSSCOMP) */ - OMAPLFBInitBufferForSwap(&psBuffer[i]); + OMAPLFBInitBufferForSwap(&psSwapChain->psBuffer[i]); + } + } + else + { + psSwapChain->psBuffer = NULL; } +#if defined(PVR_OMAPFB3_UPDATE_MODE) + if (!OMAPLFBSetUpdateMode(psDevInfo, PVR_OMAPFB3_UPDATE_MODE)) + { + printk(KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Couldn't set frame buffer update mode %d\n", __FUNCTION__, psDevInfo->uiFBDevID, PVR_OMAPFB3_UPDATE_MODE); + } +#endif /* defined(PVR_OMAPFB3_UPDATE_MODE) */ + + psSwapChain->ulBufferCount = (unsigned long)ui32BufferCount; + psSwapChain->bNotVSynced = OMAPLFB_TRUE; + psSwapChain->uiFBDevID = psDevInfo->uiFBDevID; + if (OMAPLFBCreateSwapQueue(psSwapChain) != OMAPLFB_OK) { printk(KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Failed to create workqueue\n", __FUNCTION__, psDevInfo->uiFBDevID); @@ -659,7 +693,10 @@ static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, ErrorDestroySwapQueue: OMAPLFBDestroySwapQueue(psSwapChain); ErrorFreeBuffers: - OMAPLFBFreeKernelMem(psBuffer); + if(psSwapChain->psBuffer) + { + OMAPLFBFreeKernelMem(psSwapChain->psBuffer); + } ErrorFreeSwapChain: OMAPLFBFreeKernelMem(psSwapChain); ExitUnLock: @@ -708,7 +745,10 @@ static PVRSRV_ERROR DestroyDCSwapChain(IMG_HANDLE hDevice, } /* Free resources */ - OMAPLFBFreeKernelMem(psSwapChain->psBuffer); + if (psSwapChain->psBuffer) + { + OMAPLFBFreeKernelMem(psSwapChain->psBuffer); + } OMAPLFBFreeKernelMem(psSwapChain); psDevInfo->psSwapChain = NULL; @@ -922,12 +962,16 @@ void OMAPLFBSwapHandler(OMAPLFB_BUFFER *psBuffer) switch(eMode) { case OMAPLFB_UPDATE_MODE_AUTO: + case OMAPLFB_UPDATE_MODE_VSYNC: psSwapChain->bNotVSynced = OMAPLFB_FALSE; if (bPreviouslyNotVSynced || psSwapChain->iBlankEvents != iBlankEvents) { psSwapChain->iBlankEvents = iBlankEvents; - psSwapChain->bNotVSynced = !WaitForVSyncSettle(psDevInfo); + if (eMode == OMAPLFB_UPDATE_MODE_AUTO) + { + psSwapChain->bNotVSynced = !WaitForVSyncSettle(psDevInfo); + } } else if (psBuffer->ulSwapInterval != 0) { psSwapChain->bNotVSynced = !OMAPLFBWaitForVSync(psDevInfo); @@ -972,6 +1016,7 @@ static IMG_BOOL ProcessFlipV1(IMG_HANDLE hCmdCookie, #if defined(CONFIG_DSSCOMP) if (is_tiler_addr(psBuffer->sSysAddr.uiAddr)) { + int res; IMG_UINT32 w = psBuffer->psDevInfo->sDisplayDim.ui32Width; IMG_UINT32 h = psBuffer->psDevInfo->sDisplayDim.ui32Height; struct dsscomp_setup_dispc_data comp = { @@ -995,9 +1040,13 @@ static IMG_BOOL ProcessFlipV1(IMG_HANDLE hCmdCookie, }; struct tiler_pa_info *pas[1] = { NULL }; comp.ovls[0].ba = (u32) psBuffer->sSysAddr.uiAddr; - dsscomp_gralloc_queue(&comp, pas, true, + res = dsscomp_gralloc_queue(&comp, pas, true, (void *) psDevInfo->sPVRJTable.pfnPVRSRVCmdComplete, (void *) psBuffer->hCmdComplete); + if (res != 0) + { + DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: dsscomp_gralloc_queue failed (Y Offset: %lu, Error: %d)\n", __FUNCTION__, psDevInfo->uiFBDevID, psBuffer->ulYOffset, res)); + } } else #endif /* defined(CONFIG_DSSCOMP) */ @@ -1023,6 +1072,55 @@ static IMG_BOOL ProcessFlipV2(IMG_HANDLE hCmdCookie, { struct tiler_pa_info *apsTilerPAs[5]; IMG_UINT32 i, k; + struct + { + IMG_UINTPTR_T uiAddr; + IMG_UINTPTR_T uiUVAddr; + struct tiler_pa_info *psTilerInfo; + } + asMemInfo[5] = {}; + int res; + + if(!psDssData) + { + if(ui32NumMemInfos == 1) + { + OMAPLFB_BUFFER sBuffer; + IMG_CPU_PHYADDR phyAddr; + + psDevInfo->sPVRJTable.pfnPVRSRVDCMemInfoGetCpuPAddr(ppsMemInfos[0], 0, &phyAddr); + + /* Fake up an OMAPLFB_BUFFER */ + sBuffer.psNext = NULL; + sBuffer.psDevInfo = psDevInfo; + sBuffer.ulYOffset = 0; + sBuffer.sSysAddr.uiAddr = phyAddr.uiAddr; + sBuffer.sCPUVAddr = 0; + sBuffer.psSyncData = NULL; + sBuffer.hCmdComplete = (OMAPLFB_HANDLE)hCmdCookie; + sBuffer.ulSwapInterval = 0; + + /* If we got a meminfo but no private data, assume the 'null' HWC + * backend is in use, and emulate a swapchain-less ProcessFlipV1. + */ + OMAPLFBFlip(psDevInfo, &sBuffer); + + /* FIXME: Why do this? Shouldn't we use the hCmdCookie correctly, + * like ProcessFlipV1 does? + */ + psDevInfo->sPVRJTable.pfnPVRSRVCmdComplete(hCmdCookie, IMG_TRUE); + } + else + { + printk(KERN_WARNING DRIVER_PREFIX + ": %s: Device %u: WARNING: psDispcData was NULL. " + "The HWC probably has a bug. Silently ignoring.", + __FUNCTION__, psDevInfo->uiFBDevID); + } + + psDevInfo->sPVRJTable.pfnPVRSRVCmdComplete(hCmdCookie, IMG_TRUE); + return IMG_TRUE; + } if(ui32DssDataLength != sizeof(*psDssData)) { @@ -1037,7 +1135,13 @@ static IMG_BOOL ProcessFlipV2(IMG_HANDLE hCmdCookie, return IMG_FALSE; } - for(i = k = 0; i < ui32NumMemInfos && k < ARRAY_SIZE(apsTilerPAs); i++, k++) + if(DontWaitForVSync(psDevInfo)) + { + psDevInfo->sPVRJTable.pfnPVRSRVCmdComplete(hCmdCookie, IMG_TRUE); + return IMG_TRUE; + } + + for(i = k = 0; i < ui32NumMemInfos && k < ARRAY_SIZE(asMemInfo); i++, k++) { struct tiler_pa_info *psTilerInfo; IMG_CPU_VIRTADDR virtAddr; @@ -1049,27 +1153,28 @@ static IMG_BOOL ProcessFlipV2(IMG_HANDLE hCmdCookie, psDevInfo->sPVRJTable.pfnPVRSRVDCMemInfoGetByteSize(ppsMemInfos[i], &uByteSize); ui32NumPages = (uByteSize + PAGE_SIZE - 1) >> PAGE_SHIFT; - apsTilerPAs[k] = NULL; - psDevInfo->sPVRJTable.pfnPVRSRVDCMemInfoGetCpuPAddr(ppsMemInfos[i], 0, &phyAddr); - /* NV12 buffers are already mapped to tiler */ - if(psDssData->ovls[k].cfg.color_mode == OMAP_DSS_COLOR_NV12) - { - psDssData->ovls[k].ba = (u32)phyAddr.uiAddr; - - psDevInfo->sPVRJTable.pfnPVRSRVDCMemInfoGetCpuPAddr(ppsMemInfos[i], (uByteSize * 2) / 3, &phyAddr); - psDssData->ovls[k].uv = (u32)phyAddr.uiAddr; - continue; - } - - /* Other kinds of buffer may also already be mapped to tiler */ + /* TILER buffers do not need meminfos */ if(is_tiler_addr((u32)phyAddr.uiAddr)) { - psDssData->ovls[k].ba = (u32)phyAddr.uiAddr; +#ifdef CONFIG_DRM_OMAP_DMM_TILER + enum tiler_fmt fmt; +#endif + asMemInfo[k].uiAddr = phyAddr.uiAddr; +#ifdef CONFIG_DRM_OMAP_DMM_TILER + if(tiler_get_fmt((u32)phyAddr.uiAddr, &fmt) && fmt == TILFMT_8BIT) +#else + if(tiler_fmt((u32)phyAddr.uiAddr) == TILFMT_8BIT) +#endif + { + psDevInfo->sPVRJTable.pfnPVRSRVDCMemInfoGetCpuPAddr(ppsMemInfos[i], (uByteSize * 2) / 3, &phyAddr); + asMemInfo[k].uiUVAddr = phyAddr.uiAddr; + } continue; } + /* normal gralloc layer */ psTilerInfo = kzalloc(sizeof(*psTilerInfo), GFP_KERNEL); if(!psTilerInfo) { @@ -1085,37 +1190,58 @@ static IMG_BOOL ProcessFlipV2(IMG_HANDLE hCmdCookie, psTilerInfo->num_pg = ui32NumPages; psTilerInfo->memtype = TILER_MEM_USING; - for(j = 0; j < ui32NumPages; j++) { psDevInfo->sPVRJTable.pfnPVRSRVDCMemInfoGetCpuPAddr(ppsMemInfos[i], j << PAGE_SHIFT, &phyAddr); psTilerInfo->mem[j] = (u32)phyAddr.uiAddr; } - /* Need base address for in-page offset */ + /* need base address for in-page offset */ psDevInfo->sPVRJTable.pfnPVRSRVDCMemInfoGetCpuVAddr(ppsMemInfos[i], &virtAddr); - psDssData->ovls[k].ba = (u32)virtAddr; - apsTilerPAs[k] = psTilerInfo; + asMemInfo[k].uiAddr = (IMG_UINTPTR_T) virtAddr; + asMemInfo[k].psTilerInfo = psTilerInfo; } - /* Set up cloned layer addresses (but don't duplicate tiler_pas) */ - for(i = k; i < psDssData->num_ovls && i < ARRAY_SIZE(apsTilerPAs); i++) + for(i = 0; i < psDssData->num_ovls; i++) { - unsigned int ix = psDssData->ovls[i].ba; - if(ix >= ARRAY_SIZE(apsTilerPAs)) + unsigned int ix; + apsTilerPAs[i] = NULL; + + /* only supporting Post2, cloned and fbmem layers */ + if (psDssData->ovls[i].addressing != OMAP_DSS_BUFADDR_LAYER_IX && + psDssData->ovls[i].addressing != OMAP_DSS_BUFADDR_OVL_IX && + psDssData->ovls[i].addressing != OMAP_DSS_BUFADDR_FB) { - WARN(1, "Invalid clone layer (%u); skipping all cloned layers", ix); - psDssData->num_ovls = k; - break; + psDssData->ovls[i].cfg.enabled = false; + } + + if (psDssData->ovls[i].addressing != OMAP_DSS_BUFADDR_LAYER_IX) + { + continue; + } + + /* Post2 layers */ + ix = psDssData->ovls[i].ba; + if (ix >= k) + { + WARN(1, "Invalid Post2 layer (%u)", ix); + psDssData->ovls[i].cfg.enabled = false; + continue; } - apsTilerPAs[i] = apsTilerPAs[ix]; - psDssData->ovls[i].ba = psDssData->ovls[ix].ba; - psDssData->ovls[i].uv = psDssData->ovls[ix].uv; + + psDssData->ovls[i].addressing = OMAP_DSS_BUFADDR_DIRECT; + psDssData->ovls[i].ba = (u32) asMemInfo[ix].uiAddr; + psDssData->ovls[i].uv = (u32) asMemInfo[ix].uiUVAddr; + apsTilerPAs[i] = asMemInfo[ix].psTilerInfo; } - dsscomp_gralloc_queue(psDssData, apsTilerPAs, false, + res = dsscomp_gralloc_queue(psDssData, apsTilerPAs, false, (void *)psDevInfo->sPVRJTable.pfnPVRSRVCmdComplete, (void *)hCmdCookie); + if (res != 0) + { + DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: dsscomp_gralloc_queue failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, res)); + } for(i = 0; i < k; i++) { @@ -1194,8 +1320,6 @@ static OMAPLFB_ERROR OMAPLFBInitFBDev(OMAPLFB_DEVINFO *psDevInfo) struct module *psLINFBOwner; OMAPLFB_FBINFO *psPVRFBInfo = &psDevInfo->sFBInfo; OMAPLFB_ERROR eError = OMAPLFB_ERROR_GENERIC; - unsigned long FBSize; - unsigned long ulLCM; unsigned uiFBDevID = psDevInfo->uiFBDevID; OMAPLFB_CONSOLE_LOCK(); @@ -1207,20 +1331,6 @@ static OMAPLFB_ERROR OMAPLFBInitFBDev(OMAPLFB_DEVINFO *psDevInfo) goto ErrorRelSem; } - FBSize = (psLINFBInfo->screen_size) != 0 ? - psLINFBInfo->screen_size : - psLINFBInfo->fix.smem_len; - - /* - * Try and filter out invalid FB info structures (a problem - * seen on some OMAP3 systems). - */ - if (FBSize == 0 || psLINFBInfo->fix.line_length == 0) - { - eError = OMAPLFB_ERROR_INVALID_DEVICE; - goto ErrorRelSem; - } - psLINFBOwner = psLINFBInfo->fbops->owner; if (!try_module_get(psLINFBOwner)) { @@ -1246,43 +1356,62 @@ static OMAPLFB_ERROR OMAPLFBInitFBDev(OMAPLFB_DEVINFO *psDevInfo) psDevInfo->psLINFBInfo = psLINFBInfo; - ulLCM = LCM(psLINFBInfo->fix.line_length, OMAPLFB_PAGE_SIZE); + psPVRFBInfo->ulWidth = psLINFBInfo->var.xres; + psPVRFBInfo->ulHeight = psLINFBInfo->var.yres; + + if (psPVRFBInfo->ulWidth == 0 || psPVRFBInfo->ulHeight == 0) + { + eError = OMAPLFB_ERROR_INVALID_DEVICE; + goto ErrorFBRel; + } + +#if !defined(CONFIG_DSSCOMP) + psPVRFBInfo->ulFBSize = (psLINFBInfo->screen_size) != 0 ? + psLINFBInfo->screen_size : + psLINFBInfo->fix.smem_len; + + /* + * Try and filter out invalid FB info structures (a problem + * seen on some OMAP3 systems). + */ + if (psPVRFBInfo->ulFBSize == 0 || psLINFBInfo->fix.line_length == 0) + { + eError = OMAPLFB_ERROR_INVALID_DEVICE; + goto ErrorFBRel; + } - DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX - ": Device %u: Framebuffer physical address: 0x%lx\n", - psDevInfo->uiFBDevID, psLINFBInfo->fix.smem_start)); - DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX - ": Device %u: Framebuffer virtual address: 0x%lx\n", - psDevInfo->uiFBDevID, (unsigned long)psLINFBInfo->screen_base)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer size: %lu\n", - psDevInfo->uiFBDevID, FBSize)); + psDevInfo->uiFBDevID, psPVRFBInfo->ulFBSize)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer virtual width: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->var.xres_virtual)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Framebuffer virtual height: %u\n", psDevInfo->uiFBDevID, psLINFBInfo->var.yres_virtual)); +#endif DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX - ": Device %u: Framebuffer width: %u\n", - psDevInfo->uiFBDevID, psLINFBInfo->var.xres)); - DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX - ": Device %u: Framebuffer height: %u\n", - psDevInfo->uiFBDevID, psLINFBInfo->var.yres)); - DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX - ": Device %u: Framebuffer stride: %u\n", - psDevInfo->uiFBDevID, psLINFBInfo->fix.line_length)); + ": Device %u: Framebuffer width: %lu\n", + psDevInfo->uiFBDevID, psPVRFBInfo->ulWidth)); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX - ": Device %u: LCM of stride and page size: %lu\n", - psDevInfo->uiFBDevID, ulLCM)); - - /* Additional implementation specific information */ - OMAPLFBPrintInfo(psDevInfo); + ": Device %u: Framebuffer height: %lu\n", + psDevInfo->uiFBDevID, psPVRFBInfo->ulHeight)); #if defined(CONFIG_DSSCOMP) { - /* for some reason we need at least 3 buffers in the swap chain */ - int n = FBSize / RoundUpToMultiple(psLINFBInfo->fix.line_length * psLINFBInfo->var.yres, ulLCM); +#if defined(SUPPORT_PVRSRV_GET_DC_SYSTEM_BUFFER) + /* + * Assume we need 3 swap buffers, and a separate system + * buffer. + */ + int n = 4; +#else + /* + * Assume we need just 3 swap buffers, and no separate + * system buffer. + */ + int n = 3; +#endif int res; int i, x, y, w; ion_phys_addr_t phys; @@ -1293,8 +1422,8 @@ static OMAPLFB_ERROR OMAPLFBInitFBDev(OMAPLFB_DEVINFO *psDevInfo) { /* TILER will align width to 128-bytes */ /* however, SGX must have full page width */ - .w = ALIGN(psLINFBInfo->var.xres, PAGE_SIZE / (psLINFBInfo->var.bits_per_pixel / 8)), - .h = psLINFBInfo->var.yres, + .w = ALIGN(psPVRFBInfo->ulWidth, PAGE_SIZE / (psLINFBInfo->var.bits_per_pixel / 8)), + .h = psPVRFBInfo->ulHeight, .fmt = psLINFBInfo->var.bits_per_pixel == 16 ? TILER_PIXEL_FMT_16BIT : TILER_PIXEL_FMT_32BIT, .flags = 0, }; @@ -1303,43 +1432,43 @@ static OMAPLFB_ERROR OMAPLFBInitFBDev(OMAPLFB_DEVINFO *psDevInfo) " %s: Device %u: Requesting %d TILER 2D framebuffers\n", __FUNCTION__, uiFBDevID, n); - /* INTEGRATION_POINT: limit to MAX 3 FBs to save TILER container space */ - if (n != 3) - n = 3; - sAllocData.w *= n; psPVRFBInfo->uiBytesPerPixel = psLINFBInfo->var.bits_per_pixel >> 3; psPVRFBInfo->bIs2D = OMAPLFB_TRUE; - res = omap_ion_tiler_alloc(gpsIONClient, &sAllocData); + res = omap_ion_tiler_alloc(psDevInfo->psIONClient, &sAllocData); psPVRFBInfo->psIONHandle = sAllocData.handle; if (res < 0) { printk(KERN_ERR DRIVER_PREFIX " %s: Device %u: Could not allocate 2D framebuffer(%d)\n", __FUNCTION__, uiFBDevID, res); - goto ErrorModPut; + goto ErrorFBRel; } - psLINFBInfo->fix.smem_start = ion_phys(gpsIONClient, sAllocData.handle, &phys, &size); + res = ion_phys(psDevInfo->psIONClient, sAllocData.handle, &phys, &size); + if (res < 0) + { + printk(KERN_ERR DRIVER_PREFIX + " %s: Device %u: Could not get 2D framebufferphysical address (%d)\n", + __FUNCTION__, uiFBDevID, res); + goto ErrorFBRel; + } psPVRFBInfo->sSysAddr.uiAddr = phys; psPVRFBInfo->sCPUVAddr = 0; - psPVRFBInfo->ulWidth = psLINFBInfo->var.xres; - psPVRFBInfo->ulHeight = psLINFBInfo->var.yres; psPVRFBInfo->ulByteStride = PAGE_ALIGN(psPVRFBInfo->ulWidth * psPVRFBInfo->uiBytesPerPixel); w = psPVRFBInfo->ulByteStride >> PAGE_SHIFT; - /* this is an "effective" FB size to get correct number of buffers */ psPVRFBInfo->ulFBSize = sAllocData.h * n * psPVRFBInfo->ulByteStride; psPVRFBInfo->psPageList = kzalloc(w * n * psPVRFBInfo->ulHeight * sizeof(*psPVRFBInfo->psPageList), GFP_KERNEL); if (!psPVRFBInfo->psPageList) { printk(KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Could not allocate page list\n", __FUNCTION__, psDevInfo->uiFBDevID); - ion_free(gpsIONClient, sAllocData.handle); - goto ErrorModPut; + ion_free(psDevInfo->psIONClient, sAllocData.handle); + goto ErrorFBRel; } tilview_create(&view, phys, psDevInfo->sFBInfo.ulWidth, psDevInfo->sFBInfo.ulHeight); @@ -1360,21 +1489,48 @@ static OMAPLFB_ERROR OMAPLFBInitFBDev(OMAPLFB_DEVINFO *psDevInfo) psPVRFBInfo->sSysAddr.uiAddr = psLINFBInfo->fix.smem_start; psPVRFBInfo->sCPUVAddr = psLINFBInfo->screen_base; - psPVRFBInfo->ulWidth = psLINFBInfo->var.xres; - psPVRFBInfo->ulHeight = psLINFBInfo->var.yres; psPVRFBInfo->ulByteStride = psLINFBInfo->fix.line_length; - psPVRFBInfo->ulFBSize = FBSize; #endif /* defined(CONFIG_DSSCOMP) */ + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX + ": Device %u: Framebuffer physical address: 0x%x\n", + psDevInfo->uiFBDevID, psPVRFBInfo->sSysAddr.uiAddr)); + + if (psPVRFBInfo->sCPUVAddr != NULL) + { + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX + ": Device %u: Framebuffer virtual address: %p\n", + psDevInfo->uiFBDevID, psPVRFBInfo->sCPUVAddr)); + } + + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX + ": Device %u: Framebuffer stride: %lu\n", + psDevInfo->uiFBDevID, psPVRFBInfo->ulByteStride)); + + /* Additional implementation specific information */ + OMAPLFBPrintInfo(psDevInfo); + psPVRFBInfo->ulBufferSize = psPVRFBInfo->ulHeight * psPVRFBInfo->ulByteStride; - /* Round the buffer size up to a multiple of the number of pages - * and the byte stride. - * This is used internally, to ensure buffers start on page - * boundaries, for the benefit of PVR Services. - */ - psPVRFBInfo->ulRoundedBufferSize = RoundUpToMultiple(psPVRFBInfo->ulBufferSize, ulLCM); +#if defined(CONFIG_DSSCOMP) + psPVRFBInfo->ulRoundedBufferSize = psPVRFBInfo->ulBufferSize; +#else + { + unsigned long ulLCM; + ulLCM = LCM(psPVRFBInfo->ulByteStride, OMAPLFB_PAGE_SIZE); + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX + ": Device %u: LCM of stride and page size: %lu\n", + psDevInfo->uiFBDevID, ulLCM)); + + /* Round the buffer size up to a multiple of the number of pages + * and the byte stride. + * This is used internally, to ensure buffers start on page + * boundaries, for the benefit of PVR Services. + */ + psPVRFBInfo->ulRoundedBufferSize = RoundUpToMultiple(psPVRFBInfo->ulBufferSize, ulLCM); + } +#endif if(psLINFBInfo->var.bits_per_pixel == 16) { if((psLINFBInfo->var.red.length == 5) && @@ -1427,6 +1583,11 @@ static OMAPLFB_ERROR OMAPLFBInitFBDev(OMAPLFB_DEVINFO *psDevInfo) eError = OMAPLFB_OK; goto ErrorRelSem; +ErrorFBRel: + if (psLINFBInfo->fbops->fb_release != NULL) + { + (void) psLINFBInfo->fbops->fb_release(psLINFBInfo, 0); + } ErrorModPut: module_put(psLINFBOwner); ErrorRelSem: @@ -1448,7 +1609,7 @@ static void OMAPLFBDeInitFBDev(OMAPLFB_DEVINFO *psDevInfo) kfree(psPVRFBInfo->psPageList); if (psPVRFBInfo->psIONHandle) { - ion_free(gpsIONClient, psPVRFBInfo->psIONHandle); + ion_free(psDevInfo->psIONClient, psPVRFBInfo->psIONHandle); } } #endif /* defined(CONFIG_DSSCOMP) */ @@ -1493,6 +1654,23 @@ static OMAPLFB_DEVINFO *OMAPLFBInitDev(unsigned uiFBDevID) goto ErrorFreeDevInfo; } +#if defined(CONFIG_ION_OMAP) + psDevInfo->psIONClient = + ion_client_create(omap_ion_device, +#if defined(SUPPORT_OLD_ION_API) + 1 << ION_HEAP_TYPE_CARVEOUT | + 1 << OMAP_ION_HEAP_TYPE_TILER, +#endif + "dc_omapfb3_linux"); + if (IS_ERR_OR_NULL(psDevInfo->psIONClient)) + { + printk(KERN_ERR DRIVER_PREFIX + ": %s: Device %u: Failed to create ion client\n", __FUNCTION__, uiFBDevID); + + goto ErrorFreeDevInfo; + } +#endif /* defined(CONFIG_ION_OMAP) */ + /* Save private fbdev information structure in the dev. info. */ if(OMAPLFBInitFBDev(psDevInfo) != OMAPLFB_OK) { @@ -1502,7 +1680,7 @@ static OMAPLFB_DEVINFO *OMAPLFBInitDev(unsigned uiFBDevID) * there is no Linux framebuffer device corresponding * to the device ID. */ - goto ErrorFreeDevInfo; + goto ErrorIonClientDestroy; } psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers = (IMG_UINT32)(psDevInfo->sFBInfo.ulFBSize / psDevInfo->sFBInfo.ulRoundedBufferSize); @@ -1510,6 +1688,9 @@ static OMAPLFB_DEVINFO *OMAPLFBInitDev(unsigned uiFBDevID) { psDevInfo->sDisplayInfo.ui32MaxSwapChains = 1; psDevInfo->sDisplayInfo.ui32MaxSwapInterval = 1; +#if defined(CONFIG_DSSCOMP) + psDevInfo->sDisplayInfo.ui32MinSwapInterval = 1; +#endif } psDevInfo->sDisplayInfo.ui32PhysicalWidthmm = psDevInfo->sFBInfo.ulPhysicalWidthmm; @@ -1533,6 +1714,10 @@ static OMAPLFB_DEVINFO *OMAPLFBInitDev(unsigned uiFBDevID) OMAPLFBInitBufferForSwap(&psDevInfo->sSystemBuffer); +#if defined(CONFIG_DSSCOMP) && defined(SUPPORT_PVRSRV_GET_DC_SYSTEM_BUFFER) + OMAPLFBFlip(psDevInfo, &psDevInfo->sSystemBuffer); +#endif + /* Setup the DC Jtable so SRVKM can call into this driver */ @@ -1601,12 +1786,17 @@ static OMAPLFB_DEVINFO *OMAPLFBInitDev(unsigned uiFBDevID) #if defined(SUPPORT_DRI_DRM) OMAPLFBAtomicBoolInit(&psDevInfo->sLeaveVT, OMAPLFB_FALSE); #endif + return psDevInfo; ErrorUnregisterDevice: (void)psDevInfo->sPVRJTable.pfnPVRSRVRemoveDCDevice(psDevInfo->uiPVRDevID); ErrorDeInitFBDev: OMAPLFBDeInitFBDev(psDevInfo); +ErrorIonClientDestroy: +#if defined(CONFIG_ION_OMAP) + ion_client_destroy(psDevInfo->psIONClient); +#endif /* defined(CONFIG_ION_OMAP) */ ErrorFreeDevInfo: OMAPLFBFreeKernelMem(psDevInfo); ErrorExit: @@ -1652,19 +1842,6 @@ static OMAPLFB_BOOL OMAPLFBDeInitDev(OMAPLFB_DEVINFO *psDevInfo) { PVRSRV_DC_DISP2SRV_KMJTABLE *psPVRJTable = &psDevInfo->sPVRJTable; - OMAPLFBCreateSwapChainLockDeInit(psDevInfo); - - OMAPLFBAtomicBoolDeInit(&psDevInfo->sBlanked); - OMAPLFBAtomicIntDeInit(&psDevInfo->sBlankEvents); - OMAPLFBAtomicBoolDeInit(&psDevInfo->sFlushCommands); -#if defined(CONFIG_HAS_EARLYSUSPEND) - OMAPLFBAtomicBoolDeInit(&psDevInfo->sEarlySuspendFlag); -#endif -#if defined(SUPPORT_DRI_DRM) - OMAPLFBAtomicBoolDeInit(&psDevInfo->sLeaveVT); -#endif - psPVRJTable = &psDevInfo->sPVRJTable; - if (psPVRJTable->pfnPVRSRVRemoveCmdProcList (psDevInfo->uiPVRDevID, OMAPLFB_COMMAND_COUNT) != PVRSRV_OK) { printk(KERN_ERR DRIVER_PREFIX @@ -1682,9 +1859,31 @@ static OMAPLFB_BOOL OMAPLFBDeInitDev(OMAPLFB_DEVINFO *psDevInfo) ": %s: Device %u: PVR Device %u: Couldn't remove device from PVR Services\n", __FUNCTION__, psDevInfo->uiFBDevID, psDevInfo->uiPVRDevID); return OMAPLFB_FALSE; } - + +#if defined(CONFIG_DSSCOMP) + /* Disable the overlay, as we will be freeing the display buffers */ + psDevInfo->sSystemBuffer.sSysAddr.uiAddr = 0; + OMAPLFBFlip(psDevInfo, &psDevInfo->sSystemBuffer); +#endif /* defined(CONFIG_DSSCOMP) */ + + OMAPLFBCreateSwapChainLockDeInit(psDevInfo); + + OMAPLFBAtomicBoolDeInit(&psDevInfo->sBlanked); + OMAPLFBAtomicIntDeInit(&psDevInfo->sBlankEvents); + OMAPLFBAtomicBoolDeInit(&psDevInfo->sFlushCommands); +#if defined(CONFIG_HAS_EARLYSUSPEND) + OMAPLFBAtomicBoolDeInit(&psDevInfo->sEarlySuspendFlag); +#endif +#if defined(SUPPORT_DRI_DRM) + OMAPLFBAtomicBoolDeInit(&psDevInfo->sLeaveVT); +#endif + OMAPLFBDeInitFBDev(psDevInfo); +#if defined(CONFIG_ION_OMAP) + ion_client_destroy(psDevInfo->psIONClient); +#endif + OMAPLFBSetDevInfoPtr(psDevInfo->uiFBDevID, NULL); /* De-allocate data structure */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb_linux.c b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb_linux.c index 82c7fce..88fdd0a 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb_linux.c +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_omapfb3_linux/omaplfb_linux.c @@ -93,7 +93,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <linux/mutex.h> #if defined(PVR_OMAPLFB_DRM_FB) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)) #include <plat/display.h> +#else +#include <video/omapdss.h> +#endif #include <linux/omap_gpu.h> #else /* defined(PVR_OMAPLFB_DRM_FB) */ /* OmapZoom.org OMAP3 2.6.29 kernel tree - Needs mach/vrfb.h @@ -102,10 +106,15 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * OmapZoom.org OMAP4 2.6.34 kernel tree - Needs plat/vrfb.h * Sholes 2.6.32 kernel tree - Needs plat/vrfb.h */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) +#define PVR_OMAPFB3_NEEDS_VIDEO_OMAPVRFB_H +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) #define PVR_OMAPFB3_NEEDS_PLAT_VRFB_H #endif +#if defined(PVR_OMAPFB3_NEEDS_VIDEO_OMAPVRFB_H) +#include <video/omapvrfb.h> +#else #if defined(PVR_OMAPFB3_NEEDS_PLAT_VRFB_H) #include <plat/vrfb.h> #else @@ -113,12 +122,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <mach/vrfb.h> #endif #endif +#endif #if defined(DEBUG) #define PVR_DEBUG DEBUG #undef DEBUG #endif #include <omapfb/omapfb.h> +#undef DBG #if defined(DEBUG) #undef DEBUG #endif @@ -129,7 +140,15 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif /* defined(PVR_OMAPLFB_DRM_FB) */ #if defined(CONFIG_DSSCOMP) +#if defined(CONFIG_DRM_OMAP_DMM_TILER) +#include <../drivers/staging/omapdrm/omap_dmm_tiler.h> +#include <../drivers/video/omap2/dsscomp/tiler-utils.h> +#elif defined(CONFIG_TI_TILER) #include <mach/tiler.h> +#else /* defined(CONFIG_DRM_OMAP_DMM_TILER) */ +#error CONFIG_DSSCOMP support requires either \ + CONFIG_DRM_OMAP_DMM_TILER or CONFIG_TI_TILER +#endif /* defined(CONFIG_DRM_OMAP_DMM_TILER) */ #include <video/dsscomp.h> #include <plat/dsscomp.h> #endif /* defined(CONFIG_DSSCOMP) */ @@ -151,15 +170,21 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. MODULE_SUPPORTED_DEVICE(DEVNAME); #if !defined(PVR_OMAPLFB_DRM_FB) +#if defined(PVR_OMAPFB3_OMAP5_UEVM) +#define OMAP_DSS_DRIVER(drv, dev) struct omap_dss_driver *drv = (dev)->driver +#define OMAP_DSS_MANAGER(man, dev) struct omap_overlay_manager *man = (dev)->output->manager +#define WAIT_FOR_VSYNC(man) ((man)->wait_for_vsync) +#else /* defined(PVR_OMAPFB3_OMAP5_UEVM) */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) #define OMAP_DSS_DRIVER(drv, dev) struct omap_dss_driver *drv = (dev) != NULL ? (dev)->driver : NULL #define OMAP_DSS_MANAGER(man, dev) struct omap_overlay_manager *man = (dev) != NULL ? (dev)->manager : NULL #define WAIT_FOR_VSYNC(man) ((man)->wait_for_vsync) -#else +#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) */ #define OMAP_DSS_DRIVER(drv, dev) struct omap_dss_device *drv = (dev) #define OMAP_DSS_MANAGER(man, dev) struct omap_dss_device *man = (dev) #define WAIT_FOR_VSYNC(man) ((man)->wait_vsync) -#endif +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) */ +#endif /* defined(PVR_OMAPFB3_OMAP5_UEVM) */ #endif /* !defined(PVR_OMAPLFB_DRM_FB) */ void *OMAPLFBAllocKernelMem(unsigned long ulSize) @@ -325,8 +350,13 @@ void OMAPLFBFlip(OMAPLFB_DEVINFO *psDevInfo, OMAPLFB_BUFFER *psBuffer) { struct fb_var_screeninfo sFBVar; int res; - unsigned long ulYResVirtual; + if (!lock_fb_info(psDevInfo->psLINFBInfo)) + { + DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX + ": %s: Device %u: Couldn't lock FB info\n", __FUNCTION__, psDevInfo->uiFBDevID)); + return; + } OMAPLFB_CONSOLE_LOCK(); sFBVar = psDevInfo->psLINFBInfo->var; @@ -334,9 +364,26 @@ void OMAPLFBFlip(OMAPLFB_DEVINFO *psDevInfo, OMAPLFB_BUFFER *psBuffer) sFBVar.xoffset = 0; sFBVar.yoffset = psBuffer->ulYOffset; - ulYResVirtual = psBuffer->ulYOffset + sFBVar.yres; - #if defined(CONFIG_DSSCOMP) + /* + * If flipping to a NULL buffer, blank the screen to prevent + * warnings/errors from the display subsystem. + */ + if (psBuffer->sSysAddr.uiAddr == 0) + { + struct omap_dss_device *psDSSDev = fb2display(psDevInfo->psLINFBInfo); + OMAP_DSS_MANAGER(psDSSMan, psDSSDev); + + if (psDSSMan != NULL && psDSSMan->blank != NULL) + { + res = psDSSMan->blank(psDSSMan, false); + if (res != 0) + { + DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: DSS manager blank call failed (Y Offset: %lu, Error: %d)\n", __FUNCTION__, psDevInfo->uiFBDevID, psBuffer->ulYOffset, res)); + } + } + } + { /* * If using DSSCOMP, we need to use dsscomp queuing for normal @@ -364,7 +411,7 @@ void OMAPLFBFlip(OMAPLFB_DEVINFO *psDevInfo, OMAPLFB_BUFFER *psBuffer) .width = sFBVar.xres_virtual, .height = sFBVar.yres_virtual, .stride = sFBFix.line_length, - .enabled = 1, + .enabled = (psBuffer->sSysAddr.uiAddr != 0), .global_alpha = 255, }, }, @@ -373,52 +420,71 @@ void OMAPLFBFlip(OMAPLFB_DEVINFO *psDevInfo, OMAPLFB_BUFFER *psBuffer) /* do not map buffer into TILER1D as it is contiguous */ struct tiler_pa_info *pas[] = { NULL }; - d.ovls[0].ba = sFBFix.smem_start; + d.ovls[0].ba = (u32) psBuffer->sSysAddr.uiAddr; + omapfb_mode_to_dss_mode(&sFBVar, &d.ovls[0].cfg.color_mode); res = dsscomp_gralloc_queue(&d, pas, true, NULL, NULL); + if (res != 0) + { + DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: dsscomp_gralloc_queue failed (Y Offset: %lu, Error: %d)\n", __FUNCTION__, psDevInfo->uiFBDevID, psBuffer->ulYOffset, res)); + } } #else /* defined(CONFIG_DSSCOMP) */ - /* - * PVR_OMAPLFB_DONT_USE_FB_PAN_DISPLAY should be defined to work - * around flipping problems seen with the Taal LCDs on Blaze. - * The work around is safe to use with other types of screen on Blaze - * (e.g. HDMI) and on other platforms (e.g. Panda board). - */ + { + unsigned long ulYResVirtual = psBuffer->ulYOffset + sFBVar.yres; + + /* + * PVR_OMAPLFB_DONT_USE_FB_PAN_DISPLAY should be defined to + * work around flipping problems seen with the Taal LCDs on + * Blaze. + * The work around is safe to use with other types of screen + * on Blaze (e.g. HDMI) and on other platforms (e.g. Panda + * board). + */ #if !defined(PVR_OMAPLFB_DONT_USE_FB_PAN_DISPLAY) - /* - * Attempt to change the virtual screen resolution if it is too - * small. Note that fb_set_var also pans the display. - */ - if (sFBVar.xres_virtual != sFBVar.xres || sFBVar.yres_virtual < ulYResVirtual) + /* + * Attempt to change the virtual screen resolution if it is too + * small. Note that fb_set_var also pans the display. + */ + if (sFBVar.xres_virtual != sFBVar.xres || sFBVar.yres_virtual < ulYResVirtual) #endif /* !defined(PVR_OMAPLFB_DONT_USE_FB_PAN_DISPLAY) */ - { - sFBVar.xres_virtual = sFBVar.xres; - sFBVar.yres_virtual = ulYResVirtual; + { + sFBVar.xres_virtual = sFBVar.xres; + sFBVar.yres_virtual = ulYResVirtual; - sFBVar.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; + sFBVar.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; - res = fb_set_var(psDevInfo->psLINFBInfo, &sFBVar); - if (res != 0) - { - printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: fb_set_var failed (Y Offset: %lu, Error: %d)\n", __FUNCTION__, psDevInfo->uiFBDevID, psBuffer->ulYOffset, res); + res = fb_set_var(psDevInfo->psLINFBInfo, &sFBVar); + if (res != 0) + { + printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: fb_set_var failed (Y Offset: %lu, Error: %d)\n", __FUNCTION__, psDevInfo->uiFBDevID, psBuffer->ulYOffset, res); + } } - } #if !defined(PVR_OMAPLFB_DONT_USE_FB_PAN_DISPLAY) - else - { - res = fb_pan_display(psDevInfo->psLINFBInfo, &sFBVar); - if (res != 0) + else { - printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: fb_pan_display failed (Y Offset: %lu, Error: %d)\n", __FUNCTION__, psDevInfo->uiFBDevID, psBuffer->ulYOffset, res); + res = fb_pan_display(psDevInfo->psLINFBInfo, &sFBVar); + if (res != 0) + { + printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: fb_pan_display failed (Y Offset: %lu, Error: %d)\n", __FUNCTION__, psDevInfo->uiFBDevID, psBuffer->ulYOffset, res); + } } - } #endif /* !defined(PVR_OMAPLFB_DONT_USE_FB_PAN_DISPLAY) */ + } #endif /* defined(CONFIG_DSSCOMP) */ OMAPLFB_CONSOLE_UNLOCK(); + unlock_fb_info(psDevInfo->psLINFBInfo); } +/* Newer kernels don't have any update mode capability */ + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) +#define PVR_OMAPLFB_HAS_UPDATE_MODE +#endif + +#if defined(PVR_OMAPLFB_HAS_UPDATE_MODE) #if !defined(PVR_OMAPLFB_DRM_FB) || defined(DEBUG) static OMAPLFB_BOOL OMAPLFBValidateDSSUpdateMode(enum omap_dss_update_mode eMode) { @@ -514,46 +580,7 @@ static const char *OMAPLFBDSSUpdateModeToString(enum omap_dss_update_mode eMode) return OMAPLFBUpdateModeToString(OMAPLFBFromDSSUpdateMode(eMode)); } - -void OMAPLFBPrintInfo(OMAPLFB_DEVINFO *psDevInfo) -{ -#if defined(PVR_OMAPLFB_DRM_FB) - struct drm_connector *psConnector; - unsigned uConnectors; - unsigned uConnector; - - DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: DRM framebuffer\n", psDevInfo->uiFBDevID)); - - for (psConnector = NULL, uConnectors = 0; - (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL;) - { - uConnectors++; - } - - DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Number of screens (DRM connectors): %u\n", psDevInfo->uiFBDevID, uConnectors)); - - if (uConnectors == 0) - { - return; - } - - for (psConnector = NULL, uConnector = 0; - (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL; uConnector++) - { - enum omap_dss_update_mode eMode = omap_connector_get_update_mode(psConnector); - - DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Screen %u: %s (%d)\n", psDevInfo->uiFBDevID, uConnector, OMAPLFBDSSUpdateModeToString(eMode), (int)eMode)); - - } -#else /* defined(PVR_OMAPLFB_DRM_FB) */ - OMAPLFB_UPDATE_MODE eMode = OMAPLFBGetUpdateMode(psDevInfo); - - DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: non-DRM framebuffer\n", psDevInfo->uiFBDevID)); - - DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: %s\n", psDevInfo->uiFBDevID, OMAPLFBUpdateModeToString(eMode))); -#endif /* defined(PVR_OMAPLFB_DRM_FB) */ -} -#endif /* defined(DEBUG) */ +#endif /* defined(DEBUG) */ /* * Get display update mode. @@ -709,6 +736,61 @@ OMAPLFB_BOOL OMAPLFBSetUpdateMode(OMAPLFB_DEVINFO *psDevInfo, OMAPLFB_UPDATE_MOD return (res == 0); #endif /* defined(PVR_OMAPLFB_DRM_FB) */ } +#else /* defined(PVR_OMAPLFB_HAS_UPDATE_MODE) */ + +OMAPLFB_UPDATE_MODE OMAPLFBGetUpdateMode(OMAPLFB_DEVINFO *psDevInfo) +{ +#if defined(PVR_OMAPFB3_OMAP5_UEVM) + return OMAPLFB_UPDATE_MODE_VSYNC; +#else + return OMAPLFB_UPDATE_MODE_UNDEFINED; +#endif +} + +#endif /* defined(PVR_OMAPLFB_HAS_UPDATE_MODE) */ + +#if defined(DEBUG) +void OMAPLFBPrintInfo(OMAPLFB_DEVINFO *psDevInfo) +{ +#if defined(PVR_OMAPLFB_DRM_FB) + struct drm_connector *psConnector; + unsigned uConnectors; + unsigned uConnector; + + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: DRM framebuffer\n", psDevInfo->uiFBDevID)); + + for (psConnector = NULL, uConnectors = 0; + (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL;) + { + uConnectors++; + } + + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Number of screens (DRM connectors): %u\n", psDevInfo->uiFBDevID, uConnectors)); + + if (uConnectors == 0) + { + return; + } + + for (psConnector = NULL, uConnector = 0; + (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL; uConnector++) + { + enum omap_dss_update_mode eMode = omap_connector_get_update_mode(psConnector); + + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Screen %u: %s (%d)\n", psDevInfo->uiFBDevID, uConnector, OMAPLFBDSSUpdateModeToString(eMode), (int)eMode)); + + } +#else /* defined(PVR_OMAPLFB_DRM_FB) */ +#if defined(PVR_OMAPLFB_HAS_UPDATE_MODE) + OMAPLFB_UPDATE_MODE eMode = OMAPLFBGetUpdateMode(psDevInfo); + + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: %s\n", psDevInfo->uiFBDevID, OMAPLFBUpdateModeToString(eMode))); +#endif + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: non-DRM framebuffer\n", psDevInfo->uiFBDevID)); + +#endif /* defined(PVR_OMAPLFB_DRM_FB) */ +} +#endif /* defined(DEBUG) */ /* Wait for VSync */ OMAPLFB_BOOL OMAPLFBWaitForVSync(OMAPLFB_DEVINFO *psDevInfo) @@ -845,14 +927,32 @@ static int OMAPLFBFrameBufferEvents(struct notifier_block *psNotif, return 0; } -/* Unblank the screen */ -OMAPLFB_ERROR OMAPLFBUnblankDisplay(OMAPLFB_DEVINFO *psDevInfo) +/* + * Blank or Unblank the screen. To be called where the unblank is being done + * in user context. + */ +static OMAPLFB_ERROR OMAPLFBBlankOrUnblankDisplay(OMAPLFB_DEVINFO *psDevInfo, IMG_BOOL bBlank) { int res; + if (!lock_fb_info(psDevInfo->psLINFBInfo)) + { + printk(KERN_ERR DRIVER_PREFIX + ": %s: Device %u: Couldn't lock FB info\n", __FUNCTION__, psDevInfo->uiFBDevID); + return (OMAPLFB_ERROR_GENERIC); + } + + /* + * FBINFO_MISC_USEREVENT is set to avoid a deadlock resulting from + * fb_blank being called recursively due from within the fb_blank event + * notification. + */ OMAPLFB_CONSOLE_LOCK(); - res = fb_blank(psDevInfo->psLINFBInfo, 0); + psDevInfo->psLINFBInfo->flags |= FBINFO_MISC_USEREVENT; + res = fb_blank(psDevInfo->psLINFBInfo, bBlank ? 1 : 0); + psDevInfo->psLINFBInfo->flags &= ~FBINFO_MISC_USEREVENT; OMAPLFB_CONSOLE_UNLOCK(); + unlock_fb_info(psDevInfo->psLINFBInfo); if (res != 0 && res != -EINVAL) { printk(KERN_ERR DRIVER_PREFIX @@ -863,10 +963,23 @@ OMAPLFB_ERROR OMAPLFBUnblankDisplay(OMAPLFB_DEVINFO *psDevInfo) return (OMAPLFB_OK); } +/* Unblank the screen */ +OMAPLFB_ERROR OMAPLFBUnblankDisplay(OMAPLFB_DEVINFO *psDevInfo) +{ + return OMAPLFBBlankOrUnblankDisplay(psDevInfo, IMG_FALSE); +} + #ifdef CONFIG_HAS_EARLYSUSPEND /* Blank the screen */ -static void OMAPLFBBlankDisplay(OMAPLFB_DEVINFO *psDevInfo) +static void OMAPLFBEarlyUnblankDisplay(OMAPLFB_DEVINFO *psDevInfo) +{ + OMAPLFB_CONSOLE_LOCK(); + fb_blank(psDevInfo->psLINFBInfo, 0); + OMAPLFB_CONSOLE_UNLOCK(); +} + +static void OMAPLFBEarlyBlankDisplay(OMAPLFB_DEVINFO *psDevInfo) { OMAPLFB_CONSOLE_LOCK(); fb_blank(psDevInfo->psLINFBInfo, 1); @@ -885,7 +998,7 @@ static void OMAPLFBEarlySuspendHandler(struct early_suspend *h) if (psDevInfo != NULL) { OMAPLFBAtomicBoolSet(&psDevInfo->sEarlySuspendFlag, OMAPLFB_TRUE); - OMAPLFBBlankDisplay(psDevInfo); + OMAPLFBEarlyBlankDisplay(psDevInfo); } } } @@ -901,7 +1014,7 @@ static void OMAPLFBEarlyResumeHandler(struct early_suspend *h) if (psDevInfo != NULL) { - OMAPLFBUnblankDisplay(psDevInfo); + OMAPLFBEarlyUnblankDisplay(psDevInfo); OMAPLFBAtomicBoolSet(&psDevInfo->sEarlySuspendFlag, OMAPLFB_FALSE); } } @@ -997,36 +1110,32 @@ static OMAPLFB_DEVINFO *OMAPLFBPVRDevIDToDevInfo(unsigned uiPVRDevID) int PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Ioctl)(struct drm_device unref__ *dev, void *arg, struct drm_file unref__ *pFile) { - uint32_t *puiArgs; - uint32_t uiCmd; - unsigned uiPVRDevID; - int ret = 0; + drm_pvr_display_cmd *psArgs; OMAPLFB_DEVINFO *psDevInfo; + int ret = 0; if (arg == NULL) { return -EFAULT; } - puiArgs = (uint32_t *)arg; - uiCmd = puiArgs[PVR_DRM_DISP_ARG_CMD]; - uiPVRDevID = puiArgs[PVR_DRM_DISP_ARG_DEV]; + psArgs = (drm_pvr_display_cmd *)arg; - psDevInfo = OMAPLFBPVRDevIDToDevInfo(uiPVRDevID); + psDevInfo = OMAPLFBPVRDevIDToDevInfo(psArgs->dev); if (psDevInfo == NULL) { return -EINVAL; } - switch (uiCmd) + switch (psArgs->cmd) { case PVR_DRM_DISP_CMD_LEAVE_VT: case PVR_DRM_DISP_CMD_ENTER_VT: { - OMAPLFB_BOOL bLeaveVT = (uiCmd == PVR_DRM_DISP_CMD_LEAVE_VT); + OMAPLFB_BOOL bLeaveVT = (psArgs->cmd == PVR_DRM_DISP_CMD_LEAVE_VT); DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: PVR Device %u: %s\n", - __FUNCTION__, uiPVRDevID, + __FUNCTION__, psArgs->dev, bLeaveVT ? "Leave VT" : "Enter VT")); OMAPLFBCreateSwapChainLock(psDevInfo); @@ -1056,7 +1165,7 @@ int PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Ioctl)(struct drm_device unref__ *dev, #if defined(DEBUG) { const char *pszMode; - switch(uiCmd) + switch(psArgs->cmd) { case PVR_DRM_DISP_CMD_ON: pszMode = "On"; @@ -1075,10 +1184,10 @@ int PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Ioctl)(struct drm_device unref__ *dev, break; } printk(KERN_WARNING DRIVER_PREFIX ": %s: PVR Device %u: Display %s\n", - __FUNCTION__, uiPVRDevID, pszMode); + __FUNCTION__, psArgs->dev, pszMode); } #endif - switch(uiCmd) + switch(psArgs->cmd) { case PVR_DRM_DISP_CMD_ON: iFBMode = FB_BLANK_UNBLANK; @@ -1103,9 +1212,19 @@ int PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Ioctl)(struct drm_device unref__ *dev, flush_workqueue(psDevInfo->psSwapChain->psWorkQueue); } - OMAPLFB_CONSOLE_LOCK(); - ret = fb_blank(psDevInfo->psLINFBInfo, iFBMode); - OMAPLFB_CONSOLE_UNLOCK(); + if (!lock_fb_info(psDevInfo->psLINFBInfo)) + { + ret = -ENODEV; + } + else + { + OMAPLFB_CONSOLE_LOCK(); + psDevInfo->psLINFBInfo->flags |= FBINFO_MISC_USEREVENT; + ret = fb_blank(psDevInfo->psLINFBInfo, iFBMode); + psDevInfo->psLINFBInfo->flags &= ~FBINFO_MISC_USEREVENT; + OMAPLFB_CONSOLE_UNLOCK(); + unlock_fb_info(psDevInfo->psLINFBInfo); + } OMAPLFBCreateSwapChainUnLock(psDevInfo); diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_sunxi/Kbuild.mk b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_sunxi/Kbuild.mk new file mode 100644 index 0000000..57ef518 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_sunxi/Kbuild.mk @@ -0,0 +1,46 @@ +########################################################################### ### +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### + +ccflags-y += \ + -I$(TOP)/services4/3rdparty/dc_sunxi \ + -Idrivers/video + +dc_sunxi-y += \ + services4/3rdparty/dc_sunxi/dc_sunxi_displayclass.o diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_sunxi/Linux.mk b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_sunxi/Linux.mk new file mode 100644 index 0000000..bcb6356 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_sunxi/Linux.mk @@ -0,0 +1,45 @@ +########################################################################### ### +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### + +modules := dc_sunxi + +dc_sunxi_type := kernel_module +dc_sunxi_target := dc_sunxi.ko +dc_sunxi_makefile := $(THIS_DIR)/Kbuild.mk diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_sunxi/dc_sunxi_displayclass.c b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_sunxi/dc_sunxi_displayclass.c new file mode 100644 index 0000000..6af20f6 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/dc_sunxi/dc_sunxi_displayclass.c @@ -0,0 +1,1765 @@ +/*************************************************************************/ /*! +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#include <linux/version.h> +#include <linux/kernel.h> +#include <linux/console.h> +#include <linux/fb.h> +#include <linux/module.h> +#include <linux/string.h> +#include <linux/notifier.h> + + +#if defined(SUPPORT_DRI_DRM) +#include <drm/drmP.h> +#endif + +/* IMG services headers */ +#include "img_defs.h" +#include "servicesext.h" +#include "kerneldisplay.h" +#include "linux/drv_display.h" + +#if defined(SUPPORT_DRI_DRM) +#include "pvr_drm.h" +#else +#include "pvrmodule.h" +#endif + +#define DC_SUNXI_COMMAND_COUNT 1 + +#define DC_SUNXI_VSYNC_SETTLE_COUNT 5 + +#define DC_SUNXI_MAX_NUM_DEVICES 1 + +//#define DC_SUNXI_DISPC_GRALLOC_QUEUE_IN_V1_PATH + +#if (DC_SUNXI_MAX_NUM_DEVICES > FB_MAX) +#error DC_SUNXI_MAX_NUM_DEVICES must not be greater than FB_MAX +#endif + +/* DEBUG only printk */ +#ifdef DEBUG +#define DEBUG_PRINTK(x) printk x +#else +#define DEBUG_PRINTK(x) +#endif + +#define DISPLAY_DEVICE_NAME "SUNXI Linux Display Driver" +#define DRVNAME "dc_sunxi" +#define DEVNAME DRVNAME +#define DRIVER_PREFIX DRVNAME + +#ifndef UNREFERENCED_PARAMETER +#define UNREFERENCED_PARAMETER(param) (param) = (param) +#endif + +#if !defined(SUPPORT_DRI_DRM) +MODULE_SUPPORTED_DEVICE(DEVNAME); +#endif + +/* DC_SUNXI buffer structure */ +typedef struct DC_SUNXI_BUFFER_TAG +{ + struct DC_SUNXI_BUFFER_TAG *psNext; + struct DC_SUNXI_DEVINFO_TAG *psDevInfo; + + struct work_struct sWork; + + /* Position of this buffer in the virtual framebuffer */ + unsigned long ulYOffset; + + /* IMG structures used, to minimise API function code */ + /* replace with own structures where necessary */ + IMG_SYS_PHYADDR sSysAddr; + IMG_CPU_VIRTADDR sCPUVAddr; + PVRSRV_SYNC_DATA *psSyncData; + + void *hCmdComplete; + unsigned long ulSwapInterval; + +} DC_SUNXI_BUFFER; + +/* DC_SUNXI swapchain structure */ +typedef struct DC_SUNXI_SWAPCHAIN_TAG +{ + /* Swap chain ID */ + unsigned int uiSwapChainID; + + /* number of buffers in swapchain */ + unsigned long ulBufferCount; + + /* list of buffers in the swapchain */ + DC_SUNXI_BUFFER *psBuffer; + + /* Swap chain work queue */ + struct workqueue_struct *psWorkQueue; + + /* + * Set if we didn't manage to wait for VSync on last swap, + * or if we think we need to wait for VSync on the next flip. + * The flag helps to avoid jitter when the screen is + * unblanked, by forcing an extended wait for VSync before + * attempting the next flip. + */ + bool bNotVSynced; + + /* Framebuffer Device ID for messages (e.g. printk) */ + unsigned int uiFBDevID; + +} DC_SUNXI_SWAPCHAIN; + +typedef struct DC_SUNXI_FBINFO_TAG +{ + unsigned long ulFBSize; + unsigned long ulBufferSize; + unsigned long ulRoundedBufferSize; + unsigned long ulWidth; + unsigned long ulHeight; + unsigned long ulByteStride; + unsigned long ulPhysicalWidthmm; + unsigned long ulPhysicalHeightmm; + + /* IMG structures used, to minimise API function code */ + /* replace with own structures where necessary */ + IMG_SYS_PHYADDR sSysAddr; + IMG_CPU_VIRTADDR sCPUVAddr; + + /* pixelformat of system/primary surface */ + PVRSRV_PIXEL_FORMAT ePixelFormat; + +} DC_SUNXI_FBINFO; + +/* kernel device information structure */ +typedef struct DC_SUNXI_DEVINFO_TAG +{ + /* Framebuffer Device ID */ + unsigned int uiFBDevID; + + /* PVR Device ID */ + unsigned int uiPVRDevID; + + /* Swapchain create/destroy mutex */ + struct mutex sCreateSwapChainMutex; + + /* system surface info */ + DC_SUNXI_BUFFER sSystemBuffer; + + /* jump table into PVR services */ + PVRSRV_DC_DISP2SRV_KMJTABLE sPVRJTable; + + /* jump table into DC */ + PVRSRV_DC_SRV2DISP_KMJTABLE sDCJTable; + + /* fb info structure */ + DC_SUNXI_FBINFO sFBInfo; + + /* Only one swapchain supported by this device so hang it here */ + DC_SUNXI_SWAPCHAIN *psSwapChain; + + /* Swap chain ID */ + unsigned int uiSwapChainID; + + /* True if PVR Services is flushing its command queues */ + atomic_t sFlushCommands; + + /* pointer to linux frame buffer information structure */ + struct fb_info *psLINFBInfo; + + /* IMG structures used, to minimise API function code */ + /* replace with own structures where necessary */ + + DISPLAY_INFO sDisplayInfo; + + /* Display format */ + DISPLAY_FORMAT sDisplayFormat; + + /* Display dimensions */ + DISPLAY_DIMS sDisplayDim; + + /* Number of blank/unblank events */ + atomic_t sBlankEvents; + +} DC_SUNXI_DEVINFO; + +typedef enum _DC_SUNXI_ERROR_ +{ + DC_SUNXI_OK = 0, + DC_SUNXI_ERROR_GENERIC = 1, + DC_SUNXI_ERROR_INIT_FAILURE = 2, + DC_SUNXI_ERROR_INVALID_DEVICE = 3, + +} DC_SUNXI_ERROR; + +static DC_SUNXI_DEVINFO *gapsDevInfo[DC_SUNXI_MAX_NUM_DEVICES]; + +/* Top level 'hook ptr' */ +static PFN_DC_GET_PVRJTABLE gpfnGetPVRJTable; + +/* Don't wait for vertical sync */ +static inline bool DontWaitForVSync(DC_SUNXI_DEVINFO *psDevInfo) +{ + return atomic_read(&psDevInfo->sFlushCommands); +} + +/* + * Called after the screen has unblanked, or after any other occasion + * when we didn't wait for vsync, but now need to. Not doing this after + * unblank leads to screen jitter on some screens. + * Returns true if the screen has been deemed to have settled. + */ +static bool WaitForVSyncSettle(DC_SUNXI_DEVINFO *psDevInfo) +{ + unsigned int i; + for(i = 0; i < DC_SUNXI_VSYNC_SETTLE_COUNT; i++) + { + if (DontWaitForVSync(psDevInfo)) + { + return false; + } + } + + return true; +} + +/* Flip display to given buffer */ +static void DC_SUNXIFlip(DC_SUNXI_DEVINFO *psDevInfo, DC_SUNXI_BUFFER *psBuffer) +{ + struct fb_var_screeninfo sFBVar; + unsigned long ulYResVirtual; + int res; + + console_lock(); + + sFBVar = psDevInfo->psLINFBInfo->var; + + sFBVar.xoffset = 0; + sFBVar.yoffset = psBuffer->ulYOffset; + + ulYResVirtual = psBuffer->ulYOffset + sFBVar.yres; + + res = fb_pan_display(psDevInfo->psLINFBInfo, &sFBVar); + if (res != 0) + { + printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: fb_pan_display failed (Y Offset: %lu, Error: %d)\n", __FUNCTION__, psDevInfo->uiFBDevID, psBuffer->ulYOffset, res); + } + + console_unlock(); +} + +/* + * Swap handler. + * Called from the swap chain work queue handler. + * There is no need to take the swap chain creation lock in here, or use + * some other method of stopping the swap chain from being destroyed. + * This is because the swap chain creation lock is taken when queueing work, + * and the work queue is flushed before the swap chain is destroyed. + */ +static void DC_SUNXISwapHandler(DC_SUNXI_BUFFER *psBuffer) +{ + DC_SUNXI_DEVINFO *psDevInfo = psBuffer->psDevInfo; + DC_SUNXI_SWAPCHAIN *psSwapChain = psDevInfo->psSwapChain; + bool bPreviouslyNotVSynced; + + DC_SUNXIFlip(psDevInfo, psBuffer); + + bPreviouslyNotVSynced = psSwapChain->bNotVSynced; + psSwapChain->bNotVSynced = true; + + if (!DontWaitForVSync(psDevInfo)) + { + psSwapChain->bNotVSynced = false; + + if (bPreviouslyNotVSynced) + { + psSwapChain->bNotVSynced = !WaitForVSyncSettle(psDevInfo); + } + else if (psBuffer->ulSwapInterval != 0) + { + psSwapChain->bNotVSynced = IMG_FALSE; + } + } + + psDevInfo->sPVRJTable.pfnPVRSRVCmdComplete((IMG_HANDLE)psBuffer->hCmdComplete, IMG_TRUE); +} + +/* Process an item on a swap chain work queue */ +static void WorkQueueHandler(struct work_struct *psWork) +{ + DC_SUNXI_BUFFER *psBuffer = container_of(psWork, DC_SUNXI_BUFFER, sWork); + + DC_SUNXISwapHandler(psBuffer); +} + +/* Create a swap chain work queue */ +static DC_SUNXI_ERROR DC_SUNXICreateSwapQueue(DC_SUNXI_SWAPCHAIN *psSwapChain) +{ + /* + * Calling alloc_ordered_workqueue with the WQ_FREEZABLE and + * WQ_MEM_RECLAIM flags set, (currently) has the same effect as + * calling create_freezable_workqueue. None of the other WQ + * flags are valid. Setting WQ_MEM_RECLAIM should allow the + * workqueue to continue to service the swap chain in low memory + * conditions, preventing the driver from holding on to + * resources longer than it needs to. + */ + psSwapChain->psWorkQueue = alloc_ordered_workqueue(DEVNAME, WQ_FREEZABLE | WQ_MEM_RECLAIM); + if (psSwapChain->psWorkQueue == NULL) + { + printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: Couldn't create workqueue\n", __FUNCTION__, psSwapChain->uiFBDevID); + + return (DC_SUNXI_ERROR_INIT_FAILURE); + } + + return (DC_SUNXI_OK); +} + +/* Prepare buffer for insertion into a swap chain work queue */ +static void DC_SUNXIInitBufferForSwap(DC_SUNXI_BUFFER *psBuffer) +{ + INIT_WORK(&psBuffer->sWork, WorkQueueHandler); +} + +/* Destroy a swap chain work queue */ +static void DC_SUNXIDestroySwapQueue(DC_SUNXI_SWAPCHAIN *psSwapChain) +{ + destroy_workqueue(psSwapChain->psWorkQueue); +} + +/* Unblank the screen */ +static DC_SUNXI_ERROR DC_SUNXIUnblankDisplay(DC_SUNXI_DEVINFO *psDevInfo) +{ + int res; + + console_lock(); + res = fb_blank(psDevInfo->psLINFBInfo, 0); + console_unlock(); + + if (res != 0 && res != -EINVAL) + { + printk(KERN_ERR DRIVER_PREFIX + ": %s: Device %u: fb_blank failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, res); + return (DC_SUNXI_ERROR_GENERIC); + } + + return (DC_SUNXI_OK); +} + +/* Round x up to a multiple of y */ +static inline unsigned long RoundUpToMultiple(unsigned long x, unsigned long y) +{ + unsigned long div = x / y; + unsigned long rem = x % y; + + return (div + ((rem == 0) ? 0 : 1)) * y; +} + +/* Greatest common divisor of x and y */ +static unsigned long GCD(unsigned long x, unsigned long y) +{ + while (y != 0) + { + unsigned long r = x % y; + x = y; + y = r; + } + + return x; +} + +/* Least common multiple of x and y */ +static unsigned long LCM(unsigned long x, unsigned long y) +{ + unsigned long gcd = GCD(x, y); + + return (gcd == 0) ? 0 : ((x / gcd) * y); +} + +static unsigned DC_SUNXIMaxFBDevIDPlusOne(void) +{ + return DC_SUNXI_MAX_NUM_DEVICES; +} + +/* Returns DevInfo pointer for a given device */ +static DC_SUNXI_DEVINFO *DC_SUNXIGetDevInfoPtr(unsigned uiFBDevID) +{ + WARN_ON(uiFBDevID >= DC_SUNXIMaxFBDevIDPlusOne()); + + if (uiFBDevID >= DC_SUNXI_MAX_NUM_DEVICES) + { + return NULL; + } + + return gapsDevInfo[uiFBDevID]; +} + +/* Sets the DevInfo pointer for a given device */ +static inline void DC_SUNXISetDevInfoPtr(unsigned uiFBDevID, DC_SUNXI_DEVINFO *psDevInfo) +{ + WARN_ON(uiFBDevID >= DC_SUNXI_MAX_NUM_DEVICES); + + if (uiFBDevID < DC_SUNXI_MAX_NUM_DEVICES) + { + gapsDevInfo[uiFBDevID] = psDevInfo; + } +} + +static inline bool SwapChainHasChanged(DC_SUNXI_DEVINFO *psDevInfo, DC_SUNXI_SWAPCHAIN *psSwapChain) +{ + return (psDevInfo->psSwapChain != psSwapChain) || + (psDevInfo->uiSwapChainID != psSwapChain->uiSwapChainID); +} + +extern int dispc_gralloc_queue(setup_dispc_data_t *psDispcData, int ui32DispcDataLength, void (*cb_fn)(void *, int), void *cb_arg); + +static void +QueueBufferImmediate(DC_SUNXI_DEVINFO *psDevInfo, IMG_SYS_PHYADDR sSysAddr, + void (*cb_fn)(void *, int), void *cb_arg) +{ + setup_dispc_data_t sDispcData = + { + .post2_layers = 1, + .primary_display_layer_num = 1, + .layer_info = + { + [0] = + { + .mode = DISP_LAYER_WORK_MODE_NORMAL, + .src_win = + { + .width = psDevInfo->sFBInfo.ulWidth, + .height = psDevInfo->sFBInfo.ulHeight + }, + .scn_win = + { + .width = psDevInfo->sFBInfo.ulWidth, + .height = psDevInfo->sFBInfo.ulHeight + }, + .alpha_en = 1, + .alpha_val = 0xff, + .fb = + { + .mode = DISP_MOD_INTERLEAVED, + .format = DISP_FORMAT_ARGB8888, + .seq = DISP_SEQ_ARGB, + .pre_multiply = 1, + .size = + { + .width = psDevInfo->sFBInfo.ulWidth, + .height = psDevInfo->sFBInfo.ulHeight + }, + .addr[0] = sSysAddr.uiAddr, + }, + }, + }, + }; + + dispc_gralloc_queue(&sDispcData, sizeof(setup_dispc_data_t), cb_fn, cb_arg); +} + +static void dispc_proxy_cmdcomplete(void * cookie, int i) +{ + /* Workaround for bug in sunxi kernel, where it uses the latest cb_fn + * with older cb_arg (they should be used as a pair). + */ + if (cookie == (void *)0xdeadbeef) + return; + + /* XXX: assumes that there is only one display */ + gapsDevInfo[0]->sPVRJTable.pfnPVRSRVCmdComplete(cookie, i); +} + +/* + * SetDCState + * Called from services. + */ +static IMG_VOID SetDCState(IMG_HANDLE hDevice, IMG_UINT32 ui32State) +{ + DC_SUNXI_DEVINFO *psDevInfo = (DC_SUNXI_DEVINFO *)hDevice; + + switch (ui32State) + { + case DC_STATE_FLUSH_COMMANDS: + /* Flush out any 'real' operation waiting for another flip. + * In flush state we won't pass any 'real' operations along + * to dispc_gralloc_queue(); we'll just CmdComplete them + * immediately. + */ + QueueBufferImmediate(psDevInfo, psDevInfo->sSystemBuffer.sSysAddr, + dispc_proxy_cmdcomplete, (void *)0xdeadbeef); + atomic_set(&psDevInfo->sFlushCommands, true); + break; + case DC_STATE_NO_FLUSH_COMMANDS: + atomic_set(&psDevInfo->sFlushCommands, false); + break; + default: + break; + } +} + +/* + * OpenDCDevice + * Called from services. + */ +static PVRSRV_ERROR OpenDCDevice(IMG_UINT32 uiPVRDevID, + IMG_HANDLE *phDevice, + PVRSRV_SYNC_DATA* psSystemBufferSyncData) +{ + DC_SUNXI_DEVINFO *psDevInfo; + DC_SUNXI_ERROR eError; + unsigned int i, uiMaxFBDevIDPlusOne; + + if (!try_module_get(THIS_MODULE)) + { + return PVRSRV_ERROR_UNABLE_TO_OPEN_DC_DEVICE; + } + + uiMaxFBDevIDPlusOne = DC_SUNXIMaxFBDevIDPlusOne(); + + for (i = 0; i < uiMaxFBDevIDPlusOne; i++) + { + psDevInfo = DC_SUNXIGetDevInfoPtr(i); + if (psDevInfo != NULL && psDevInfo->uiPVRDevID == uiPVRDevID) + { + break; + } + } + + if (i == uiMaxFBDevIDPlusOne) + { + DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX + ": %s: PVR Device %u not found\n", __FUNCTION__, uiPVRDevID)); + eError = PVRSRV_ERROR_INVALID_DEVICE; + goto ErrorModulePut; + } + + /* store the system surface sync data */ + psDevInfo->sSystemBuffer.psSyncData = psSystemBufferSyncData; + + eError = DC_SUNXIUnblankDisplay(psDevInfo); + if (eError != DC_SUNXI_OK) + { + DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX + ": %s: Device %u: DC_SUNXIUnblankDisplay failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, eError)); + eError = PVRSRV_ERROR_UNBLANK_DISPLAY_FAILED; + goto ErrorModulePut; + } + + /* return handle to the devinfo */ + *phDevice = (IMG_HANDLE)psDevInfo; + + return PVRSRV_OK; + +ErrorModulePut: + module_put(THIS_MODULE); + + return eError; +} + +/* + * CloseDCDevice + * Called from services. + */ +static PVRSRV_ERROR CloseDCDevice(IMG_HANDLE hDevice) +{ + UNREFERENCED_PARAMETER(hDevice); + + module_put(THIS_MODULE); + + return PVRSRV_OK; +} + +/* + * EnumDCFormats + * Called from services. + */ +static PVRSRV_ERROR EnumDCFormats(IMG_HANDLE hDevice, + IMG_UINT32 *pui32NumFormats, + DISPLAY_FORMAT *psFormat) +{ + DC_SUNXI_DEVINFO *psDevInfo; + + if(!hDevice || !pui32NumFormats) + { + return PVRSRV_ERROR_INVALID_PARAMS; + } + + psDevInfo = (DC_SUNXI_DEVINFO*)hDevice; + + *pui32NumFormats = 1; + + if(psFormat) + { + psFormat[0] = psDevInfo->sDisplayFormat; + } + + return PVRSRV_OK; +} + +/* + * EnumDCDims + * Called from services. + */ +static PVRSRV_ERROR EnumDCDims(IMG_HANDLE hDevice, + DISPLAY_FORMAT *psFormat, + IMG_UINT32 *pui32NumDims, + DISPLAY_DIMS *psDim) +{ + DC_SUNXI_DEVINFO *psDevInfo; + + if(!hDevice || !psFormat || !pui32NumDims) + { + return PVRSRV_ERROR_INVALID_PARAMS; + } + + psDevInfo = (DC_SUNXI_DEVINFO*)hDevice; + + *pui32NumDims = 1; + + /* No need to look at psFormat; there is only one */ + if(psDim) + { + psDim[0] = psDevInfo->sDisplayDim; + } + + return PVRSRV_OK; +} + + +/* + * GetDCSystemBuffer + * Called from services. + */ +static PVRSRV_ERROR GetDCSystemBuffer(IMG_HANDLE hDevice, IMG_HANDLE *phBuffer) +{ + DC_SUNXI_DEVINFO *psDevInfo; + + if(!hDevice || !phBuffer) + { + return PVRSRV_ERROR_INVALID_PARAMS; + } + + psDevInfo = (DC_SUNXI_DEVINFO*)hDevice; + + *phBuffer = (IMG_HANDLE)&psDevInfo->sSystemBuffer; + + return PVRSRV_OK; +} + + +/* + * GetDCInfo + * Called from services. + */ +static PVRSRV_ERROR GetDCInfo(IMG_HANDLE hDevice, DISPLAY_INFO *psDCInfo) +{ + DC_SUNXI_DEVINFO *psDevInfo; + + if(!hDevice || !psDCInfo) + { + return PVRSRV_ERROR_INVALID_PARAMS; + } + + psDevInfo = (DC_SUNXI_DEVINFO*)hDevice; + + *psDCInfo = psDevInfo->sDisplayInfo; + + return PVRSRV_OK; +} + +/* + * GetDCBufferAddr + * Called from services. + */ +static PVRSRV_ERROR GetDCBufferAddr(IMG_HANDLE hDevice, + IMG_HANDLE hBuffer, + IMG_SYS_PHYADDR **ppsSysAddr, + IMG_UINT32 *pui32ByteSize, + IMG_VOID **ppvCpuVAddr, + IMG_HANDLE *phOSMapInfo, + IMG_BOOL *pbIsContiguous, + IMG_UINT32 *pui32TilingStride) +{ + DC_SUNXI_DEVINFO *psDevInfo; + DC_SUNXI_BUFFER *psSystemBuffer; + + UNREFERENCED_PARAMETER(pui32TilingStride); + + if(!hDevice) + { + return PVRSRV_ERROR_INVALID_PARAMS; + } + + if(!hBuffer) + { + return PVRSRV_ERROR_INVALID_PARAMS; + } + + if (!ppsSysAddr) + { + return PVRSRV_ERROR_INVALID_PARAMS; + } + + if (!pui32ByteSize) + { + return PVRSRV_ERROR_INVALID_PARAMS; + } + + psDevInfo = (DC_SUNXI_DEVINFO*)hDevice; + + psSystemBuffer = (DC_SUNXI_BUFFER *)hBuffer; + + *ppsSysAddr = &psSystemBuffer->sSysAddr; + + *pui32ByteSize = (IMG_UINT32)psDevInfo->sFBInfo.ulBufferSize; + + if (ppvCpuVAddr) + { + *ppvCpuVAddr = psSystemBuffer->sCPUVAddr; + } + + if (phOSMapInfo) + { + *phOSMapInfo = (IMG_HANDLE)0; + } + + if (pbIsContiguous) + { + *pbIsContiguous = IMG_TRUE; + } + + return PVRSRV_OK; +} + +/* + * CreateDCSwapChain + * Called from services. + */ +static PVRSRV_ERROR CreateDCSwapChain(IMG_HANDLE hDevice, + IMG_UINT32 ui32Flags, + DISPLAY_SURF_ATTRIBUTES *psDstSurfAttrib, + DISPLAY_SURF_ATTRIBUTES *psSrcSurfAttrib, + IMG_UINT32 ui32BufferCount, + PVRSRV_SYNC_DATA **ppsSyncData, + IMG_UINT32 ui32OEMFlags, + IMG_HANDLE *phSwapChain, + IMG_UINT32 *pui32SwapChainID) +{ + DC_SUNXI_SWAPCHAIN *psSwapChain; + DC_SUNXI_DEVINFO *psDevInfo; + PVRSRV_ERROR eError; + IMG_UINT32 i; + + UNREFERENCED_PARAMETER(ui32OEMFlags); + UNREFERENCED_PARAMETER(ui32Flags); + + /* Check parameters */ + if(!hDevice + || !psDstSurfAttrib + || !psSrcSurfAttrib + || !ppsSyncData + || !phSwapChain) + { + return PVRSRV_ERROR_INVALID_PARAMS; + } + + psDevInfo = (DC_SUNXI_DEVINFO*)hDevice; + + /* Do we support swap chains? */ + if (psDevInfo->sDisplayInfo.ui32MaxSwapChains == 0) + { + return PVRSRV_ERROR_NOT_SUPPORTED; + } + + mutex_lock(&psDevInfo->sCreateSwapChainMutex); + + /* The driver only supports a single swapchain */ + if(psDevInfo->psSwapChain != NULL) + { + eError = PVRSRV_ERROR_FLIP_CHAIN_EXISTS; + goto ExitUnLock; + } + + /* create a swapchain structure */ + psSwapChain = (DC_SUNXI_SWAPCHAIN*)kmalloc(sizeof(DC_SUNXI_SWAPCHAIN), GFP_KERNEL); + if(!psSwapChain) + { + eError = PVRSRV_ERROR_OUT_OF_MEMORY; + goto ExitUnLock; + } + + /* If services asks for a 0-length swap chain, it's probably Android. + * + * This will use only non-display memory posting via PVRSRVSwapToDCBuffers2(), + * and we can skip some useless sanity checking. + */ + if(ui32BufferCount > 0) + { + IMG_UINT32 ui32BuffersToSkip; + + /* Check the buffer count */ + if(ui32BufferCount > psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers) + { + eError = PVRSRV_ERROR_TOOMANYBUFFERS; + goto ErrorFreeSwapChain; + } + + if ((psDevInfo->sFBInfo.ulRoundedBufferSize * (unsigned long)ui32BufferCount) > psDevInfo->sFBInfo.ulFBSize) + { + eError = PVRSRV_ERROR_TOOMANYBUFFERS; + goto ErrorFreeSwapChain; + } + + /* + * We will allocate the swap chain buffers at the back of the frame + * buffer area. This preserves the front portion, which may be being + * used by other Linux Framebuffer based applications. + */ + ui32BuffersToSkip = psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers - ui32BufferCount; + + /* + * Verify the DST/SRC attributes, + * SRC/DST must match the current display mode config + */ + if(psDstSurfAttrib->pixelformat != psDevInfo->sDisplayFormat.pixelformat + || psDstSurfAttrib->sDims.ui32ByteStride != psDevInfo->sDisplayDim.ui32ByteStride + || psDstSurfAttrib->sDims.ui32Width != psDevInfo->sDisplayDim.ui32Width + || psDstSurfAttrib->sDims.ui32Height != psDevInfo->sDisplayDim.ui32Height) + { + /* DST doesn't match the current mode */ + eError = PVRSRV_ERROR_INVALID_PARAMS; + goto ErrorFreeSwapChain; + } + + if(psDstSurfAttrib->pixelformat != psSrcSurfAttrib->pixelformat + || psDstSurfAttrib->sDims.ui32ByteStride != psSrcSurfAttrib->sDims.ui32ByteStride + || psDstSurfAttrib->sDims.ui32Width != psSrcSurfAttrib->sDims.ui32Width + || psDstSurfAttrib->sDims.ui32Height != psSrcSurfAttrib->sDims.ui32Height) + { + /* DST doesn't match the SRC */ + eError = PVRSRV_ERROR_INVALID_PARAMS; + goto ErrorFreeSwapChain; + } + + psSwapChain->psBuffer = (DC_SUNXI_BUFFER*)kmalloc(sizeof(DC_SUNXI_BUFFER) * ui32BufferCount, GFP_KERNEL); + if(!psSwapChain->psBuffer) + { + eError = PVRSRV_ERROR_OUT_OF_MEMORY; + goto ErrorFreeSwapChain; + } + + /* Link the buffers */ + for(i = 0; i < ui32BufferCount - 1; i++) + { + psSwapChain->psBuffer[i].psNext = &psSwapChain->psBuffer[i + 1]; + } + + /* and link last to first */ + psSwapChain->psBuffer[i].psNext = &psSwapChain->psBuffer[0]; + + /* Configure the swapchain buffers */ + for(i = 0; i < ui32BufferCount; i++) + { + IMG_UINT32 ui32SwapBuffer = i + ui32BuffersToSkip; + IMG_UINT32 ui32BufferOffset = ui32SwapBuffer * (IMG_UINT32)psDevInfo->sFBInfo.ulRoundedBufferSize; + + psSwapChain->psBuffer[i].psSyncData = ppsSyncData[i]; + + psSwapChain->psBuffer[i].sSysAddr.uiAddr = psDevInfo->sFBInfo.sSysAddr.uiAddr + ui32BufferOffset; + psSwapChain->psBuffer[i].sCPUVAddr = psDevInfo->sFBInfo.sCPUVAddr + ui32BufferOffset; + psSwapChain->psBuffer[i].ulYOffset = ui32BufferOffset / psDevInfo->sFBInfo.ulByteStride; + psSwapChain->psBuffer[i].psDevInfo = psDevInfo; + + DC_SUNXIInitBufferForSwap(&psSwapChain->psBuffer[i]); + } + } + else + { + psSwapChain->psBuffer = NULL; + } + + psSwapChain->ulBufferCount = (unsigned long)ui32BufferCount; + psSwapChain->bNotVSynced = true; + psSwapChain->uiFBDevID = psDevInfo->uiFBDevID; + + if (DC_SUNXICreateSwapQueue(psSwapChain) != DC_SUNXI_OK) + { + printk(KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Failed to create workqueue\n", __FUNCTION__, psDevInfo->uiFBDevID); + eError = PVRSRV_ERROR_UNABLE_TO_INSTALL_ISR; + goto ErrorFreeBuffers; + } + + psDevInfo->uiSwapChainID++; + if (psDevInfo->uiSwapChainID == 0) + { + psDevInfo->uiSwapChainID++; + } + + psSwapChain->uiSwapChainID = psDevInfo->uiSwapChainID; + + psDevInfo->psSwapChain = psSwapChain; + + *pui32SwapChainID = psDevInfo->uiSwapChainID; + + *phSwapChain = (IMG_HANDLE)psSwapChain; + + eError = PVRSRV_OK; + goto ExitUnLock; + +ErrorFreeBuffers: + if(psSwapChain->psBuffer) + { + kfree(psSwapChain->psBuffer); + } +ErrorFreeSwapChain: + kfree(psSwapChain); +ExitUnLock: + mutex_unlock(&psDevInfo->sCreateSwapChainMutex); + return eError; +} + +/* + * DestroyDCSwapChain + * Called from services. + */ +static PVRSRV_ERROR DestroyDCSwapChain(IMG_HANDLE hDevice, + IMG_HANDLE hSwapChain) +{ + DC_SUNXI_DEVINFO *psDevInfo; + DC_SUNXI_SWAPCHAIN *psSwapChain; + DC_SUNXI_ERROR eError; + + /* Check parameters */ + if(!hDevice || !hSwapChain) + { + return PVRSRV_ERROR_INVALID_PARAMS; + } + + psDevInfo = (DC_SUNXI_DEVINFO*)hDevice; + psSwapChain = (DC_SUNXI_SWAPCHAIN*)hSwapChain; + + mutex_lock(&psDevInfo->sCreateSwapChainMutex); + + if (SwapChainHasChanged(psDevInfo, psSwapChain)) + { + printk(KERN_WARNING DRIVER_PREFIX + ": %s: Device %u: Swap chain mismatch\n", __FUNCTION__, psDevInfo->uiFBDevID); + + eError = PVRSRV_ERROR_INVALID_PARAMS; + goto ExitUnLock; + } + + /* The swap queue is flushed before being destroyed */ + DC_SUNXIDestroySwapQueue(psSwapChain); + + /* Free resources */ + if (psSwapChain->psBuffer) + { + kfree(psSwapChain->psBuffer); + } + kfree(psSwapChain); + + psDevInfo->psSwapChain = NULL; + + DC_SUNXIFlip(psDevInfo, &psDevInfo->sSystemBuffer); + + eError = PVRSRV_OK; + +ExitUnLock: + mutex_unlock(&psDevInfo->sCreateSwapChainMutex); + return eError; +} + +/* + * SetDCDstRect + * Called from services. + */ +static PVRSRV_ERROR SetDCDstRect(IMG_HANDLE hDevice, + IMG_HANDLE hSwapChain, + IMG_RECT *psRect) +{ + UNREFERENCED_PARAMETER(hDevice); + UNREFERENCED_PARAMETER(hSwapChain); + UNREFERENCED_PARAMETER(psRect); + + /* Only full display swapchains on this device */ + + return PVRSRV_ERROR_NOT_SUPPORTED; +} + +/* + * SetDCSrcRect + * Called from services. + */ +static PVRSRV_ERROR SetDCSrcRect(IMG_HANDLE hDevice, + IMG_HANDLE hSwapChain, + IMG_RECT *psRect) +{ + UNREFERENCED_PARAMETER(hDevice); + UNREFERENCED_PARAMETER(hSwapChain); + UNREFERENCED_PARAMETER(psRect); + + /* Only full display swapchains on this device */ + + return PVRSRV_ERROR_NOT_SUPPORTED; +} + +/* + * SetDCDstColourKey + * Called from services. + */ +static PVRSRV_ERROR SetDCDstColourKey(IMG_HANDLE hDevice, + IMG_HANDLE hSwapChain, + IMG_UINT32 ui32CKColour) +{ + UNREFERENCED_PARAMETER(hDevice); + UNREFERENCED_PARAMETER(hSwapChain); + UNREFERENCED_PARAMETER(ui32CKColour); + + /* Don't support DST CK on this device */ + + return PVRSRV_ERROR_NOT_SUPPORTED; +} + +/* + * SetDCSrcColourKey + * Called from services. + */ +static PVRSRV_ERROR SetDCSrcColourKey(IMG_HANDLE hDevice, + IMG_HANDLE hSwapChain, + IMG_UINT32 ui32CKColour) +{ + UNREFERENCED_PARAMETER(hDevice); + UNREFERENCED_PARAMETER(hSwapChain); + UNREFERENCED_PARAMETER(ui32CKColour); + + /* Don't support SRC CK on this device */ + + return PVRSRV_ERROR_NOT_SUPPORTED; +} + +/* + * GetDCBuffers + * Called from services. + */ +static PVRSRV_ERROR GetDCBuffers(IMG_HANDLE hDevice, + IMG_HANDLE hSwapChain, + IMG_UINT32 *pui32BufferCount, + IMG_HANDLE *phBuffer) +{ + DC_SUNXI_DEVINFO *psDevInfo; + DC_SUNXI_SWAPCHAIN *psSwapChain; + PVRSRV_ERROR eError; + unsigned int i; + + /* Check parameters */ + if(!hDevice + || !hSwapChain + || !pui32BufferCount + || !phBuffer) + { + return PVRSRV_ERROR_INVALID_PARAMS; + } + + psDevInfo = (DC_SUNXI_DEVINFO*)hDevice; + psSwapChain = (DC_SUNXI_SWAPCHAIN*)hSwapChain; + + mutex_lock(&psDevInfo->sCreateSwapChainMutex); + + if (SwapChainHasChanged(psDevInfo, psSwapChain)) + { + printk(KERN_WARNING DRIVER_PREFIX + ": %s: Device %u: Swap chain mismatch\n", __FUNCTION__, psDevInfo->uiFBDevID); + + eError = PVRSRV_ERROR_INVALID_PARAMS; + goto Exit; + } + + /* Return the buffer count */ + *pui32BufferCount = (IMG_UINT32)psSwapChain->ulBufferCount; + + /* Return the buffers */ + for(i=0; i<psSwapChain->ulBufferCount; i++) + { + phBuffer[i] = (IMG_HANDLE)&psSwapChain->psBuffer[i]; + } + + eError = PVRSRV_OK; + +Exit: + mutex_unlock(&psDevInfo->sCreateSwapChainMutex); + return eError; +} + +/* + * SwapToDCBuffer + * Called from services. + */ +static PVRSRV_ERROR SwapToDCBuffer(IMG_HANDLE hDevice, + IMG_HANDLE hBuffer, + IMG_UINT32 ui32SwapInterval, + IMG_HANDLE hPrivateTag, + IMG_UINT32 ui32ClipRectCount, + IMG_RECT *psClipRect) +{ + UNREFERENCED_PARAMETER(hDevice); + UNREFERENCED_PARAMETER(hBuffer); + UNREFERENCED_PARAMETER(ui32SwapInterval); + UNREFERENCED_PARAMETER(hPrivateTag); + UNREFERENCED_PARAMETER(ui32ClipRectCount); + UNREFERENCED_PARAMETER(psClipRect); + + /* * Nothing to do since Services common code does the work */ + + return PVRSRV_OK; +} + +/* Triggered by PVRSRVSwapToDCBuffer */ +static IMG_BOOL ProcessFlipV1(IMG_HANDLE hCmdCookie, + DC_SUNXI_DEVINFO *psDevInfo, + DC_SUNXI_SWAPCHAIN *psSwapChain, + DC_SUNXI_BUFFER *psBuffer, + unsigned long ulSwapInterval) +{ + mutex_lock(&psDevInfo->sCreateSwapChainMutex); + + /* The swap chain has been destroyed */ + if (SwapChainHasChanged(psDevInfo, psSwapChain)) + { + DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX + ": %s: Device %u (PVR Device ID %u): The swap chain has been destroyed\n", + __FUNCTION__, psDevInfo->uiFBDevID, psDevInfo->uiPVRDevID)); + } + else + { +#if defined(DC_SUNXI_DISPC_GRALLOC_QUEUE_IN_V1_PATH) + /* Not enabled by default yet until we have a way to CmdComplete + * after vblank rather than after next programming! + */ + QueueBufferImmediate(psDevInfo, psBuffer->sSysAddr, + dispc_proxy_cmdcomplete, (void *)0xdeadbeef); + + /* When dispc_gralloc_queue() can call back after programming, + * this can be removed. + */ + psDevInfo->sPVRJTable.pfnPVRSRVCmdComplete(hCmdCookie, IMG_TRUE); +#else /* DC_SUNXI_DISPC_GRALLOC_QUEUE_IN_V1_PATH */ + int res; + + psBuffer->hCmdComplete = hCmdCookie; + psBuffer->ulSwapInterval = ulSwapInterval; + + res = queue_work(psSwapChain->psWorkQueue, &psBuffer->sWork); + if (res == 0) + { + printk(KERN_WARNING DRIVER_PREFIX + ": %s: Device %u: Buffer already on work queue\n", + __FUNCTION__, psSwapChain->uiFBDevID); + } +#endif /* DC_SUNXI_DISPC_GRALLOC_QUEUE_IN_V1_PATH */ + } + + mutex_unlock(&psDevInfo->sCreateSwapChainMutex); + return IMG_TRUE; +} + +static IMG_BOOL ProcessFlipV2(IMG_HANDLE hCmdCookie, + DC_SUNXI_DEVINFO *psDevInfo, + PDC_MEM_INFO *ppsMemInfos, + IMG_UINT32 ui32NumMemInfos, + setup_dispc_data_t *psDispcData, + IMG_UINT32 ui32DispcDataLength) +{ + int i; + + if(!psDispcData) + { + if(ui32NumMemInfos == 1) + { + IMG_CPU_PHYADDR phyAddr; + IMG_SYS_PHYADDR sSysAddr; + + psDevInfo->sPVRJTable.pfnPVRSRVDCMemInfoGetCpuPAddr(ppsMemInfos[0], 0, &phyAddr); + sSysAddr.uiAddr = phyAddr.uiAddr; + + /* If we got a meminfo but no private data, assume the 'null' HWC + * backend is in use, and emulate a swapchain-less ProcessFlipV1. + */ + QueueBufferImmediate(psDevInfo, sSysAddr, + dispc_proxy_cmdcomplete, hCmdCookie); + } + else + { + printk(KERN_WARNING DRIVER_PREFIX + ": %s: Device %u: WARNING: psDispcData was NULL. " + "The HWC probably has a bug. Silently ignoring.", + __FUNCTION__, psDevInfo->uiFBDevID); + gapsDevInfo[0]->sPVRJTable.pfnPVRSRVCmdComplete(hCmdCookie, IMG_TRUE); + } + + return IMG_TRUE; + } + + if(ui32DispcDataLength != sizeof(setup_dispc_data_t)) + { + printk(KERN_WARNING DRIVER_PREFIX + ": %s: Device %u: WARNING: Unexpected private data size, %u vs %u.", + __FUNCTION__, psDevInfo->uiFBDevID, ui32DispcDataLength, + sizeof(setup_dispc_data_t)); + gapsDevInfo[0]->sPVRJTable.pfnPVRSRVCmdComplete(hCmdCookie, IMG_TRUE); + return IMG_TRUE; + } + + if(DontWaitForVSync(psDevInfo)) + { + gapsDevInfo[0]->sPVRJTable.pfnPVRSRVCmdComplete(hCmdCookie, IMG_TRUE); + return IMG_TRUE; + } + + /* Maximum of 8 layer_infos. Meminfo array is dynamically sized */ + for(i = 0; i < ui32NumMemInfos && i < 8; i++) + { + IMG_CPU_PHYADDR phyAddr; + + psDevInfo->sPVRJTable.pfnPVRSRVDCMemInfoGetCpuPAddr(ppsMemInfos[i], 0, &phyAddr); + + psDispcData->layer_info[i].fb.addr[0] = phyAddr.uiAddr; + } + + dispc_gralloc_queue(psDispcData, ui32DispcDataLength, dispc_proxy_cmdcomplete, (void *)hCmdCookie); + + return IMG_TRUE; +} + +/* Command processing flip handler function. Called from services. */ +static IMG_BOOL ProcessFlip(IMG_HANDLE hCmdCookie, + IMG_UINT32 ui32DataSize, + IMG_VOID *pvData) +{ + DISPLAYCLASS_FLIP_COMMAND *psFlipCmd; + DC_SUNXI_DEVINFO *psDevInfo; + + /* Check parameters */ + if(!hCmdCookie || !pvData) + { + return IMG_FALSE; + } + + /* Validate data packet */ + psFlipCmd = (DISPLAYCLASS_FLIP_COMMAND*)pvData; + + if (psFlipCmd == IMG_NULL) + { + return IMG_FALSE; + } + + psDevInfo = (DC_SUNXI_DEVINFO*)psFlipCmd->hExtDevice; + + if(psFlipCmd->hExtBuffer) + { + return ProcessFlipV1(hCmdCookie, + psDevInfo, + psFlipCmd->hExtSwapChain, + psFlipCmd->hExtBuffer, + psFlipCmd->ui32SwapInterval); + } + else + { + DISPLAYCLASS_FLIP_COMMAND2 *psFlipCmd2; + psFlipCmd2 = (DISPLAYCLASS_FLIP_COMMAND2 *)pvData; + return ProcessFlipV2(hCmdCookie, + psDevInfo, + psFlipCmd2->ppsMemInfos, + psFlipCmd2->ui32NumMemInfos, + psFlipCmd2->pvPrivData, + psFlipCmd2->ui32PrivDataLength); + } +} + +static DC_SUNXI_ERROR DC_SUNXIInitFBDev(DC_SUNXI_DEVINFO *psDevInfo) +{ + struct fb_info *psLINFBInfo; + struct module *psLINFBOwner; + DC_SUNXI_FBINFO *psPVRFBInfo = &psDevInfo->sFBInfo; + DC_SUNXI_ERROR eError = DC_SUNXI_ERROR_GENERIC; + unsigned int uiFBDevID = psDevInfo->uiFBDevID; + + console_lock(); + + psLINFBInfo = registered_fb[uiFBDevID]; + if (psLINFBInfo == NULL) + { + eError = DC_SUNXI_ERROR_INVALID_DEVICE; + goto ErrorRelSem; + } + + psLINFBOwner = psLINFBInfo->fbops->owner; + if (!try_module_get(psLINFBOwner)) + { + printk(KERN_INFO DRIVER_PREFIX + ": %s: Device %u: Couldn't get framebuffer module\n", __FUNCTION__, uiFBDevID); + + goto ErrorRelSem; + } + + if (psLINFBInfo->fbops->fb_open != NULL) + { + int res; + + res = psLINFBInfo->fbops->fb_open(psLINFBInfo, 0); + if (res != 0) + { + printk(KERN_INFO DRIVER_PREFIX + " %s: Device %u: Couldn't open framebuffer(%d)\n", __FUNCTION__, uiFBDevID, res); + + goto ErrorModPut; + } + } + + psDevInfo->psLINFBInfo = psLINFBInfo; + + psPVRFBInfo->ulWidth = psLINFBInfo->var.xres; + psPVRFBInfo->ulHeight = psLINFBInfo->var.yres; + + if (psPVRFBInfo->ulWidth == 0 || psPVRFBInfo->ulHeight == 0) + { + eError = DC_SUNXI_ERROR_INVALID_DEVICE; + goto ErrorFBRel; + } + + psPVRFBInfo->ulFBSize = (psLINFBInfo->screen_size) != 0 ? + psLINFBInfo->screen_size : psLINFBInfo->fix.smem_len; + + /* + * Try and filter out invalid FB info structures (a problem + * seen on some systems). + */ + if (psPVRFBInfo->ulFBSize == 0 || psLINFBInfo->fix.line_length == 0) + { + eError = DC_SUNXI_ERROR_INVALID_DEVICE; + goto ErrorFBRel; + } + + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX + ": Device %u: Framebuffer size: %lu\n", + psDevInfo->uiFBDevID, psPVRFBInfo->ulFBSize)); + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX + ": Device %u: Framebuffer virtual width: %u\n", + psDevInfo->uiFBDevID, psLINFBInfo->var.xres_virtual)); + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX + ": Device %u: Framebuffer virtual height: %u\n", + psDevInfo->uiFBDevID, psLINFBInfo->var.yres_virtual)); + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX + ": Device %u: Framebuffer width: %lu\n", + psDevInfo->uiFBDevID, psPVRFBInfo->ulWidth)); + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX + ": Device %u: Framebuffer height: %lu\n", + psDevInfo->uiFBDevID, psPVRFBInfo->ulHeight)); + + /* System Surface */ + psPVRFBInfo->sSysAddr.uiAddr = psLINFBInfo->fix.smem_start; + psPVRFBInfo->sCPUVAddr = psLINFBInfo->screen_base; + + psPVRFBInfo->ulByteStride = psLINFBInfo->fix.line_length; + + printk(KERN_WARNING + "#####: Device %u: Framebuffer physical address: 0x%x\n", + psDevInfo->uiFBDevID, psPVRFBInfo->sSysAddr.uiAddr); + + if (psPVRFBInfo->sCPUVAddr != NULL) + { + DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX + ": Device %u: Framebuffer virtual address: %p\n", + psDevInfo->uiFBDevID, psPVRFBInfo->sCPUVAddr)); + } + + DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX + ": Device %u: Framebuffer stride: %lu\n", + psDevInfo->uiFBDevID, psPVRFBInfo->ulByteStride)); + + psPVRFBInfo->ulBufferSize = psPVRFBInfo->ulHeight * psPVRFBInfo->ulByteStride; + + { + unsigned long ulLCM; + ulLCM = LCM(psPVRFBInfo->ulByteStride, PAGE_SIZE); + + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX + ": Device %u: LCM of stride and page size: %lu\n", + psDevInfo->uiFBDevID, ulLCM)); + + /* Round the buffer size up to a multiple of the number of pages + * and the byte stride. + * This is used internally, to ensure buffers start on page + * boundaries, for the benefit of PVR Services. + */ + psPVRFBInfo->ulRoundedBufferSize = RoundUpToMultiple(psPVRFBInfo->ulBufferSize, ulLCM); + } + + if(psLINFBInfo->var.bits_per_pixel == 16) + { + if((psLINFBInfo->var.red.length == 5) && + (psLINFBInfo->var.green.length == 6) && + (psLINFBInfo->var.blue.length == 5) && + (psLINFBInfo->var.red.offset == 11) && + (psLINFBInfo->var.green.offset == 5) && + (psLINFBInfo->var.blue.offset == 0) && + (psLINFBInfo->var.red.msb_right == 0)) + { + psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_RGB565; + } + else + { + printk(KERN_INFO DRIVER_PREFIX ": %s: Device %u: Unknown FB format\n", __FUNCTION__, uiFBDevID); + } + } + else if(psLINFBInfo->var.bits_per_pixel == 32) + { + if((psLINFBInfo->var.red.length == 8) && + (psLINFBInfo->var.green.length == 8) && + (psLINFBInfo->var.blue.length == 8) && + (psLINFBInfo->var.red.offset == 16) && + (psLINFBInfo->var.green.offset == 8) && + (psLINFBInfo->var.blue.offset == 0) && + (psLINFBInfo->var.red.msb_right == 0)) + { + psPVRFBInfo->ePixelFormat = PVRSRV_PIXEL_FORMAT_ARGB8888; + } + else + { + printk(KERN_INFO DRIVER_PREFIX ": %s: Device %u: Unknown FB format\n", __FUNCTION__, uiFBDevID); + } + } + else + { + printk(KERN_INFO DRIVER_PREFIX ": %s: Device %u: Unknown FB format\n", __FUNCTION__, uiFBDevID); + } + + psDevInfo->sFBInfo.ulPhysicalWidthmm = + ((int)psLINFBInfo->var.width > 0) ? psLINFBInfo->var.width : 90; + + psDevInfo->sFBInfo.ulPhysicalHeightmm = + ((int)psLINFBInfo->var.height > 0) ? psLINFBInfo->var.height : 54; + + /* System Surface */ + psDevInfo->sFBInfo.sSysAddr.uiAddr = psPVRFBInfo->sSysAddr.uiAddr; + psDevInfo->sFBInfo.sCPUVAddr = psPVRFBInfo->sCPUVAddr; + + eError = DC_SUNXI_OK; + goto ErrorRelSem; + +ErrorFBRel: + if (psLINFBInfo->fbops->fb_release != NULL) + { + (void) psLINFBInfo->fbops->fb_release(psLINFBInfo, 0); + } +ErrorModPut: + module_put(psLINFBOwner); +ErrorRelSem: + console_unlock(); + + return eError; +} + +static void DC_SUNXIDeInitFBDev(DC_SUNXI_DEVINFO *psDevInfo) +{ + struct fb_info *psLINFBInfo = psDevInfo->psLINFBInfo; + struct module *psLINFBOwner; + + console_lock(); + + psLINFBOwner = psLINFBInfo->fbops->owner; + + if (psLINFBInfo->fbops->fb_release != NULL) + { + (void) psLINFBInfo->fbops->fb_release(psLINFBInfo, 0); + } + + module_put(psLINFBOwner); + + console_unlock(); +} + +static DC_SUNXI_DEVINFO *DC_SUNXIInitDev(unsigned uiFBDevID) +{ + PFN_CMD_PROC pfnCmdProcList[DC_SUNXI_COMMAND_COUNT]; + IMG_UINT32 aui32SyncCountList[DC_SUNXI_COMMAND_COUNT][2]; + DC_SUNXI_DEVINFO *psDevInfo = NULL; + + /* Allocate device info. structure */ + psDevInfo = (DC_SUNXI_DEVINFO *)kmalloc(sizeof(DC_SUNXI_DEVINFO), GFP_KERNEL); + + if(psDevInfo == NULL) + { + printk(KERN_ERR DRIVER_PREFIX + ": %s: Device %u: Couldn't allocate device information structure\n", __FUNCTION__, uiFBDevID); + + goto ErrorExit; + } + + /* Any fields not set will be zero */ + memset(psDevInfo, 0, sizeof(DC_SUNXI_DEVINFO)); + + psDevInfo->uiFBDevID = uiFBDevID; + + /* Get the kernel services function table */ + if(!(*gpfnGetPVRJTable)(&psDevInfo->sPVRJTable)) + { + goto ErrorFreeDevInfo; + } + + /* Save private fbdev information structure in the dev. info. */ + if(DC_SUNXIInitFBDev(psDevInfo) != DC_SUNXI_OK) + { + /* + * Leave it to DC_SUNXIInitFBDev to print an error message, if + * required. The function may have failed because + * there is no Linux framebuffer device corresponding + * to the device ID. + */ + goto ErrorIonClientDestroy; + } + + psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers = (IMG_UINT32)(psDevInfo->sFBInfo.ulFBSize / psDevInfo->sFBInfo.ulRoundedBufferSize); + if (psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers != 0) + { + psDevInfo->sDisplayInfo.ui32MaxSwapChains = 1; + psDevInfo->sDisplayInfo.ui32MaxSwapInterval = 1; + } + + psDevInfo->sDisplayInfo.ui32PhysicalWidthmm = psDevInfo->sFBInfo.ulPhysicalWidthmm; + psDevInfo->sDisplayInfo.ui32PhysicalHeightmm = psDevInfo->sFBInfo.ulPhysicalHeightmm; + + strncpy(psDevInfo->sDisplayInfo.szDisplayName, DISPLAY_DEVICE_NAME, MAX_DISPLAY_NAME_SIZE); + + psDevInfo->sDisplayFormat.pixelformat = psDevInfo->sFBInfo.ePixelFormat; + psDevInfo->sDisplayDim.ui32Width = (IMG_UINT32)psDevInfo->sFBInfo.ulWidth; + psDevInfo->sDisplayDim.ui32Height = (IMG_UINT32)psDevInfo->sFBInfo.ulHeight; + psDevInfo->sDisplayDim.ui32ByteStride = (IMG_UINT32)psDevInfo->sFBInfo.ulByteStride; + + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX + ": Device %u: Maximum number of swap chain buffers: %u\n", + psDevInfo->uiFBDevID, psDevInfo->sDisplayInfo.ui32MaxSwapChainBuffers)); + + /* Setup system buffer */ + psDevInfo->sSystemBuffer.sSysAddr = psDevInfo->sFBInfo.sSysAddr; + psDevInfo->sSystemBuffer.sCPUVAddr = psDevInfo->sFBInfo.sCPUVAddr; + psDevInfo->sSystemBuffer.psDevInfo = psDevInfo; + + DC_SUNXIInitBufferForSwap(&psDevInfo->sSystemBuffer); + + /* + * Setup the DC Jtable so SRVKM can call into this driver + */ + psDevInfo->sDCJTable.ui32TableSize = sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE); + psDevInfo->sDCJTable.pfnOpenDCDevice = OpenDCDevice; + psDevInfo->sDCJTable.pfnCloseDCDevice = CloseDCDevice; + psDevInfo->sDCJTable.pfnEnumDCFormats = EnumDCFormats; + psDevInfo->sDCJTable.pfnEnumDCDims = EnumDCDims; + psDevInfo->sDCJTable.pfnGetDCSystemBuffer = GetDCSystemBuffer; + psDevInfo->sDCJTable.pfnGetDCInfo = GetDCInfo; + psDevInfo->sDCJTable.pfnGetBufferAddr = GetDCBufferAddr; + psDevInfo->sDCJTable.pfnCreateDCSwapChain = CreateDCSwapChain; + psDevInfo->sDCJTable.pfnDestroyDCSwapChain = DestroyDCSwapChain; + psDevInfo->sDCJTable.pfnSetDCDstRect = SetDCDstRect; + psDevInfo->sDCJTable.pfnSetDCSrcRect = SetDCSrcRect; + psDevInfo->sDCJTable.pfnSetDCDstColourKey = SetDCDstColourKey; + psDevInfo->sDCJTable.pfnSetDCSrcColourKey = SetDCSrcColourKey; + psDevInfo->sDCJTable.pfnGetDCBuffers = GetDCBuffers; + psDevInfo->sDCJTable.pfnSwapToDCBuffer = SwapToDCBuffer; + psDevInfo->sDCJTable.pfnSetDCState = SetDCState; + + /* Register device with services and retrieve device index */ + if(psDevInfo->sPVRJTable.pfnPVRSRVRegisterDCDevice( + &psDevInfo->sDCJTable, + &psDevInfo->uiPVRDevID) != PVRSRV_OK) + { + printk(KERN_ERR DRIVER_PREFIX + ": %s: Device %u: PVR Services device registration failed\n", __FUNCTION__, uiFBDevID); + + goto ErrorDeInitFBDev; + } + + DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: PVR Device ID: %u\n", + psDevInfo->uiFBDevID, psDevInfo->uiPVRDevID)); + + /* Setup private command processing function table ... */ + pfnCmdProcList[DC_FLIP_COMMAND] = ProcessFlip; + + /* ... and associated sync count(s) */ + aui32SyncCountList[DC_FLIP_COMMAND][0] = 0; /* writes */ + aui32SyncCountList[DC_FLIP_COMMAND][1] = 10; /* reads */ + + if (psDevInfo->sPVRJTable.pfnPVRSRVRegisterCmdProcList(psDevInfo->uiPVRDevID, + &pfnCmdProcList[0], + aui32SyncCountList, + DC_SUNXI_COMMAND_COUNT) != PVRSRV_OK) + { + printk(KERN_ERR DRIVER_PREFIX + ": %s: Device %u: Couldn't register command processing functions with PVR Services\n", __FUNCTION__, uiFBDevID); + goto ErrorUnregisterDevice; + } + + mutex_init(&psDevInfo->sCreateSwapChainMutex); + + atomic_set(&psDevInfo->sBlankEvents, 0); + atomic_set(&psDevInfo->sFlushCommands, false); + + return psDevInfo; + +ErrorUnregisterDevice: + (void)psDevInfo->sPVRJTable.pfnPVRSRVRemoveDCDevice(psDevInfo->uiPVRDevID); +ErrorDeInitFBDev: + DC_SUNXIDeInitFBDev(psDevInfo); +ErrorIonClientDestroy: +ErrorFreeDevInfo: + kfree(psDevInfo); +ErrorExit: + return NULL; +} + +static DC_SUNXI_ERROR DC_SUNXIInit(void) +{ + unsigned int i, uiMaxFBDevIDPlusOne = DC_SUNXIMaxFBDevIDPlusOne(); + unsigned int uiDevicesFound = 0; + + gpfnGetPVRJTable = PVRGetDisplayClassJTable; + + /* + * We search for frame buffer devices backwards, as the last device + * registered with PVR Services will be the first device enumerated + * by PVR Services. + */ + for(i = uiMaxFBDevIDPlusOne; i-- != 0;) + { + DC_SUNXI_DEVINFO *psDevInfo = DC_SUNXIInitDev(i); + + if (psDevInfo != NULL) + { + /* Set the top-level anchor */ + DC_SUNXISetDevInfoPtr(psDevInfo->uiFBDevID, psDevInfo); + uiDevicesFound++; + } + } + + return (uiDevicesFound != 0) ? DC_SUNXI_OK : DC_SUNXI_ERROR_INIT_FAILURE; +} + +static bool DC_SUNXIDeInitDev(DC_SUNXI_DEVINFO *psDevInfo) +{ + PVRSRV_DC_DISP2SRV_KMJTABLE *psPVRJTable = &psDevInfo->sPVRJTable; + + if (psPVRJTable->pfnPVRSRVRemoveCmdProcList (psDevInfo->uiPVRDevID, DC_SUNXI_COMMAND_COUNT) != PVRSRV_OK) + { + printk(KERN_ERR DRIVER_PREFIX + ": %s: Device %u: PVR Device %u: Couldn't unregister command processing functions\n", __FUNCTION__, psDevInfo->uiFBDevID, psDevInfo->uiPVRDevID); + return false; + } + + if (psPVRJTable->pfnPVRSRVRemoveDCDevice(psDevInfo->uiPVRDevID) != PVRSRV_OK) + { + printk(KERN_ERR DRIVER_PREFIX + ": %s: Device %u: PVR Device %u: Couldn't remove device from PVR Services\n", __FUNCTION__, psDevInfo->uiFBDevID, psDevInfo->uiPVRDevID); + return false; + } + + mutex_destroy(&psDevInfo->sCreateSwapChainMutex); + + DC_SUNXIDeInitFBDev(psDevInfo); + + DC_SUNXISetDevInfoPtr(psDevInfo->uiFBDevID, NULL); + + /* De-allocate data structure */ + kfree(psDevInfo); + + return true; +} + +static DC_SUNXI_ERROR DC_SUNXIDeInit(void) +{ + unsigned int i, uiMaxFBDevIDPlusOne = DC_SUNXIMaxFBDevIDPlusOne(); + bool bError = false; + + for(i = 0; i < uiMaxFBDevIDPlusOne; i++) + { + DC_SUNXI_DEVINFO *psDevInfo = DC_SUNXIGetDevInfoPtr(i); + + if (psDevInfo != NULL) + { + bError |= !DC_SUNXIDeInitDev(psDevInfo); + } + } + + return (bError) ? DC_SUNXI_ERROR_INIT_FAILURE : DC_SUNXI_OK; +} + +#if defined(SUPPORT_DRI_DRM) +int PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Init)(struct drm_device unref__ *dev) +#else +static int __init DC_SUNXI_Init(void) +#endif +{ + if(DC_SUNXIInit() != DC_SUNXI_OK) + { + printk(KERN_ERR DRIVER_PREFIX ": %s: DC_SUNXIInit failed\n", __FUNCTION__); + return -ENODEV; + } + + return 0; +} + +#if defined(SUPPORT_DRI_DRM) +void PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Cleanup)(struct drm_device unref__ *dev) +#else +static void __exit DC_SUNXI_Cleanup(void) +#endif +{ + if(DC_SUNXIDeInit() != DC_SUNXI_OK) + { + printk(KERN_ERR DRIVER_PREFIX ": %s: DC_SUNXIDeInit failed\n", __FUNCTION__); + } +} + +#if !defined(SUPPORT_DRI_DRM) +late_initcall(DC_SUNXI_Init); +module_exit(DC_SUNXI_Cleanup); +#endif +/****************************************************************************** + * End of file (dc_sunxi_displayclass.c) + ******************************************************************************/ diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/Kbuild.mk b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/Kbuild.mk new file mode 100644 index 0000000..adee440 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/Kbuild.mk @@ -0,0 +1,86 @@ +########################################################################### ### +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### + +$(call must-be-defined,$(SUPPORT_DRI_DRM)) + +DRM_SOURCE_DIR := drivers/gpu/drm + +ccflags-y += \ + -Iinclude/drm \ + -I$(DRM_SOURCE_DIR) + +drm-y += \ + services4/3rdparty/linux_drm/pvr_drm_stubs.o \ + external/$(DRM_SOURCE_DIR)/drm_auth.o \ + external/$(DRM_SOURCE_DIR)/drm_bufs.o \ + external/$(DRM_SOURCE_DIR)/drm_cache.o \ + external/$(DRM_SOURCE_DIR)/drm_context.o \ + external/$(DRM_SOURCE_DIR)/drm_dma.o \ + external/$(DRM_SOURCE_DIR)/drm_drawable.o \ + external/$(DRM_SOURCE_DIR)/drm_drv.o \ + external/$(DRM_SOURCE_DIR)/drm_fops.o \ + external/$(DRM_SOURCE_DIR)/drm_gem.o \ + external/$(DRM_SOURCE_DIR)/drm_ioctl.o \ + external/$(DRM_SOURCE_DIR)/drm_irq.o \ + external/$(DRM_SOURCE_DIR)/drm_lock.o \ + external/$(DRM_SOURCE_DIR)/drm_memory.o \ + external/$(DRM_SOURCE_DIR)/drm_proc.o \ + external/$(DRM_SOURCE_DIR)/drm_stub.o \ + external/$(DRM_SOURCE_DIR)/drm_vm.o \ + external/$(DRM_SOURCE_DIR)/drm_agpsupport.o \ + external/$(DRM_SOURCE_DIR)/drm_scatter.o \ + external/$(DRM_SOURCE_DIR)/ati_pcigart.o \ + external/$(DRM_SOURCE_DIR)/drm_pci.o \ + external/$(DRM_SOURCE_DIR)/drm_sysfs.o \ + external/$(DRM_SOURCE_DIR)/drm_hashtab.o \ + external/$(DRM_SOURCE_DIR)/drm_sman.o \ + external/$(DRM_SOURCE_DIR)/drm_mm.o \ + external/$(DRM_SOURCE_DIR)/drm_crtc.o \ + external/$(DRM_SOURCE_DIR)/drm_modes.o \ + external/$(DRM_SOURCE_DIR)/drm_edid.o \ + external/$(DRM_SOURCE_DIR)/drm_info.o \ + external/$(DRM_SOURCE_DIR)/drm_debugfs.o \ + external/$(DRM_SOURCE_DIR)/drm_encoder_slave.o + +# extra flags for some files +CFLAGS_pvr_drm_stubs.o := -DCONFIG_PCI +CFLAGS_drm_drv.o := -DCONFIG_PCI +CFLAGS_drm_stub.o := -DCONFIG_PCI +CFLAGS_ati_pcigart.o := -DCONFIG_PCI diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/Linux.mk b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/Linux.mk new file mode 100644 index 0000000..80733c5 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/Linux.mk @@ -0,0 +1,45 @@ +########################################################################### ### +#@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +#@License Dual MIT/GPLv2 +# +# The contents of this file are subject to the MIT license as set out below. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Alternatively, the contents of this file may be used under the terms of +# the GNU General Public License Version 2 ("GPL") in which case the provisions +# of GPL are applicable instead of those above. +# +# If you wish to allow use of your version of this file only under the terms of +# GPL, and not to allow others to use your version of this file under the terms +# of the MIT license, indicate your decision by deleting the provisions above +# and replace them with the notice and other provisions required by GPL as set +# out in the file called "GPL-COPYING" included in this distribution. If you do +# not delete the provisions above, a recipient may use your version of this file +# under the terms of either the MIT license or GPL. +# +# This License is also included in this distribution in the file called +# "MIT-COPYING". +# +# EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +# PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +# PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### ########################################################################### + +modules := linux_drm + +linux_drm_type := kernel_module +linux_drm_target := drm.ko +linux_drm_makefile := $(THIS_DIR)/Kbuild.mk diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/pvr_drm_mod.h b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/pvr_drm_mod.h new file mode 100644 index 0000000..096f11f --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/pvr_drm_mod.h @@ -0,0 +1,49 @@ +/*************************************************************************/ /*! +@Title DRM stub functions +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#ifndef __PVR_DRM_MOD_H__ +#define __PVR_DRM_MOD_H__ + +int drm_pvr_dev_add(void); + +void drm_pvr_dev_remove(void); + +#endif /* __PVR_DRM_MOD_H__ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/pvr_drm_stubs.c b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/pvr_drm_stubs.c new file mode 100644 index 0000000..aad9263 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/3rdparty/linux_drm/pvr_drm_stubs.c @@ -0,0 +1,220 @@ +/*************************************************************************/ /*! +@Title DRM stub functions +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +/* + * Emulate enough of the PCI layer to allow the Linux DRM module to be used + * with a non-PCI device. + * Only one device is supported at present. + */ + +#include <linux/version.h> +#include <linux/kernel.h> +#include <linux/pci.h> +#include <asm/system.h> + +#include "pvr_drm_mod.h" + +#define DRV_MSG_PREFIX_STR "pvr drm: " + +#define SGX_VENDOR_ID 1 +#define SGX_DEVICE_ID 1 +#define SGX_SUB_VENDOR_ID 1 +#define SGX_SUB_DEVICE_ID 1 + +#if defined(DEBUG) +#define DEBUG_PRINTK(format, args...) printk(format, ## args) +#else +#define DEBUG_PRINTK(format, args...) +#endif + +#define CLEAR_STRUCT(x) memset(&(x), 0, sizeof(x)) + +/* + * Don't specify any initialisers for pvr_pci_bus and pvr_pci_dev, as they + * will be cleared to zero on unregister. This has to be done for + * pvr_pci_dev to prevent a warning from the kernel if the device is + * re-registered without unloading the DRM module. + */ +static struct pci_bus pvr_pci_bus; +static struct pci_dev pvr_pci_dev; + +static bool bDeviceIsRegistered; + +static void +release_device(struct device *dev) +{ +} + +int +drm_pvr_dev_add(void) +{ + int ret; + + DEBUG_PRINTK(KERN_INFO DRV_MSG_PREFIX_STR "%s\n", __FUNCTION__); + + if (bDeviceIsRegistered) + { + DEBUG_PRINTK(KERN_WARNING DRV_MSG_PREFIX_STR "%s: Device already registered\n", __FUNCTION__); + return 0; + } + + /* Set the device ID */ + pvr_pci_dev.vendor = SGX_VENDOR_ID; + pvr_pci_dev.device = SGX_DEVICE_ID; + pvr_pci_dev.subsystem_vendor = SGX_SUB_VENDOR_ID; + pvr_pci_dev.subsystem_device = SGX_SUB_DEVICE_ID; + + /* drm_set_busid needs the bus number */ + pvr_pci_dev.bus = &pvr_pci_bus; + + dev_set_name(&pvr_pci_dev.dev, "%s", "SGX"); + pvr_pci_dev.dev.release = release_device; + + ret = device_register(&pvr_pci_dev.dev); + if (ret != 0) + { + printk(KERN_ERR DRV_MSG_PREFIX_STR "%s: device_register failed (%d)\n", __FUNCTION__, ret); + } + + bDeviceIsRegistered = true; + + return ret; +} +EXPORT_SYMBOL(drm_pvr_dev_add); + +void +drm_pvr_dev_remove(void) +{ + DEBUG_PRINTK(KERN_INFO DRV_MSG_PREFIX_STR "%s\n", __FUNCTION__); + + if (bDeviceIsRegistered) + { + DEBUG_PRINTK(KERN_INFO DRV_MSG_PREFIX_STR "%s: Unregistering device\n", __FUNCTION__); + + device_unregister(&pvr_pci_dev.dev); + bDeviceIsRegistered = false; + + /* Prevent kernel warnings on re-register */ + CLEAR_STRUCT(pvr_pci_dev); + CLEAR_STRUCT(pvr_pci_bus); + } + else + { + DEBUG_PRINTK(KERN_WARNING DRV_MSG_PREFIX_STR "%s: Device not registered\n", __FUNCTION__); + } +} +EXPORT_SYMBOL(drm_pvr_dev_remove); + +void +pci_disable_device(struct pci_dev *dev) +{ +} + +struct pci_dev * +pci_dev_get(struct pci_dev *dev) +{ + return dev; +} + +void +pci_set_master(struct pci_dev *dev) +{ +} + +#define PCI_ID_COMP(field, value) (((value) == PCI_ANY_ID) || \ + ((field) == (value))) + +struct pci_dev * +pci_get_subsys(unsigned int vendor, unsigned int device, + unsigned int ss_vendor, unsigned int ss_device, struct pci_dev *from) +{ + if (from == NULL && + PCI_ID_COMP(pvr_pci_dev.vendor, vendor) && + PCI_ID_COMP(pvr_pci_dev.device, device) && + PCI_ID_COMP(pvr_pci_dev.subsystem_vendor, ss_vendor) && + PCI_ID_COMP(pvr_pci_dev.subsystem_device, ss_device)) + { + DEBUG_PRINTK(KERN_INFO DRV_MSG_PREFIX_STR "%s: Found %x %x %x %x\n", __FUNCTION__, vendor, device, ss_vendor, ss_device); + + return &pvr_pci_dev; + } + + if (from == NULL) + { + DEBUG_PRINTK(KERN_INFO DRV_MSG_PREFIX_STR "%s: Couldn't find %x %x %x %x\n", __FUNCTION__, vendor, device, ss_vendor, ss_device); + } + + return NULL; +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)) +int +pci_set_dma_mask(struct pci_dev *dev, u64 mask) +{ + return 0; +} +#endif + +void +pci_unregister_driver(struct pci_driver *drv) +{ +} + +int +__pci_register_driver(struct pci_driver *drv, struct module *owner, + const char *mod_name) +{ + return 0; +} + +int +pci_enable_device(struct pci_dev *dev) +{ + return 0; +} + +void +__bad_cmpxchg(volatile void *ptr, int size) +{ + printk(KERN_ERR DRV_MSG_PREFIX_STR "%s: ptr %p size %u\n", + __FUNCTION__, ptr, size); +} + diff --git a/jacinto6/sgx_src/eurasia_km/services4/include/env/linux/pvr_drm_shared.h b/jacinto6/sgx_src/eurasia_km/services4/include/env/linux/pvr_drm_shared.h new file mode 100644 index 0000000..4b84f6b --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/include/env/linux/pvr_drm_shared.h @@ -0,0 +1,76 @@ +/*************************************************************************/ /*! +@Title PowerVR drm driver shared definitions +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ +#if !defined(__PVR_DRM_SHARED_H__) +#define __PVR_DRM_SHARED_H__ + +#if defined(SUPPORT_DRI_DRM) + +typedef struct drm_pvr_unpriv_cmd_tag +{ + uint32_t cmd; + uint32_t res; +} drm_pvr_unpriv_cmd; + +/* DRM command numbers, relative to DRM_COMMAND_BASE */ +#if defined(SUPPORT_DRI_DRM_EXT) +#define PVR_DRM_SRVKM_CMD DRM_PVR_RESERVED1 /* Used for PVR Services ioctls */ +#define PVR_DRM_DISP_CMD DRM_PVR_RESERVED2 /* Reserved for display class driver */ +#define PVR_DRM_BC_CMD DRM_PVR_RESERVED3 /* Reserved for buffer class driver */ +#define PVR_DRM_IS_MASTER_CMD DRM_PVR_RESERVED4 /* Are we the DRM master? */ +#define PVR_DRM_UNPRIV_CMD DRM_PVR_RESERVED5 /* PVR driver unprivileged ioctls */ +#define PVR_DRM_DBGDRV_CMD DRM_PVR_RESERVED6 /* Debug driver (PDUMP) ioctls */ +#else /* defined(SUPPORT_DRI_DRM_EXT) */ +#define PVR_DRM_SRVKM_CMD 0 /* Used for PVR Services ioctls */ +#define PVR_DRM_DISP_CMD 1 /* Reserved for display class driver */ +#define PVR_DRM_BC_CMD 2 /* Reserved for buffer class driver */ +#define PVR_DRM_IS_MASTER_CMD 3 /* Are we the DRM master? */ +#define PVR_DRM_UNPRIV_CMD 4 /* PVR driver unprivileged ioctls */ +#define PVR_DRM_DBGDRV_CMD 5 /* Debug driver (PDUMP) ioctls */ +#endif /* defined(SUPPORT_DRI_DRM_EXT) */ + +/* Subcommands of PVR_DRM_UNPRIV_CMD */ +#define PVR_DRM_UNPRIV_INIT_SUCCESFUL 0 /* PVR Services init succesful */ + +#endif + +#endif /* defined(__PVR_DRM_SHARED_H__) */ + + diff --git a/jacinto6/sgx_src/eurasia_km/services4/include/kerneldisplay.h b/jacinto6/sgx_src/eurasia_km/services4/include/kerneldisplay.h index 2efd7b3..048cb43 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/include/kerneldisplay.h +++ b/jacinto6/sgx_src/eurasia_km/services4/include/kerneldisplay.h @@ -44,6 +44,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #if !defined (__KERNELDISPLAY_H__) #define __KERNELDISPLAY_H__ +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) + #if defined (__cplusplus) extern "C" { #endif @@ -107,7 +109,6 @@ typedef struct PVRSRV_DC_SRV2DISP_KMJTABLE_TAG PFN_GET_DC_BUFFERS pfnGetDCBuffers; PFN_SWAP_TO_DC_BUFFER pfnSwapToDCBuffer; PFN_SET_DC_STATE pfnSetDCState; - PFN_QUERY_SWAP_COMMAND_ID pfnQuerySwapCommandID; } PVRSRV_DC_SRV2DISP_KMJTABLE; @@ -134,9 +135,6 @@ typedef PVRSRV_ERROR (*PFN_DC_MEMINFO_GET_CPU_VADDR)(PDC_MEM_INFO, IMG_CPU_VIRTA typedef PVRSRV_ERROR (*PFN_DC_MEMINFO_GET_CPU_PADDR)(PDC_MEM_INFO, IMG_SIZE_T uByteOffset, IMG_CPU_PHYADDR *pPAddr); typedef PVRSRV_ERROR (*PFN_DC_MEMINFO_GET_BYTE_SIZE)(PDC_MEM_INFO, IMG_SIZE_T *uByteSize); typedef IMG_BOOL (*PFN_DC_MEMINFO_IS_PHYS_CONTIG)(PDC_MEM_INFO); -typedef PVRSRV_ERROR (*PFN_DC_GETBVHANDLE)(PDC_MEM_INFO, IMG_VOID **handle); -typedef IMG_INT32 (*PFN_DC_MEMINFO_GET_MULTI_PLANE_CPU_PADDRS)(PDC_MEM_INFO, IMG_SIZE_T* puByteOffsets, - IMG_CPU_PHYADDR *pPAddrs, IMG_UINT32* pui32NumAddrOffsets); /* Function table for DISPLAY->SRVKM @@ -152,13 +150,10 @@ typedef struct PVRSRV_DC_DISP2SRV_KMJTABLE_TAG PFN_DC_CMD_COMPLETE pfnPVRSRVCmdComplete; PFN_DC_REGISTER_SYS_ISR pfnPVRSRVRegisterSystemISRHandler; PFN_DC_REGISTER_POWER pfnPVRSRVRegisterPowerDevice; - PFN_DC_CMD_COMPLETE pfnPVRSRVFreeCmdCompletePacket; PFN_DC_MEMINFO_GET_CPU_VADDR pfnPVRSRVDCMemInfoGetCpuVAddr; PFN_DC_MEMINFO_GET_CPU_PADDR pfnPVRSRVDCMemInfoGetCpuPAddr; PFN_DC_MEMINFO_GET_BYTE_SIZE pfnPVRSRVDCMemInfoGetByteSize; PFN_DC_MEMINFO_IS_PHYS_CONTIG pfnPVRSRVDCMemInfoIsPhysContig; - PFN_DC_GETBVHANDLE pfnPVRSRVDCMemInfoGetBvHandle; - PFN_DC_MEMINFO_GET_MULTI_PLANE_CPU_PADDRS pfnPVRSRVDCMemInfoGetCpuMultiPlanePAddr; } PVRSRV_DC_DISP2SRV_KMJTABLE, *PPVRSRV_DC_DISP2SRV_KMJTABLE; @@ -223,7 +218,6 @@ typedef struct DISPLAYCLASS_FLIP_COMMAND2_TAG /* States used in PFN_SET_DC_STATE */ #define DC_STATE_NO_FLUSH_COMMANDS 0 #define DC_STATE_FLUSH_COMMANDS 1 -#define DC_STATE_FORCE_SWAP_TO_SYSTEM 2 /* function to retrieve kernel services function table from kernel services */ typedef IMG_BOOL (*PFN_DC_GET_PVRJTABLE)(PPVRSRV_DC_DISP2SRV_KMJTABLE); @@ -236,6 +230,8 @@ IMG_IMPORT IMG_BOOL PVRGetDisplayClassJTable(PVRSRV_DC_DISP2SRV_KMJTABLE *psJTab } #endif +#endif /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ + #endif/* #if !defined (__KERNELDISPLAY_H__) */ /****************************************************************************** diff --git a/jacinto6/sgx_src/eurasia_km/services4/include/pvr_bridge.h b/jacinto6/sgx_src/eurasia_km/services4/include/pvr_bridge.h index 71813c4..cf84f76 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/include/pvr_bridge.h +++ b/jacinto6/sgx_src/eurasia_km/services4/include/pvr_bridge.h @@ -84,9 +84,14 @@ extern "C" { /* * Note *REMEMBER* to update PVRSRV_BRIDGE_LAST_CMD (below) if you add any new * bridge commands! + * The command number of PVRSRV_BRIDGE_UM_KM_COMPAT_CHECK needs to be maintained as 0 across previous ddks, for compatibility check command to execute successfully */ -#define PVRSRV_BRIDGE_CORE_CMD_FIRST 0UL +#define PVRSRV_BRIDGE_UMKM_CMD_FIRST 0UL +#define PVRSRV_BRIDGE_UM_KM_COMPAT_CHECK PVRSRV_IOWR(0) +#define PVRSRV_BRIDGE_UMKM_CMD_LAST (0) + +#define PVRSRV_BRIDGE_CORE_CMD_FIRST (PVRSRV_BRIDGE_UMKM_CMD_LAST + 1) #define PVRSRV_BRIDGE_ENUM_DEVICES PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+0) /*!< enumerate device bridge index */ #define PVRSRV_BRIDGE_ACQUIRE_DEVICEINFO PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+1) /*!< acquire device data bridge index */ #define PVRSRV_BRIDGE_RELEASE_DEVICEINFO PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+2) /*!< release device data bridge index */ @@ -109,27 +114,19 @@ extern "C" { #define PVRSRV_BRIDGE_UNMAP_EXT_MEMORY PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+19) #define PVRSRV_BRIDGE_MAP_DEV_MEMORY PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+20) #define PVRSRV_BRIDGE_UNMAP_DEV_MEMORY PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+21) -#define PVRSRV_BRIDGE_MAP_DEVICECLASS_MEMORY PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+22) -#define PVRSRV_BRIDGE_UNMAP_DEVICECLASS_MEMORY PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+23) -#define PVRSRV_BRIDGE_MAP_MEM_INFO_TO_USER PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+24) -#define PVRSRV_BRIDGE_UNMAP_MEM_INFO_FROM_USER PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+25) -#define PVRSRV_BRIDGE_EXPORT_DEVICEMEM PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+26) -#define PVRSRV_BRIDGE_RELEASE_MMAP_DATA PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+27) -#define PVRSRV_BRIDGE_CHG_DEV_MEM_ATTRIBS PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+28) -#define PVRSRV_BRIDGE_MAP_DEV_MEMORY_2 PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+29) -#define PVRSRV_BRIDGE_EXPORT_DEVICEMEM_2 PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+30) - -#define PVRSRV_BRIDGE_MULTI_MANAGE_DEV_MEM PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+31) -#define PVRSRV_BRIDGE_CORE_CMD_RESERVED_1 PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+32) -#define PVRSRV_BRIDGE_CORE_CMD_RESERVED_2 PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+33) -#define PVRSRV_BRIDGE_CORE_CMD_RESERVED_3 PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+34) - +#define PVRSRV_BRIDGE_MAP_MEM_INFO_TO_USER PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+22) +#define PVRSRV_BRIDGE_UNMAP_MEM_INFO_FROM_USER PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+23) +#define PVRSRV_BRIDGE_EXPORT_DEVICEMEM PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+24) +#define PVRSRV_BRIDGE_RELEASE_MMAP_DATA PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+25) +#define PVRSRV_BRIDGE_CHG_DEV_MEM_ATTRIBS PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+26) +#define PVRSRV_BRIDGE_MAP_DEV_MEMORY_2 PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+27) +#define PVRSRV_BRIDGE_EXPORT_DEVICEMEM_2 PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+28) #if defined (SUPPORT_ION) -#define PVRSRV_BRIDGE_MAP_ION_HANDLE PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+35) -#define PVRSRV_BRIDGE_UNMAP_ION_HANDLE PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+36) -#define PVRSRV_BRIDGE_CORE_CMD_LAST (PVRSRV_BRIDGE_CORE_CMD_FIRST+37) +#define PVRSRV_BRIDGE_MAP_ION_HANDLE PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+29) +#define PVRSRV_BRIDGE_UNMAP_ION_HANDLE PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST+30) +#define PVRSRV_BRIDGE_CORE_CMD_LAST (PVRSRV_BRIDGE_CORE_CMD_FIRST+30) #else -#define PVRSRV_BRIDGE_CORE_CMD_LAST (PVRSRV_BRIDGE_CORE_CMD_FIRST+34) +#define PVRSRV_BRIDGE_CORE_CMD_LAST (PVRSRV_BRIDGE_CORE_CMD_FIRST+28) #endif /* SIM */ #define PVRSRV_BRIDGE_SIM_CMD_FIRST (PVRSRV_BRIDGE_CORE_CMD_LAST+1) @@ -202,8 +199,10 @@ extern "C" { /* device class enum */ #define PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST (PVRSRV_BRIDGE_OEM_CMD_LAST+1) -#define PVRSRV_BRIDGE_ENUM_CLASS PVRSRV_IOWR(PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST+0) -#define PVRSRV_BRIDGE_DEVCLASS_CMD_LAST (PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST+0) +#define PVRSRV_BRIDGE_MAP_DEVICECLASS_MEMORY PVRSRV_IOWR(PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST+0) +#define PVRSRV_BRIDGE_UNMAP_DEVICECLASS_MEMORY PVRSRV_IOWR(PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST+1) +#define PVRSRV_BRIDGE_ENUM_CLASS PVRSRV_IOWR(PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST+2) +#define PVRSRV_BRIDGE_DEVCLASS_CMD_LAST (PVRSRV_BRIDGE_DEVCLASS_CMD_FIRST+2) /* display class API */ #define PVRSRV_BRIDGE_DISPCLASS_CMD_FIRST (PVRSRV_BRIDGE_DEVCLASS_CMD_LAST+1) @@ -310,11 +309,7 @@ typedef struct PVRSRV_BRIDGE_PACKAGE_TAG IMG_VOID *pvParamOut; /*!< output data buffer */ IMG_UINT32 ui32OutBufferSize; /*!< size of output data buffer */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelServices; /*!< kernel servcies handle */ -#else IMG_HANDLE hKernelServices; /*!< kernel servcies handle */ -#endif }PVRSRV_BRIDGE_PACKAGE; @@ -360,11 +355,7 @@ typedef struct PVRSRV_BRIDGE_IN_ENUMCLASS_TAG typedef struct PVRSRV_BRIDGE_IN_CLOSE_DISPCLASS_DEVICE_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif } PVRSRV_BRIDGE_IN_CLOSE_DISPCLASS_DEVICE; @@ -374,11 +365,7 @@ typedef struct PVRSRV_BRIDGE_IN_CLOSE_DISPCLASS_DEVICE_TAG typedef struct PVRSRV_BRIDGE_IN_ENUM_DISPCLASS_FORMATS_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif } PVRSRV_BRIDGE_IN_ENUM_DISPCLASS_FORMATS; @@ -388,11 +375,7 @@ typedef struct PVRSRV_BRIDGE_IN_ENUM_DISPCLASS_FORMATS_TAG typedef struct PVRSRV_BRIDGE_IN_GET_DISPCLASS_SYSBUFFER_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif } PVRSRV_BRIDGE_IN_GET_DISPCLASS_SYSBUFFER; @@ -402,11 +385,7 @@ typedef struct PVRSRV_BRIDGE_IN_GET_DISPCLASS_SYSBUFFER_TAG typedef struct PVRSRV_BRIDGE_IN_GET_DISPCLASS_INFO_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif } PVRSRV_BRIDGE_IN_GET_DISPCLASS_INFO; @@ -416,11 +395,7 @@ typedef struct PVRSRV_BRIDGE_IN_GET_DISPCLASS_INFO_TAG typedef struct PVRSRV_BRIDGE_IN_CLOSE_BUFFERCLASS_DEVICE_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif } PVRSRV_BRIDGE_IN_CLOSE_BUFFERCLASS_DEVICE; @@ -430,11 +405,7 @@ typedef struct PVRSRV_BRIDGE_IN_CLOSE_BUFFERCLASS_DEVICE_TAG typedef struct PVRSRV_BRIDGE_IN_GET_BUFFERCLASS_INFO_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif } PVRSRV_BRIDGE_IN_GET_BUFFERCLASS_INFO; @@ -444,11 +415,7 @@ typedef struct PVRSRV_BRIDGE_IN_GET_BUFFERCLASS_INFO_TAG typedef struct PVRSRV_BRIDGE_IN_RELEASE_DEVICEINFO_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif } PVRSRV_BRIDGE_IN_RELEASE_DEVICEINFO; @@ -471,13 +438,8 @@ typedef struct PVRSRV_BRIDGE_IN_FREE_CLASSDEVICEINFO_TAG typedef struct PVRSRV_BRIDGE_IN_GET_DEVMEM_HEAPINFO_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hDevMemContext; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hDevMemContext; -#endif }PVRSRV_BRIDGE_IN_GET_DEVMEM_HEAPINFO; @@ -488,11 +450,7 @@ typedef struct PVRSRV_BRIDGE_IN_GET_DEVMEM_HEAPINFO_TAG typedef struct PVRSRV_BRIDGE_IN_CREATE_DEVMEMCONTEXT_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif }PVRSRV_BRIDGE_IN_CREATE_DEVMEMCONTEXT; @@ -503,13 +461,8 @@ typedef struct PVRSRV_BRIDGE_IN_CREATE_DEVMEMCONTEXT_TAG typedef struct PVRSRV_BRIDGE_IN_DESTROY_DEVMEMCONTEXT_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hDevMemContext; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hDevMemContext; -#endif }PVRSRV_BRIDGE_IN_DESTROY_DEVMEMCONTEXT; @@ -520,16 +473,11 @@ typedef struct PVRSRV_BRIDGE_IN_DESTROY_DEVMEMCONTEXT_TAG typedef struct PVRSRV_BRIDGE_IN_ALLOCDEVICEMEM_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hDevMemHeap; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hDevMemHeap; -#endif IMG_UINT32 ui32Attribs; - IMG_SIZE_T ui32Size; - IMG_SIZE_T ui32Alignment; + IMG_SIZE_T uSize; + IMG_SIZE_T uAlignment; IMG_PVOID pvPrivData; IMG_UINT32 ui32PrivDataLength; @@ -545,11 +493,7 @@ typedef struct PVRSRV_BRIDGE_IN_ALLOCDEVICEMEM_TAG typedef struct PVRSRV_BRIDGE_IN_MAPMEMINFOTOUSER_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif }PVRSRV_BRIDGE_IN_MAPMEMINFOTOUSER; @@ -559,17 +503,9 @@ typedef struct PVRSRV_BRIDGE_IN_MAPMEMINFOTOUSER_TAG typedef struct PVRSRV_BRIDGE_IN_UNMAPMEMINFOFROMUSER_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif IMG_PVOID pvLinAddr; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hMappingInfo; -#else IMG_HANDLE hMappingInfo; -#endif }PVRSRV_BRIDGE_IN_UNMAPMEMINFOFROMUSER; @@ -579,13 +515,8 @@ typedef struct PVRSRV_BRIDGE_IN_UNMAPMEMINFOFROMUSER_TAG typedef struct PVRSRV_BRIDGE_IN_FREEDEVICEMEM_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hKernelMemInfo; -#else IMG_HANDLE hDevCookie; PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif PVRSRV_CLIENT_MEM_INFO sClientMemInfo; }PVRSRV_BRIDGE_IN_FREEDEVICEMEM; @@ -596,32 +527,27 @@ typedef struct PVRSRV_BRIDGE_IN_FREEDEVICEMEM_TAG typedef struct PVRSRV_BRIDGE_IN_EXPORTDEVICEMEM_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hKernelMemInfo; -#else IMG_HANDLE hDevCookie; PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif }PVRSRV_BRIDGE_IN_EXPORTDEVICEMEM; /****************************************************************************** * 'bridge in' map ion handle *****************************************************************************/ +#define ION_IMPORT_MAX_FDS 3 +#define ION_IMPORT_MAX_CHUNK_COUNT 3 typedef struct _PVRSRV_BRIDGE_IN_MAP_ION_HANDLE_ { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ - IMG_HANDLE handle; + IMG_UINT32 ui32NumFDs; + IMG_INT32 ai32BufferFDs[ION_IMPORT_MAX_FDS]; IMG_UINT32 ui32Attribs; - IMG_SIZE_T ui32Size; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hDevMemContext; -#else + IMG_UINT32 ui32ChunkCount; + IMG_SIZE_T auiOffset[ION_IMPORT_MAX_CHUNK_COUNT]; + IMG_SIZE_T auiSize[ION_IMPORT_MAX_CHUNK_COUNT]; IMG_HANDLE hDevCookie; - IMG_HANDLE hDevMemContext; -#endif + IMG_HANDLE hDevMemHeap; } PVRSRV_BRIDGE_IN_MAP_ION_HANDLE; /****************************************************************************** @@ -630,11 +556,7 @@ typedef struct _PVRSRV_BRIDGE_IN_MAP_ION_HANDLE_ typedef struct PVRSRV_BRIDGE_IN_UNMAP_ION_HANDLE_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif }PVRSRV_BRIDGE_IN_UNMAP_ION_HANDLE; /****************************************************************************** @@ -653,12 +575,8 @@ typedef struct PVRSRV_BRIDGE_IN_GETFREEDEVICEMEM_TAG typedef struct PVRSRV_BRIDGE_IN_CREATECOMMANDQUEUE_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif - IMG_SIZE_T ui32QueueSize; + IMG_SIZE_T uQueueSize; }PVRSRV_BRIDGE_IN_CREATECOMMANDQUEUE; @@ -669,11 +587,7 @@ typedef struct PVRSRV_BRIDGE_IN_CREATECOMMANDQUEUE_TAG typedef struct PVRSRV_BRIDGE_IN_DESTROYCOMMANDQUEUE_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif PVRSRV_QUEUE_INFO *psQueueInfo; }PVRSRV_BRIDGE_IN_DESTROYCOMMANDQUEUE; @@ -685,11 +599,7 @@ typedef struct PVRSRV_BRIDGE_IN_DESTROYCOMMANDQUEUE_TAG typedef struct PVRSRV_BRIDGE_IN_MHANDLE_TO_MMAP_DATA_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hMHandle; /* Handle associated with the memory that needs to be mapped */ -#else IMG_HANDLE hMHandle; /* Handle associated with the memory that needs to be mapped */ -#endif } PVRSRV_BRIDGE_IN_MHANDLE_TO_MMAP_DATA; @@ -699,11 +609,7 @@ typedef struct PVRSRV_BRIDGE_IN_MHANDLE_TO_MMAP_DATA_TAG typedef struct PVRSRV_BRIDGE_IN_RELEASE_MMAP_DATA_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hMHandle; /* Handle associated with the memory that needs to be mapped */ -#else IMG_HANDLE hMHandle; /* Handle associated with the memory that needs to be mapped */ -#endif } PVRSRV_BRIDGE_IN_RELEASE_MMAP_DATA; @@ -713,14 +619,10 @@ typedef struct PVRSRV_BRIDGE_IN_RELEASE_MMAP_DATA_TAG typedef struct PVRSRV_BRIDGE_IN_RESERVE_DEV_VIRTMEM_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemHeap; -#else IMG_HANDLE hDevMemHeap; -#endif IMG_DEV_VIRTADDR *psDevVAddr; - IMG_SIZE_T ui32Size; - IMG_SIZE_T ui32Alignment; + IMG_SIZE_T uSize; + IMG_SIZE_T uAlignment; }PVRSRV_BRIDGE_IN_RESERVE_DEV_VIRTMEM; @@ -730,11 +632,7 @@ typedef struct PVRSRV_BRIDGE_IN_RESERVE_DEV_VIRTMEM_TAG typedef struct PVRSRV_BRIDGE_OUT_CONNECT_SERVICES_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelServices; -#else IMG_HANDLE hKernelServices; -#endif }PVRSRV_BRIDGE_OUT_CONNECT_SERVICES; /****************************************************************************** @@ -743,13 +641,8 @@ typedef struct PVRSRV_BRIDGE_OUT_CONNECT_SERVICES_TAG typedef struct PVRSRV_BRIDGE_OUT_RESERVE_DEV_VIRTMEM_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; - IMG_SID hKernelSyncInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo; -#endif PVRSRV_CLIENT_MEM_INFO sClientMemInfo; PVRSRV_CLIENT_SYNC_INFO sClientSyncInfo; @@ -762,11 +655,7 @@ typedef struct PVRSRV_BRIDGE_OUT_RESERVE_DEV_VIRTMEM_TAG typedef struct PVRSRV_BRIDGE_IN_FREE_DEV_VIRTMEM_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif PVRSRV_CLIENT_MEM_INFO sClientMemInfo; PVRSRV_CLIENT_SYNC_INFO sClientSyncInfo; @@ -779,13 +668,8 @@ typedef struct PVRSRV_BRIDGE_IN_FREE_DEV_VIRTMEM_TAG typedef struct PVRSRV_BRIDGE_IN_MAP_DEV_MEMORY_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; - IMG_SID hDstDevMemHeap; -#else IMG_HANDLE hKernelMemInfo; IMG_HANDLE hDstDevMemHeap; -#endif }PVRSRV_BRIDGE_IN_MAP_DEV_MEMORY; @@ -796,11 +680,7 @@ typedef struct PVRSRV_BRIDGE_IN_MAP_DEV_MEMORY_TAG typedef struct PVRSRV_BRIDGE_OUT_MAP_DEV_MEMORY_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDstKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psDstKernelMemInfo; -#endif PVRSRV_CLIENT_MEM_INFO sDstClientMemInfo; PVRSRV_CLIENT_SYNC_INFO sDstClientSyncInfo; @@ -813,11 +693,7 @@ typedef struct PVRSRV_BRIDGE_OUT_MAP_DEV_MEMORY_TAG typedef struct PVRSRV_BRIDGE_IN_UNMAP_DEV_MEMORY_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif PVRSRV_CLIENT_MEM_INFO sClientMemInfo; PVRSRV_CLIENT_SYNC_INFO sClientSyncInfo; @@ -830,11 +706,7 @@ typedef struct PVRSRV_BRIDGE_IN_UNMAP_DEV_MEMORY_TAG typedef struct PVRSRV_BRIDGE_IN_MAP_EXT_MEMORY_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif IMG_SYS_PHYADDR *psSysPAddr; IMG_UINT32 ui32Flags; @@ -858,13 +730,8 @@ typedef struct PVRSRV_BRIDGE_IN_UNMAP_EXT_MEMORY_TAG typedef struct PVRSRV_BRIDGE_IN_MAP_DEVICECLASS_MEMORY_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceClassBuffer; - IMG_SID hDevMemContext; -#else IMG_HANDLE hDeviceClassBuffer; IMG_HANDLE hDevMemContext; -#endif }PVRSRV_BRIDGE_IN_MAP_DEVICECLASS_MEMORY; @@ -877,13 +744,8 @@ typedef struct PVRSRV_BRIDGE_OUT_MAP_DEVICECLASS_MEMORY_TAG PVRSRV_ERROR eError; PVRSRV_CLIENT_MEM_INFO sClientMemInfo; PVRSRV_CLIENT_SYNC_INFO sClientSyncInfo; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; - IMG_SID hMappingInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; IMG_HANDLE hMappingInfo; -#endif }PVRSRV_BRIDGE_OUT_MAP_DEVICECLASS_MEMORY; @@ -894,11 +756,7 @@ typedef struct PVRSRV_BRIDGE_OUT_MAP_DEVICECLASS_MEMORY_TAG typedef struct PVRSRV_BRIDGE_IN_UNMAP_DEVICECLASS_MEMORY_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif PVRSRV_CLIENT_MEM_INFO sClientMemInfo; PVRSRV_CLIENT_SYNC_INFO sClientSyncInfo; @@ -911,11 +769,7 @@ typedef struct PVRSRV_BRIDGE_IN_UNMAP_DEVICECLASS_MEMORY_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_MEMPOL_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif IMG_UINT32 ui32Offset; IMG_UINT32 ui32Value; IMG_UINT32 ui32Mask; @@ -930,11 +784,7 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_MEMPOL_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_SYNCPOL_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfo; -#else PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo; -#endif IMG_BOOL bIsRead; IMG_BOOL bUseLastOpDumpVal; IMG_UINT32 ui32Value; @@ -951,11 +801,7 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_DUMPMEM_TAG IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ IMG_PVOID pvLinAddr; IMG_PVOID pvAltLinAddr; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif IMG_UINT32 ui32Offset; IMG_UINT32 ui32Bytes; IMG_UINT32 ui32Flags; @@ -970,11 +816,7 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_DUMPSYNC_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ IMG_PVOID pvAltLinAddr; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfo; -#else PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo; -#endif IMG_UINT32 ui32Offset; IMG_UINT32 ui32Bytes; @@ -987,11 +829,7 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_DUMPSYNC_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_DUMPREG_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif PVRSRV_HWREG sHWReg; IMG_UINT32 ui32Flags; IMG_CHAR szRegRegion[32]; @@ -1004,11 +842,7 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_DUMPREG_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_REGPOL_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif PVRSRV_HWREG sHWReg; IMG_UINT32 ui32Mask; IMG_UINT32 ui32Flags; @@ -1032,13 +866,8 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_DUMPPDREG_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_MEMPAGES_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hKernelMemInfo; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hKernelMemInfo; -#endif IMG_DEV_PHYADDR *pPages; IMG_UINT32 ui32NumPages; IMG_DEV_VIRTADDR sDevVAddr; @@ -1078,22 +907,14 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_SETFRAME_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_BITMAP_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_CHAR szFileName[PVRSRV_PDUMP_MAX_FILENAME_SIZE]; IMG_UINT32 ui32FileOffset; IMG_UINT32 ui32Width; IMG_UINT32 ui32Height; IMG_UINT32 ui32StrideInBytes; IMG_DEV_VIRTADDR sDevBaseAddr; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemContext; -#else IMG_HANDLE hDevMemContext; -#endif IMG_UINT32 ui32Size; PDUMP_PIXEL_FORMAT ePixelFormat; PDUMP_MEM_FORMAT eMemFormat; @@ -1108,11 +929,7 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_BITMAP_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_READREG_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_CHAR szFileName[PVRSRV_PDUMP_MAX_FILENAME_SIZE]; IMG_UINT32 ui32FileOffset; IMG_UINT32 ui32Address; @@ -1136,11 +953,7 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_DRIVERINFO_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_DUMPPDDEVPADDR_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else IMG_HANDLE hKernelMemInfo; -#endif IMG_UINT32 ui32Offset; IMG_DEV_PHYADDR sPDDevPAddr; }PVRSRV_BRIDGE_IN_PDUMP_DUMPPDDEVPADDR; @@ -1151,11 +964,7 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_DUMPPDDEVPADDR_TAG typedef struct PVRSRV_BRIDGE_PDUM_IN_CYCLE_COUNT_REG_READ_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_UINT32 ui32RegOffset; IMG_BOOL bLastFrame; }PVRSRV_BRIDGE_IN_PDUMP_CYCLE_COUNT_REG_READ; @@ -1183,11 +992,7 @@ typedef struct PVRSRV_BRIDGE_OUT_ACQUIRE_DEVICEINFO_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif } PVRSRV_BRIDGE_OUT_ACQUIRE_DEVICEINFO; @@ -1211,11 +1016,7 @@ typedef struct PVRSRV_BRIDGE_IN_OPEN_DISPCLASS_DEVICE_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ IMG_UINT32 ui32DeviceID; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif }PVRSRV_BRIDGE_IN_OPEN_DISPCLASS_DEVICE; @@ -1225,11 +1026,7 @@ typedef struct PVRSRV_BRIDGE_IN_OPEN_DISPCLASS_DEVICE_TAG typedef struct PVRSRV_BRIDGE_OUT_OPEN_DISPCLASS_DEVICE_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif }PVRSRV_BRIDGE_OUT_OPEN_DISPCLASS_DEVICE; @@ -1240,16 +1037,11 @@ typedef struct PVRSRV_BRIDGE_OUT_OPEN_DISPCLASS_DEVICE_TAG typedef struct PVRSRV_BRIDGE_IN_WRAP_EXT_MEMORY_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hDevMemContext; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hDevMemContext; -#endif IMG_VOID *pvLinAddr; - IMG_SIZE_T ui32ByteSize; - IMG_SIZE_T ui32PageOffset; + IMG_SIZE_T uByteSize; + IMG_SIZE_T uPageOffset; IMG_BOOL bPhysContig; IMG_UINT32 ui32NumPageTableEntries; IMG_SYS_PHYADDR *psSysPAddr; @@ -1274,11 +1066,7 @@ typedef struct PVRSRV_BRIDGE_OUT_WRAP_EXT_MEMORY_TAG typedef struct PVRSRV_BRIDGE_IN_UNWRAP_EXT_MEMORY_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else IMG_HANDLE hKernelMemInfo; -#endif PVRSRV_CLIENT_MEM_INFO sClientMemInfo; PVRSRV_CLIENT_SYNC_INFO sClientSyncInfo; @@ -1308,11 +1096,7 @@ typedef struct PVRSRV_BRIDGE_OUT_ENUM_DISPCLASS_FORMATS_TAG typedef struct PVRSRV_BRIDGE_IN_ENUM_DISPCLASS_DIMS_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif DISPLAY_FORMAT sFormat; }PVRSRV_BRIDGE_IN_ENUM_DISPCLASS_DIMS; @@ -1347,11 +1131,7 @@ typedef struct PVRSRV_BRIDGE_OUT_GET_DISPCLASS_INFO_TAG typedef struct PVRSRV_BRIDGE_OUT_GET_DISPCLASS_SYSBUFFER_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hBuffer; -#else IMG_HANDLE hBuffer; -#endif }PVRSRV_BRIDGE_OUT_GET_DISPCLASS_SYSBUFFER; @@ -1362,11 +1142,7 @@ typedef struct PVRSRV_BRIDGE_OUT_GET_DISPCLASS_SYSBUFFER_TAG typedef struct PVRSRV_BRIDGE_IN_CREATE_DISPCLASS_SWAPCHAIN_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif IMG_UINT32 ui32Flags; DISPLAY_SURF_ATTRIBUTES sDstSurfAttrib; DISPLAY_SURF_ATTRIBUTES sSrcSurfAttrib; @@ -1383,11 +1159,7 @@ typedef struct PVRSRV_BRIDGE_IN_CREATE_DISPCLASS_SWAPCHAIN_TAG typedef struct PVRSRV_BRIDGE_OUT_CREATE_DISPCLASS_SWAPCHAIN_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSwapChain; -#else IMG_HANDLE hSwapChain; -#endif IMG_UINT32 ui32SwapChainID; } PVRSRV_BRIDGE_OUT_CREATE_DISPCLASS_SWAPCHAIN; @@ -1399,13 +1171,8 @@ typedef struct PVRSRV_BRIDGE_OUT_CREATE_DISPCLASS_SWAPCHAIN_TAG typedef struct PVRSRV_BRIDGE_IN_DESTROY_DISPCLASS_SWAPCHAIN_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; - IMG_SID hSwapChain; -#else IMG_HANDLE hDeviceKM; IMG_HANDLE hSwapChain; -#endif } PVRSRV_BRIDGE_IN_DESTROY_DISPCLASS_SWAPCHAIN; @@ -1416,13 +1183,8 @@ typedef struct PVRSRV_BRIDGE_IN_DESTROY_DISPCLASS_SWAPCHAIN_TAG typedef struct PVRSRV_BRIDGE_IN_SET_DISPCLASS_RECT_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; - IMG_SID hSwapChain; -#else IMG_HANDLE hDeviceKM; IMG_HANDLE hSwapChain; -#endif IMG_RECT sRect; } PVRSRV_BRIDGE_IN_SET_DISPCLASS_RECT; @@ -1434,13 +1196,8 @@ typedef struct PVRSRV_BRIDGE_IN_SET_DISPCLASS_RECT_TAG typedef struct PVRSRV_BRIDGE_IN_SET_DISPCLASS_COLOURKEY_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; - IMG_SID hSwapChain; -#else IMG_HANDLE hDeviceKM; IMG_HANDLE hSwapChain; -#endif IMG_UINT32 ui32CKColour; } PVRSRV_BRIDGE_IN_SET_DISPCLASS_COLOURKEY; @@ -1452,13 +1209,8 @@ typedef struct PVRSRV_BRIDGE_IN_SET_DISPCLASS_COLOURKEY_TAG typedef struct PVRSRV_BRIDGE_IN_GET_DISPCLASS_BUFFERS_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; - IMG_SID hSwapChain; -#else IMG_HANDLE hDeviceKM; IMG_HANDLE hSwapChain; -#endif } PVRSRV_BRIDGE_IN_GET_DISPCLASS_BUFFERS; @@ -1470,11 +1222,7 @@ typedef struct PVRSRV_BRIDGE_OUT_GET_DISPCLASS_BUFFERS_TAG { PVRSRV_ERROR eError; IMG_UINT32 ui32BufferCount; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID ahBuffer[PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS]; -#else IMG_HANDLE ahBuffer[PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS]; -#endif IMG_SYS_PHYADDR asPhyAddr[PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS]; } PVRSRV_BRIDGE_OUT_GET_DISPCLASS_BUFFERS; @@ -1485,37 +1233,24 @@ typedef struct PVRSRV_BRIDGE_OUT_GET_DISPCLASS_BUFFERS_TAG typedef struct PVRSRV_BRIDGE_IN_SWAP_DISPCLASS_TO_BUFFER_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; - IMG_SID hBuffer; -#else IMG_HANDLE hDeviceKM; IMG_HANDLE hBuffer; -#endif IMG_UINT32 ui32SwapInterval; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hPrivateTag; -#else IMG_HANDLE hPrivateTag; -#endif IMG_UINT32 ui32ClipRectCount; IMG_RECT sClipRect[PVRSRV_MAX_DC_CLIP_RECTS]; } PVRSRV_BRIDGE_IN_SWAP_DISPCLASS_TO_BUFFER; + /****************************************************************************** - * 'bridge in' swap to buffer + * 'bridge in' swap to buffer 2 *****************************************************************************/ typedef struct PVRSRV_BRIDGE_IN_SWAP_DISPCLASS_TO_BUFFER2_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; - IMG_SID hSwapChain; -#else IMG_HANDLE hDeviceKM; IMG_HANDLE hSwapChain; -#endif IMG_UINT32 ui32SwapInterval; IMG_UINT32 ui32NumMemInfos; @@ -1527,19 +1262,26 @@ typedef struct PVRSRV_BRIDGE_IN_SWAP_DISPCLASS_TO_BUFFER2_TAG } PVRSRV_BRIDGE_IN_SWAP_DISPCLASS_TO_BUFFER2; + +/****************************************************************************** + * 'bridge out' swap to buffer 2 + *****************************************************************************/ +typedef struct PVRSRV_BRIDGE_OUT_SWAP_DISPCLASS_TO_BUFFER2_TAG +{ + PVRSRV_ERROR eError; + IMG_HANDLE hFence; + +} PVRSRV_BRIDGE_OUT_SWAP_DISPCLASS_TO_BUFFER2; + + /****************************************************************************** * 'bridge in' swap to system buffer (primary) *****************************************************************************/ typedef struct PVRSRV_BRIDGE_IN_SWAP_DISPCLASS_TO_SYSTEM_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; - IMG_SID hSwapChain; -#else IMG_HANDLE hDeviceKM; IMG_HANDLE hSwapChain; -#endif } PVRSRV_BRIDGE_IN_SWAP_DISPCLASS_TO_SYSTEM; @@ -1551,11 +1293,7 @@ typedef struct PVRSRV_BRIDGE_IN_OPEN_BUFFERCLASS_DEVICE_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ IMG_UINT32 ui32DeviceID; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif } PVRSRV_BRIDGE_IN_OPEN_BUFFERCLASS_DEVICE; @@ -1566,11 +1304,7 @@ typedef struct PVRSRV_BRIDGE_IN_OPEN_BUFFERCLASS_DEVICE_TAG typedef struct PVRSRV_BRIDGE_OUT_OPEN_BUFFERCLASS_DEVICE_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif } PVRSRV_BRIDGE_OUT_OPEN_BUFFERCLASS_DEVICE; @@ -1592,11 +1326,7 @@ typedef struct PVRSRV_BRIDGE_OUT_GET_BUFFERCLASS_INFO_TAG typedef struct PVRSRV_BRIDGE_IN_GET_BUFFERCLASS_BUFFER_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif IMG_UINT32 ui32BufferIndex; } PVRSRV_BRIDGE_IN_GET_BUFFERCLASS_BUFFER; @@ -1608,11 +1338,7 @@ typedef struct PVRSRV_BRIDGE_IN_GET_BUFFERCLASS_BUFFER_TAG typedef struct PVRSRV_BRIDGE_OUT_GET_BUFFERCLASS_BUFFER_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hBuffer; -#else IMG_HANDLE hBuffer; -#endif } PVRSRV_BRIDGE_OUT_GET_BUFFERCLASS_BUFFER; @@ -1635,11 +1361,7 @@ typedef struct PVRSRV_BRIDGE_OUT_GET_DEVMEM_HEAPINFO_TAG typedef struct PVRSRV_BRIDGE_OUT_CREATE_DEVMEMCONTEXT_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemContext; -#else IMG_HANDLE hDevMemContext; -#endif IMG_UINT32 ui32ClientHeapCount; PVRSRV_HEAP_INFO sHeapInfo[PVRSRV_MAX_CLIENT_HEAPS]; @@ -1652,11 +1374,7 @@ typedef struct PVRSRV_BRIDGE_OUT_CREATE_DEVMEMCONTEXT_TAG typedef struct PVRSRV_BRIDGE_OUT_CREATE_DEVMEMHEAP_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemHeap; -#else IMG_HANDLE hDevMemHeap; -#endif } PVRSRV_BRIDGE_OUT_CREATE_DEVMEMHEAP; @@ -1667,11 +1385,7 @@ typedef struct PVRSRV_BRIDGE_OUT_CREATE_DEVMEMHEAP_TAG typedef struct PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif PVRSRV_CLIENT_MEM_INFO sClientMemInfo; PVRSRV_CLIENT_SYNC_INFO sClientSyncInfo; @@ -1684,11 +1398,7 @@ typedef struct PVRSRV_BRIDGE_OUT_ALLOCDEVICEMEM_TAG typedef struct PVRSRV_BRIDGE_OUT_EXPORTDEVICEMEM_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hMemInfo; -#else IMG_HANDLE hMemInfo; -#endif #if defined(SUPPORT_MEMINFO_IDS) IMG_UINT64 ui64Stamp; #endif @@ -1702,13 +1412,10 @@ typedef struct PVRSRV_BRIDGE_OUT_EXPORTDEVICEMEM_TAG typedef struct _PVRSRV_BRIDGE_OUT_MAP_ION_HANDLE_ { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif PVRSRV_CLIENT_MEM_INFO sClientMemInfo; PVRSRV_CLIENT_SYNC_INFO sClientSyncInfo; + IMG_SIZE_T uiIonBufferSize; } PVRSRV_BRIDGE_OUT_MAP_ION_HANDLE; @@ -1720,11 +1427,7 @@ typedef struct PVRSRV_BRIDGE_OUT_MAPMEMINFOTOUSER_TAG { PVRSRV_ERROR eError; IMG_PVOID pvLinAddr; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hMappingInfo; -#else IMG_HANDLE hMappingInfo; -#endif }PVRSRV_BRIDGE_OUT_MAPMEMINFOTOUSER; @@ -1735,9 +1438,9 @@ typedef struct PVRSRV_BRIDGE_OUT_MAPMEMINFOTOUSER_TAG typedef struct PVRSRV_BRIDGE_OUT_GETFREEDEVICEMEM_TAG { PVRSRV_ERROR eError; - IMG_SIZE_T ui32Total; - IMG_SIZE_T ui32Free; - IMG_SIZE_T ui32LargestBlock; + IMG_SIZE_T uTotal; + IMG_SIZE_T uFree; + IMG_SIZE_T uLargestBlock; } PVRSRV_BRIDGE_OUT_GETFREEDEVICEMEM; @@ -1754,18 +1457,18 @@ typedef struct PVRSRV_BRIDGE_OUT_MHANDLE_TO_MMAP_DATA_TAG /* This is a the offset you should pass to mmap(2) so that * the driver can look up the full details for the mapping * request. */ - IMG_UINT32 ui32MMapOffset; + IMG_UINTPTR_T uiMMapOffset; /* This is the byte offset you should add to the mapping you * get from mmap */ - IMG_UINT32 ui32ByteOffset; + IMG_UINTPTR_T uiByteOffset; /* This is the real size of the mapping that will be created * which should be passed to mmap _and_ munmap. */ - IMG_UINT32 ui32RealByteSize; + IMG_SIZE_T uiRealByteSize; /* User mode address associated with mapping */ - IMG_UINT32 ui32UserVAddr; + IMG_UINTPTR_T uiUserVAddr; } PVRSRV_BRIDGE_OUT_MHANDLE_TO_MMAP_DATA; @@ -1777,13 +1480,20 @@ typedef struct PVRSRV_BRIDGE_OUT_RELEASE_MMAP_DATA_TAG IMG_BOOL bMUnmap; /* User mode address associated with mapping */ - IMG_UINT32 ui32UserVAddr; + IMG_UINTPTR_T uiUserVAddr; /* Size of mapping */ - IMG_UINT32 ui32RealByteSize; + IMG_SIZE_T uiRealByteSize; } PVRSRV_BRIDGE_OUT_RELEASE_MMAP_DATA; //#endif +typedef struct PVRSRV_BRIDGE_IN_COMPAT_CHECK +{ + IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ + IMG_UINT32 ui32DDKVersion; + IMG_UINT32 ui32DDKBuild; + +} PVRSRV_BRIDGE_IN_COMPAT_CHECK; /****************************************************************************** * 'bridge in' get misc info @@ -1846,8 +1556,8 @@ typedef struct PVRSRV_BRIDGE_OUT_PDUMP_ISCAPTURING_TAG typedef struct PVRSRV_BRIDGE_IN_GET_FB_STATS_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ - IMG_SIZE_T ui32Total; - IMG_SIZE_T ui32Available; + IMG_SIZE_T uTotal; + IMG_SIZE_T uAvailable; } PVRSRV_BRIDGE_IN_GET_FB_STATS; @@ -1858,11 +1568,7 @@ typedef struct PVRSRV_BRIDGE_IN_GET_FB_STATS_TAG typedef struct PVRSRV_BRIDGE_IN_MAPPHYSTOUSERSPACE_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_SYS_PHYADDR sSysPhysAddr; IMG_UINT32 uiSizeInBytes; @@ -1887,11 +1593,7 @@ typedef struct PVRSRV_BRIDGE_OUT_MAPPHYSTOUSERSPACE_TAG typedef struct PVRSRV_BRIDGE_IN_UNMAPPHYSTOUSERSPACE_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_PVOID pvUserAddr; IMG_PVOID pvProcess; @@ -1909,7 +1611,6 @@ typedef struct PVRSRV_BRIDGE_OUT_GETPHYSTOUSERSPACEMAP_TAG } PVRSRV_BRIDGE_OUT_GETPHYSTOUSERSPACEMAP; -#if !defined (SUPPORT_SID_INTERFACE) /****************************************************************************** * 'bridge in' Register RTSIM process thread *****************************************************************************/ @@ -1959,7 +1660,6 @@ typedef struct PVRSRV_BRIDGE_IN_PROCESS_SIMISR_EVENT_TAG PVRSRV_ERROR eError; } PVRSRV_BRIDGE_IN_PROCESS_SIMISR_EVENT; -#endif /* #if !defined (SUPPORT_SID_INTERFACE) */ /****************************************************************************** * 'bridge in' initialisation server disconnect @@ -1975,28 +1675,20 @@ typedef struct PVRSRV_BRIDGE_IN_ALLOC_SHARED_SYS_MEM_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ IMG_UINT32 ui32Flags; - IMG_SIZE_T ui32Size; + IMG_SIZE_T uSize; }PVRSRV_BRIDGE_IN_ALLOC_SHARED_SYS_MEM; typedef struct PVRSRV_BRIDGE_OUT_ALLOC_SHARED_SYS_MEM_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif PVRSRV_CLIENT_MEM_INFO sClientMemInfo; }PVRSRV_BRIDGE_OUT_ALLOC_SHARED_SYS_MEM; typedef struct PVRSRV_BRIDGE_IN_FREE_SHARED_SYS_MEM_TAG { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; - IMG_SID hMappingInfo; -#else IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif PVRSRV_CLIENT_MEM_INFO sClientMemInfo; }PVRSRV_BRIDGE_IN_FREE_SHARED_SYS_MEM; @@ -2008,22 +1700,14 @@ typedef struct PVRSRV_BRIDGE_OUT_FREE_SHARED_SYS_MEM_TAG typedef struct PVRSRV_BRIDGE_IN_MAP_MEMINFO_MEM_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else IMG_HANDLE hKernelMemInfo; -#endif }PVRSRV_BRIDGE_IN_MAP_MEMINFO_MEM; typedef struct PVRSRV_BRIDGE_OUT_MAP_MEMINFO_MEM_TAG { PVRSRV_CLIENT_MEM_INFO sClientMemInfo; PVRSRV_CLIENT_SYNC_INFO sClientSyncInfo; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif PVRSRV_ERROR eError; }PVRSRV_BRIDGE_OUT_MAP_MEMINFO_MEM; @@ -2041,11 +1725,7 @@ typedef struct PVRSRV_BRIDGE_OUT_UNMAP_MEMINFO_MEM_TAG typedef struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_WAI_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hOSEventKM; -#else IMG_HANDLE hOSEventKM; -#endif } PVRSRV_BRIDGE_IN_EVENT_OBJECT_WAIT; typedef struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_OPEN_TAG @@ -2055,56 +1735,35 @@ typedef struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_OPEN_TAG typedef struct PVRSRV_BRIDGE_OUT_EVENT_OBJECT_OPEN_TAG { -#if defined (SUPPORT_SID_INTERFACE) - IMG_UINT32 hOSEvent; -#else IMG_HANDLE hOSEvent; -#endif PVRSRV_ERROR eError; } PVRSRV_BRIDGE_OUT_EVENT_OBJECT_OPEN; typedef struct PVRSRV_BRIDGE_IN_EVENT_OBJECT_CLOSE_TAG { PVRSRV_EVENTOBJECT sEventObject; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hOSEventKM; -#else IMG_HANDLE hOSEventKM; -#endif } PVRSRV_BRIDGE_IN_EVENT_OBJECT_CLOSE; typedef struct PVRSRV_BRIDGE_OUT_CREATE_SYNC_INFO_MOD_OBJ_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfoModObj; -#else IMG_HANDLE hKernelSyncInfoModObj; -#endif } PVRSRV_BRIDGE_OUT_CREATE_SYNC_INFO_MOD_OBJ; typedef struct PVRSRV_BRIDGE_IN_DESTROY_SYNC_INFO_MOD_OBJ { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfoModObj; -#else IMG_HANDLE hKernelSyncInfoModObj; -#endif } PVRSRV_BRIDGE_IN_DESTROY_SYNC_INFO_MOD_OBJ; typedef struct PVRSRV_BRIDGE_IN_MODIFY_PENDING_SYNC_OPS_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfoModObj; - IMG_SID hKernelSyncInfo; -#else IMG_HANDLE hKernelSyncInfoModObj; IMG_HANDLE hKernelSyncInfo; -#endif IMG_UINT32 ui32ModifyFlags; } PVRSRV_BRIDGE_IN_MODIFY_PENDING_SYNC_OPS; @@ -2112,11 +1771,7 @@ typedef struct PVRSRV_BRIDGE_IN_MODIFY_PENDING_SYNC_OPS_TAG typedef struct PVRSRV_BRIDGE_IN_MODIFY_COMPLETE_SYNC_OPS_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfoModObj; -#else IMG_HANDLE hKernelSyncInfoModObj; -#endif } PVRSRV_BRIDGE_IN_MODIFY_COMPLETE_SYNC_OPS; typedef struct PVRSRV_BRIDGE_OUT_MODIFY_PENDING_SYNC_OPS_TAG @@ -2133,11 +1788,7 @@ typedef struct PVRSRV_BRIDGE_OUT_MODIFY_PENDING_SYNC_OPS_TAG typedef struct PVRSRV_BRIDGE_IN_SYNC_OPS_TAKE_TOKEN_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfo; -#else IMG_HANDLE hKernelSyncInfo; -#endif } PVRSRV_BRIDGE_IN_SYNC_OPS_TAKE_TOKEN; @@ -2154,11 +1805,7 @@ typedef struct PVRSRV_BRIDGE_OUT_SYNC_OPS_TAKE_TOKEN_TAG typedef struct PVRSRV_BRIDGE_IN_SYNC_OPS_FLUSH_TO_TOKEN_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfo; -#else IMG_HANDLE hKernelSyncInfo; -#endif IMG_UINT32 ui32ReadOpsPendingSnapshot; IMG_UINT32 ui32WriteOpsPendingSnapshot; IMG_UINT32 ui32ReadOps2PendingSnapshot; @@ -2167,21 +1814,13 @@ typedef struct PVRSRV_BRIDGE_IN_SYNC_OPS_FLUSH_TO_TOKEN_TAG typedef struct PVRSRV_BRIDGE_IN_SYNC_OPS_FLUSH_TO_MOD_OBJ_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfoModObj; -#else IMG_HANDLE hKernelSyncInfoModObj; -#endif } PVRSRV_BRIDGE_IN_SYNC_OPS_FLUSH_TO_MOD_OBJ; typedef struct PVRSRV_BRIDGE_IN_SYNC_OPS_FLUSH_TO_DELTA_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfo; -#else IMG_HANDLE hKernelSyncInfo; -#endif IMG_UINT32 ui32Delta; } PVRSRV_BRIDGE_IN_SYNC_OPS_FLUSH_TO_DELTA; @@ -2189,33 +1828,21 @@ typedef struct PVRSRV_BRIDGE_IN_ALLOC_SYNC_INFO_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif } PVRSRV_BRIDGE_IN_ALLOC_SYNC_INFO; typedef struct PVRSRV_BRIDGE_OUT_ALLOC_SYNC_INFO_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfo; -#else IMG_HANDLE hKernelSyncInfo; -#endif } PVRSRV_BRIDGE_OUT_ALLOC_SYNC_INFO; typedef struct PVRSRV_BRIDGE_IN_FREE_SYNC_INFO_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelSyncInfo; -#else IMG_HANDLE hKernelSyncInfo; -#endif } PVRSRV_BRIDGE_IN_FREE_SYNC_INFO; typedef struct PVRSRV_BRIDGE_IN_CHG_DEV_MEM_ATTRIBS_TAG @@ -2224,24 +1851,6 @@ typedef struct PVRSRV_BRIDGE_IN_CHG_DEV_MEM_ATTRIBS_TAG IMG_UINT32 ui32Attribs; } PVRSRV_BRIDGE_IN_CHG_DEV_MEM_ATTRIBS; -/****************************************************************************** - * 'bridge in' multi manage device memory - *****************************************************************************/ -typedef PVRSRV_MULTI_MANAGE_DEV_MEM_REQUESTS PVRSRV_BRIDGE_IN_MULTI_MANAGE_DEV_MEM; - -/****************************************************************************** - * 'bridge out' multi manage device memory - *****************************************************************************/ -typedef struct PVRSRV_BRIDGE_OUT_MULTI_MANAGE_DEV_MEM_TAG -{ - IMG_UINT32 ui32NumberOfRequestsProcessed; - IMG_UINT32 ui32CtrlFlags; - IMG_UINT32 ui32StatusFlags; - IMG_UINT32 ui32IndexError; - PVRSRV_ERROR eError; - /* Memory Requests Array - used only with direct (not memory shared( mode */ - PVRSRV_MANAGE_DEV_MEM_RESPONSE sMemResponse[PVRSRV_MULTI_MANAGE_DEV_MEM_MAX_DIRECT_SIZE]; -}PVRSRV_BRIDGE_OUT_MULTI_MANAGE_DEV_MEM; #if defined (__cplusplus) } diff --git a/jacinto6/sgx_src/eurasia_km/services4/include/pvr_bridge_km.h b/jacinto6/sgx_src/eurasia_km/services4/include/pvr_bridge_km.h index 1bf5b9c..d6f7a72 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/include/pvr_bridge_km.h +++ b/jacinto6/sgx_src/eurasia_km/services4/include/pvr_bridge_km.h @@ -56,7 +56,14 @@ extern "C" { #if defined(__linux__) PVRSRV_ERROR LinuxBridgeInit(IMG_VOID); IMG_VOID LinuxBridgeDeInit(IMG_VOID); + +#if defined(SUPPORT_MEMINFO_IDS) +extern IMG_UINT64 g_ui64MemInfoID; +#endif + #endif +IMG_IMPORT +IMG_VOID IMG_CALLCONV PVRSRVCompatCheckKM(PVRSRV_BRIDGE_IN_COMPAT_CHECK *psUserModeDDKDetails, PVRSRV_BRIDGE_RETURN *psRetOUT); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVEnumerateDevicesKM(IMG_UINT32 *pui32NumDevices, @@ -68,7 +75,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVAcquireDeviceDataKM(IMG_UINT32 uiDevIndex, IMG_HANDLE *phDevCookie); IMG_IMPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateCommandQueueKM(IMG_SIZE_T ui32QueueSize, +PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateCommandQueueKM(IMG_SIZE_T uQueueSize, PVRSRV_QUEUE_INFO **ppsQueueInfo); IMG_IMPORT @@ -76,22 +83,14 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVDestroyCommandQueueKM(PVRSRV_QUEUE_INFO *psQueue IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDeviceMemHeapsKM(IMG_HANDLE hDevCookie, -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_HEAP_INFO_KM *psHeapInfo); -#else PVRSRV_HEAP_INFO *psHeapInfo); -#endif IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateDeviceMemContextKM(IMG_HANDLE hDevCookie, PVRSRV_PER_PROCESS_DATA *psPerProc, IMG_HANDLE *phDevMemContext, IMG_UINT32 *pui32ClientHeapCount, -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_HEAP_INFO_KM *psHeapInfo, -#else PVRSRV_HEAP_INFO *psHeapInfo, -#endif IMG_BOOL *pbCreated, IMG_BOOL *pbShared); @@ -106,11 +105,7 @@ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDeviceMemHeapInfoKM(IMG_HANDLE hDevCookie, IMG_HANDLE hDevMemContext, IMG_UINT32 *pui32ClientHeapCount, -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_HEAP_INFO_KM *psHeapInfo, -#else PVRSRV_HEAP_INFO *psHeapInfo, -#endif IMG_BOOL *pbShared ); @@ -150,24 +145,20 @@ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVFreeDeviceMemKM(IMG_HANDLE hDevCookie, PVRSRV_KERNEL_MEM_INFO *psMemInfo); -IMG_EXPORT -IMG_INT32 IMG_CALLCONV PVRSRVRemapToDevKM(IMG_HANDLE hDevCookie, - PVRSRV_KERNEL_MEM_INFO *psMemInfo, IMG_DEV_VIRTADDR *psDevVAddr); - -IMG_EXPORT -IMG_INT32 IMG_CALLCONV PVRSRVUnmapFromDevKM(IMG_HANDLE hDevCookie, - PVRSRV_KERNEL_MEM_INFO *psMemInfo); - - #if defined(SUPPORT_ION) IMG_IMPORT PVRSRV_ERROR PVRSRVMapIonHandleKM(PVRSRV_PER_PROCESS_DATA *psPerProc, IMG_HANDLE hDevCookie, - IMG_HANDLE hDevMemContext, - IMG_HANDLE hIon, + IMG_HANDLE hDevMemHeap, + IMG_UINT32 ui32NumFDs, + IMG_INT32 *pai32BufferFDs, IMG_UINT32 ui32Flags, - IMG_UINT32 ui32Size, - PVRSRV_KERNEL_MEM_INFO **ppsKernelMemInfo); + IMG_UINT32 ui32ChunkCount, + IMG_SIZE_T *pauiOffset, + IMG_SIZE_T *pauiSize, + IMG_SIZE_T *puiIonBufferSize, + PVRSRV_KERNEL_MEM_INFO **ppsKernelMemInfo, + IMG_UINT64 *pui64Stamp); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVUnmapIonHandleKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo); @@ -211,6 +202,8 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVWrapExtMemoryKM(IMG_HANDLE hDevCookie, IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVUnwrapExtMemoryKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo); +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) + IMG_IMPORT PVRSRV_ERROR PVRSRVEnumerateDCKM(PVRSRV_DEVICE_CLASS DeviceClass, IMG_UINT32 *pui32DevCount, @@ -292,7 +285,8 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, PVRSRV_KERNEL_SYNC_INFO **ppsSyncInfos, IMG_UINT32 ui32NumMemSyncInfos, IMG_PVOID pvPrivData, - IMG_UINT32 ui32PrivDataLength); + IMG_UINT32 ui32PrivDataLength, + IMG_HANDLE *phFence); IMG_IMPORT PVRSRV_ERROR PVRSRVSwapToDCSystemKM(IMG_HANDLE hDeviceKM, IMG_HANDLE hSwapChain); @@ -313,7 +307,6 @@ PVRSRV_ERROR PVRSRVGetBCBufferKM(IMG_HANDLE hDeviceKM, IMG_UINT32 ui32BufferIndex, IMG_HANDLE *phBuffer); - IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA *psPerProc, IMG_HANDLE hDevMemContext, @@ -321,14 +314,16 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA * PVRSRV_KERNEL_MEM_INFO **ppsMemInfo, IMG_HANDLE *phOSMapInfo); +IMG_IMPORT +PVRSRV_ERROR IMG_CALLCONV PVRSRVUnmapDeviceClassMemoryKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo); + +#endif /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ + IMG_EXPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVChangeDeviceMemoryAttributesKM(IMG_HANDLE hKernelMemInfo, IMG_UINT32 ui32Attribs); IMG_IMPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVUnmapDeviceClassMemoryKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo); - -IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetFreeDeviceMemKM(IMG_UINT32 ui32Flags, IMG_SIZE_T *pui32Total, IMG_SIZE_T *pui32Free, @@ -343,11 +338,7 @@ IMG_IMPORT IMG_VOID IMG_CALLCONV PVRSRVReleaseSyncInfoKM(PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo); IMG_IMPORT -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO_KM *psMiscInfo); -#else PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo); -#endif /*! * ***************************************************************************** diff --git a/jacinto6/sgx_src/eurasia_km/services4/include/pvrmmap.h b/jacinto6/sgx_src/eurasia_km/services4/include/pvrmmap.h index 1a3930c..c18c872 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/include/pvrmmap.h +++ b/jacinto6/sgx_src/eurasia_km/services4/include/pvrmmap.h @@ -54,11 +54,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @return PVRSRV_OK, or error code. ***************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRPMapKMem(IMG_HANDLE hModule, IMG_VOID **ppvLinAddr, IMG_VOID *pvLinAddrKM, IMG_SID *phMappingInfo, IMG_SID hMHandle); -#else PVRSRV_ERROR PVRPMapKMem(IMG_HANDLE hModule, IMG_VOID **ppvLinAddr, IMG_VOID *pvLinAddrKM, IMG_HANDLE *phMappingInfo, IMG_HANDLE hMHandle); -#endif /*! @@ -71,11 +67,7 @@ PVRSRV_ERROR PVRPMapKMem(IMG_HANDLE hModule, IMG_VOID **ppvLinAddr, IMG_VOID *pv @return IMG_BOOL indicating success or otherwise. ***************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -IMG_BOOL PVRUnMapKMem(IMG_HANDLE hModule, IMG_SID hMappingInfo, IMG_SID hMHandle); -#else IMG_BOOL PVRUnMapKMem(IMG_HANDLE hModule, IMG_HANDLE hMappingInfo, IMG_HANDLE hMHandle); -#endif #endif /* _PVRMMAP_H_ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/include/servicesint.h b/jacinto6/sgx_src/eurasia_km/services4/include/servicesint.h index 7b09afb..2ae1a3b 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/include/servicesint.h +++ b/jacinto6/sgx_src/eurasia_km/services4/include/servicesint.h @@ -86,8 +86,28 @@ typedef enum _PVRSRV_MEMTYPE_ PVRSRV_MEMTYPE_WRAPPED = 3, PVRSRV_MEMTYPE_MAPPED = 4, PVRSRV_MEMTYPE_ION = 5, + PVRSRV_MEMTYPE_ALLOC = 6, + PVRSRV_MEMTYPE_FREE = 7 } PVRSRV_MEMTYPE; +#if defined (MEM_TRACK_INFO_DEBUG) +/* Threshold on number of latest operations to track*/ +#define MAX_MEM_TRACK_OPS 512 +typedef struct _PVRSRV_MEM_TRACK_INFO_ +{ + IMG_DEV_VIRTADDR sDevVAddr; + IMG_SIZE_T uSize; + IMG_UINT32 ui32Pid; + IMG_UINT32 ui32RefCount; + PVRSRV_MEMTYPE eOp; + IMG_UINT32 ui32TimeStampUSecs; + IMG_CHAR asTaskName[128]; + IMG_CHAR heapId[128]; + struct _PVRSRV_MEM_TRACK_INFO_ *next; + struct _PVRSRV_MEM_TRACK_INFO_ *prev; + +} PVRSRV_MEM_TRACK_INFO; +#endif /* Kernel Memory Information structure */ @@ -131,12 +151,9 @@ typedef struct _PVRSRV_KERNEL_MEM_INFO_ /* ptr to associated kernel sync info - NULL if no sync */ struct _PVRSRV_KERNEL_SYNC_INFO_ *psKernelSyncInfo; - PVRSRV_MEMTYPE memType; - - IMG_VOID *bvmap_handle; + IMG_HANDLE hIonSyncInfo; - /* Device Virtual Address Offsets for the YUV MM planes */ - IMG_UINT32 planeOffsets[PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES]; + PVRSRV_MEMTYPE memType; /* To activate the "share mem workaround", add PVRSRV_MEM_XPROC to @@ -165,6 +182,9 @@ typedef struct _PVRSRV_KERNEL_MEM_INFO_ IMG_UINT32 ui32OrigReqSize; IMG_UINT32 ui32OrigReqAlignment; } sShareMemWorkaround; +#if defined (MEM_TRACK_INFO_DEBUG) + IMG_CHAR heapId[128]; +#endif } PVRSRV_KERNEL_MEM_INFO; @@ -198,6 +218,21 @@ typedef struct _PVRSRV_KERNEL_SYNC_INFO_ /* Unique ID of the sync object */ IMG_UINT32 ui32UID; + + /* Pointer for list manager */ + struct _PVRSRV_KERNEL_SYNC_INFO_ *psNext; + struct _PVRSRV_KERNEL_SYNC_INFO_ **ppsThis; + +#if defined(SUPPORT_PER_SYNC_DEBUG) +#define PER_SYNC_HISTORY 10 + IMG_UINT32 ui32OperationMask; + IMG_UINT32 aui32OpInfo[PER_SYNC_HISTORY]; + IMG_UINT32 aui32ReadOpSample[PER_SYNC_HISTORY]; + IMG_UINT32 aui32WriteOpSample[PER_SYNC_HISTORY]; + IMG_UINT32 aui32ReadOp2Sample[PER_SYNC_HISTORY]; + IMG_UINT32 ui32HistoryIndex; +#endif + } PVRSRV_KERNEL_SYNC_INFO; /*! @@ -252,6 +287,11 @@ typedef struct _PVRSRV_COMMAND allocated on back of this structure, i.e. is resident in Q */ PFN_QUEUE_COMMAND_COMPLETE pfnCommandComplete; /*!< Command complete callback */ IMG_HANDLE hCallbackData; /*!< Command complete callback data */ + +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + IMG_VOID *pvCleanupFence; /*!< Sync fence to 'put' after timeline inc() */ + IMG_VOID *pvTimeline; /*!< Android sync timeline to inc() */ +#endif }PVRSRV_COMMAND, *PPVRSRV_COMMAND; @@ -287,10 +327,10 @@ typedef struct _PVRSRV_QUEUE_INFO_ IMG_VOID *pvLinQueueUM; /*!< Pointer to the command buffer in the user's address space */ - volatile IMG_SIZE_T ui32ReadOffset; /*!< Index into the buffer at which commands are being + volatile IMG_SIZE_T uReadOffset; /*!< Index into the buffer at which commands are being consumed */ - volatile IMG_SIZE_T ui32WriteOffset; /*!< Index into the buffer at which commands are being + volatile IMG_SIZE_T uWriteOffset; /*!< Index into the buffer at which commands are being added */ IMG_UINT32 *pui32KickerAddrKM; /*!< kicker address in the kernel's @@ -299,12 +339,17 @@ typedef struct _PVRSRV_QUEUE_INFO_ IMG_UINT32 *pui32KickerAddrUM; /*!< kicker address in the user's address space */ - IMG_SIZE_T ui32QueueSize; /*!< Size in bytes of the buffer - excluding the safety allocation */ + IMG_SIZE_T uQueueSize; /*!< Size in bytes of the buffer - excluding the safety allocation */ IMG_UINT32 ui32ProcessID; /*!< Process ID required by resource locking */ IMG_HANDLE hMemBlock[2]; +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + IMG_UINT32 ui32FenceValue; /*!< 'Target' timeline value when fence signals */ + IMG_VOID *pvTimeline; /*!< Android struct sync_timeline object */ +#endif + struct _PVRSRV_QUEUE_INFO_ *psNextKM; /*!< The next queue in the system */ }PVRSRV_QUEUE_INFO; @@ -433,11 +478,7 @@ typedef struct PVRSRV_DEVICECLASS_BUFFER_TAG */ typedef struct PVRSRV_CLIENT_DEVICECLASS_INFO_TAG { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDeviceKM; -#else IMG_HANDLE hDeviceKM; -#endif IMG_HANDLE hServices; } PVRSRV_CLIENT_DEVICECLASS_INFO; @@ -481,7 +522,7 @@ PVRSRV_ERROR PVRSRVQueueCommand(IMG_HANDLE hQueueInfo, IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVAllocSharedSysMem(const PVRSRV_CONNECTION *psConnection, IMG_UINT32 ui32Flags, - IMG_SIZE_T ui32Size, + IMG_SIZE_T uSize, PVRSRV_CLIENT_MEM_INFO **ppsClientMemInfo); /*! @@ -537,12 +578,13 @@ PVRSRVUnrefSharedSysMem(const PVRSRV_CONNECTION *psConnection, ********************************************************************************/ IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVMapMemInfoMem(const PVRSRV_CONNECTION *psConnection, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo, -#else IMG_HANDLE hKernelMemInfo, -#endif PVRSRV_CLIENT_MEM_INFO **ppsClientMemInfo); +#if defined(MEM_TRACK_INFO_DEBUG) +IMG_IMPORT IMG_VOID PVRSRVPrintMemTrackInfo(IMG_UINT32 ui32FaultAddr); +IMG_IMPORT IMG_VOID PVRSRVAddMemTrackInfo(PVRSRV_MEM_TRACK_INFO *psMemTrackInfo); +IMG_IMPORT IMG_VOID PVRSRVFreeMemOps(IMG_VOID); +#endif #if defined (__cplusplus) diff --git a/jacinto6/sgx_src/eurasia_km/services4/include/sgx_bridge.h b/jacinto6/sgx_src/eurasia_km/services4/include/sgx_bridge.h index 33b27e3..ab1593f 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/include/sgx_bridge.h +++ b/jacinto6/sgx_src/eurasia_km/services4/include/sgx_bridge.h @@ -43,11 +43,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #if !defined(__SGX_BRIDGE_H__) #define __SGX_BRIDGE_H__ -#if defined (SUPPORT_SID_INTERFACE) -#include "sgxapi.h" -#else #include "sgxapi_km.h" -#endif #include "sgxinfo.h" #include "pvr_bridge.h" @@ -150,13 +146,8 @@ typedef struct PVRSRV_BRIDGE_OUT_GETPHYSPAGEADDR typedef struct PVRSRV_BRIDGE_IN_SGX_SET_TRANSFER_CONTEXT_PRIORITY_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ - #if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hHWTransferContext; - #else IMG_HANDLE hDevCookie; IMG_HANDLE hHWTransferContext; - #endif IMG_UINT32 ui32Priority; IMG_UINT32 ui32OffsetOfPriorityField; }PVRSRV_BRIDGE_IN_SGX_SET_TRANSFER_CONTEXT_PRIORITY; @@ -168,13 +159,8 @@ typedef struct PVRSRV_BRIDGE_IN_SGX_SET_TRANSFER_CONTEXT_PRIORITY_TAG typedef struct PVRSRV_BRIDGE_IN_SGX_SET_RENDER_CONTEXT_PRIORITY_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hHWRenderContext; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hHWRenderContext; -#endif IMG_UINT32 ui32Priority; IMG_UINT32 ui32OffsetOfPriorityField; }PVRSRV_BRIDGE_IN_SGX_SET_RENDER_CONTEXT_PRIORITY; @@ -186,11 +172,7 @@ typedef struct PVRSRV_BRIDGE_IN_SGX_SET_RENDER_CONTEXT_PRIORITY_TAG typedef struct PVRSRV_BRIDGE_IN_GETCLIENTINFO_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif }PVRSRV_BRIDGE_IN_GETCLIENTINFO; /*! @@ -210,11 +192,7 @@ typedef struct PVRSRV_BRIDGE_OUT_GETINTERNALDEVINFO_TAG typedef struct PVRSRV_BRIDGE_IN_GETINTERNALDEVINFO_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif }PVRSRV_BRIDGE_IN_GETINTERNALDEVINFO; /*! @@ -234,11 +212,7 @@ typedef struct PVRSRV_BRIDGE_OUT_GETCLIENTINFO_TAG typedef struct PVRSRV_BRIDGE_IN_RELEASECLIENTINFO_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif SGX_CLIENT_INFO sClientInfo; }PVRSRV_BRIDGE_IN_RELEASECLIENTINFO; @@ -249,11 +223,7 @@ typedef struct PVRSRV_BRIDGE_IN_RELEASECLIENTINFO_TAG typedef struct PVRSRV_BRIDGE_IN_ISPBREAKPOLL_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif }PVRSRV_BRIDGE_IN_ISPBREAKPOLL; /*! @@ -263,11 +233,7 @@ typedef struct PVRSRV_BRIDGE_IN_ISPBREAKPOLL_TAG typedef struct PVRSRV_BRIDGE_IN_DOKICK_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif SGX_CCB_KICK sCCBKick; }PVRSRV_BRIDGE_IN_DOKICK; @@ -278,11 +244,7 @@ typedef struct PVRSRV_BRIDGE_IN_DOKICK_TAG typedef struct PVRSRV_BRIDGE_IN_SGX_SCHEDULE_PROCESS_QUEUES_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif }PVRSRV_BRIDGE_IN_SGX_SCHEDULE_PROCESS_QUEUES; @@ -294,11 +256,7 @@ typedef struct PVRSRV_BRIDGE_IN_SGX_SCHEDULE_PROCESS_QUEUES_TAG typedef struct PVRSRV_BRIDGE_IN_SUBMITTRANSFER_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif PVRSRV_TRANSFER_SGX_KICK sKick; }PVRSRV_BRIDGE_IN_SUBMITTRANSFER; @@ -310,11 +268,7 @@ typedef struct PVRSRV_BRIDGE_IN_SUBMITTRANSFER_TAG typedef struct PVRSRV_BRIDGE_IN_SUBMIT2D_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif PVRSRV_2D_SGX_KICK sKick; } PVRSRV_BRIDGE_IN_SUBMIT2D; #endif @@ -327,11 +281,7 @@ typedef struct PVRSRV_BRIDGE_IN_SUBMIT2D_TAG typedef struct PVRSRV_BRIDGE_IN_READREGDWORD_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_PCHAR pszKey; IMG_PCHAR pszValue; }PVRSRV_BRIDGE_IN_READREGDWORD; @@ -354,11 +304,7 @@ typedef struct PVRSRV_BRIDGE_OUT_READREGDWORD_TAG typedef struct PVRSRV_BRIDGE_IN_SGXGETMISCINFO_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif SGX_MISC_INFO *psMiscInfo; }PVRSRV_BRIDGE_IN_SGXGETMISCINFO; @@ -369,11 +315,7 @@ typedef struct PVRSRV_BRIDGE_IN_SGXGETMISCINFO_TAG typedef struct PVRSRV_BRIDGE_IN_SGXINFO_FOR_SRVINIT_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif }PVRSRV_BRIDGE_IN_SGXINFO_FOR_SRVINIT; /*! @@ -393,11 +335,7 @@ typedef struct PVRSRV_BRIDGE_OUT_SGXINFO_FOR_SRVINIT_TAG typedef struct PVRSRV_BRIDGE_IN_SGXDEVINITPART2_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif SGX_BRIDGE_INIT_INFO sInitInfo; }PVRSRV_BRIDGE_IN_SGXDEVINITPART2; @@ -419,13 +357,8 @@ typedef struct PVRSRV_BRIDGE_OUT_SGXDEVINITPART2_TAG typedef struct PVRSRV_BRIDGE_IN_2DQUERYBLTSCOMPLETE_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hKernSyncInfo; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hKernSyncInfo; -#endif IMG_BOOL bWaitForComplete; }PVRSRV_BRIDGE_IN_2DQUERYBLTSCOMPLETE; @@ -435,26 +368,13 @@ typedef struct PVRSRV_BRIDGE_IN_2DQUERYBLTSCOMPLETE_TAG typedef struct PVRSRV_BRIDGE_IN_SGXFINDSHAREDPBDESC_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_BOOL bLockOnFailure; IMG_UINT32 ui32TotalPBSize; }PVRSRV_BRIDGE_IN_SGXFINDSHAREDPBDESC; typedef struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC_TAG { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; - IMG_SID hSharedPBDesc; - IMG_SID hSharedPBDescKernelMemInfoHandle; - IMG_SID hHWPBDescKernelMemInfoHandle; - IMG_SID hBlockKernelMemInfoHandle; - IMG_SID hHWBlockKernelMemInfoHandle; - IMG_SID ahSharedPBDescSubKernelMemInfoHandles[PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS]; -#else IMG_HANDLE hKernelMemInfo; IMG_HANDLE hSharedPBDesc; IMG_HANDLE hSharedPBDescKernelMemInfoHandle; @@ -462,7 +382,6 @@ typedef struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC_TAG IMG_HANDLE hBlockKernelMemInfoHandle; IMG_HANDLE hHWBlockKernelMemInfoHandle; IMG_HANDLE ahSharedPBDescSubKernelMemInfoHandles[PVRSRV_BRIDGE_SGX_SHAREDPBDESC_MAX_SUBMEMINFOS]; -#endif IMG_UINT32 ui32SharedPBDescSubKernelMemInfoHandlesCount; PVRSRV_ERROR eError; }PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC; @@ -470,11 +389,7 @@ typedef struct PVRSRV_BRIDGE_OUT_SGXFINDSHAREDPBDESC_TAG typedef struct PVRSRV_BRIDGE_IN_SGXUNREFSHAREDPBDESC_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSharedPBDesc; -#else IMG_HANDLE hSharedPBDesc; -#endif }PVRSRV_BRIDGE_IN_SGXUNREFSHAREDPBDESC; typedef struct PVRSRV_BRIDGE_OUT_SGXUNREFSHAREDPBDESC_TAG @@ -487,21 +402,12 @@ typedef struct PVRSRV_BRIDGE_IN_SGXADDSHAREDPBDESC_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ IMG_UINT32 ui32TotalPBSize; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hSharedPBDescKernelMemInfo; - IMG_SID hHWPBDescKernelMemInfo; - IMG_SID hBlockKernelMemInfo; - IMG_SID hHWBlockKernelMemInfo; - IMG_SID *phKernelMemInfoHandles; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hSharedPBDescKernelMemInfo; IMG_HANDLE hHWPBDescKernelMemInfo; IMG_HANDLE hBlockKernelMemInfo; IMG_HANDLE hHWBlockKernelMemInfo; IMG_HANDLE *phKernelMemInfoHandles; -#endif IMG_UINT32 ui32KernelMemInfoHandlesCount; IMG_DEV_VIRTADDR sHWPBDescDevVAddr; }PVRSRV_BRIDGE_IN_SGXADDSHAREDPBDESC; @@ -509,11 +415,7 @@ typedef struct PVRSRV_BRIDGE_IN_SGXADDSHAREDPBDESC_TAG typedef struct PVRSRV_BRIDGE_OUT_SGXADDSHAREDPBDESC_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hSharedPBDesc; -#else IMG_HANDLE hSharedPBDesc; -#endif }PVRSRV_BRIDGE_OUT_SGXADDSHAREDPBDESC; @@ -529,13 +431,8 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_BUFFER_ARRAY_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_3D_SIGNATURE_REGISTERS_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hDevMemContext; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hDevMemContext; -#endif IMG_UINT32 ui32DumpFrameNum; IMG_BOOL bLastFrame; IMG_UINT32 *pui32Registers; @@ -545,11 +442,7 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_3D_SIGNATURE_REGISTERS_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMPCOUNTER_REGISTERS_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_UINT32 ui32DumpFrameNum; IMG_BOOL bLastFrame; IMG_UINT32 *pui32Registers; @@ -559,11 +452,7 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMPCOUNTER_REGISTERS_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_TA_SIGNATURE_REGISTERS_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_UINT32 ui32DumpFrameNum; IMG_UINT32 ui32TAKickCount; IMG_BOOL bLastFrame; @@ -574,13 +463,8 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_TA_SIGNATURE_REGISTERS_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_HWPERFCB_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hDevMemContext; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hDevMemContext; -#endif IMG_CHAR szFileName[PVRSRV_PDUMP_MAX_FILENAME_SIZE]; IMG_UINT32 ui32FileOffset; IMG_UINT32 ui32PDumpFlags; @@ -590,19 +474,12 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_HWPERFCB_TAG typedef struct PVRSRV_BRIDGE_IN_PDUMP_SAVEMEM { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hDevMemContext; -#else IMG_HANDLE hDevCookie; -#endif IMG_CHAR szFileName[PVRSRV_PDUMP_MAX_FILENAME_SIZE]; IMG_UINT32 ui32FileOffset; IMG_DEV_VIRTADDR sDevVAddr; IMG_UINT32 ui32Size; -#if !defined (SUPPORT_SID_INTERFACE) IMG_HANDLE hDevMemContext; -#endif IMG_UINT32 ui32PDumpFlags; }PVRSRV_BRIDGE_IN_PDUMP_SAVEMEM; @@ -612,11 +489,7 @@ typedef struct PVRSRV_BRIDGE_IN_PDUMP_SAVEMEM typedef struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_RENDER_CONTEXT_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_CPU_VIRTADDR pHWRenderContextCpuVAddr; IMG_UINT32 ui32HWRenderContextSize; IMG_UINT32 ui32OffsetToPDDevPAddr; @@ -626,11 +499,7 @@ typedef struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_RENDER_CONTEXT_TAG typedef struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hHWRenderContext; -#else IMG_HANDLE hHWRenderContext; -#endif IMG_DEV_VIRTADDR sHWRenderContextDevVAddr; }PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_RENDER_CONTEXT; @@ -638,23 +507,14 @@ typedef struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ IMG_BOOL bForceCleanup; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hHWRenderContext; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hHWRenderContext; -#endif }PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_RENDER_CONTEXT; typedef struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_CPU_VIRTADDR pHWTransferContextCpuVAddr; IMG_UINT32 ui32HWTransferContextSize; IMG_UINT32 ui32OffsetToPDDevPAddr; @@ -664,11 +524,7 @@ typedef struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_TRANSFER_CONTEXT_TAG typedef struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hHWTransferContext; -#else IMG_HANDLE hHWTransferContext; -#endif IMG_DEV_VIRTADDR sHWTransferContextDevVAddr; }PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_TRANSFER_CONTEXT; @@ -676,23 +532,14 @@ typedef struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ IMG_BOOL bForceCleanup; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hHWTransferContext; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hHWTransferContext; -#endif }PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_TRANSFER_CONTEXT; typedef struct PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_DEV_VIRTADDR sHWRTDataSetDevVAddr; }PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET; @@ -704,11 +551,7 @@ typedef struct PVRSRV_BRIDGE_IN_SGX_FLUSH_HW_RENDER_TARGET_TAG typedef struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_2D_CONTEXT_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_CPU_VIRTADDR pHW2DContextCpuVAddr; IMG_UINT32 ui32HW2DContextSize; IMG_UINT32 ui32OffsetToPDDevPAddr; @@ -718,11 +561,7 @@ typedef struct PVRSRV_BRIDGE_IN_SGX_REGISTER_HW_2D_CONTEXT_TAG typedef struct PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_2D_CONTEXT_TAG { PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hHW2DContext; -#else IMG_HANDLE hHW2DContext; -#endif IMG_DEV_VIRTADDR sHW2DContextDevVAddr; }PVRSRV_BRIDGE_OUT_SGX_REGISTER_HW_2D_CONTEXT; @@ -730,13 +569,8 @@ typedef struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_2D_CONTEXT_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ IMG_BOOL bForceCleanup; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; - IMG_SID hHW2DContext; -#else IMG_HANDLE hDevCookie; IMG_HANDLE hHW2DContext; -#endif }PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_2D_CONTEXT; #define SGX2D_MAX_BLT_CMD_SIZ 256 /* Maximum size of a blit command, in bytes */ @@ -750,11 +584,7 @@ typedef struct PVRSRV_BRIDGE_IN_SGX_UNREGISTER_HW_2D_CONTEXT_TAG typedef struct PVRSRV_BRIDGE_IN_SGX_READ_HWPERF_CB_TAG { IMG_UINT32 ui32BridgeFlags; /* Must be first member of structure */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevCookie; -#else IMG_HANDLE hDevCookie; -#endif IMG_UINT32 ui32ArraySize; PVRSRV_SGX_HWPERF_CB_ENTRY *psHWPerfCBData; } PVRSRV_BRIDGE_IN_SGX_READ_HWPERF_CB; diff --git a/jacinto6/sgx_src/eurasia_km/services4/include/sgx_mkif_km.h b/jacinto6/sgx_src/eurasia_km/services4/include/sgx_mkif_km.h index 265440a..baab80d 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/include/sgx_mkif_km.h +++ b/jacinto6/sgx_src/eurasia_km/services4/include/sgx_mkif_km.h @@ -139,10 +139,6 @@ typedef struct _SGXMKIF_HOST_CTL_ IMG_UINT32 ui32PerfGroup; /*!< Specifies the HW's active group */ #endif /* SGX_FEATURE_EXTENDED_PERF_COUNTERS */ -#if defined(FIX_HW_BRN_31939) - IMG_UINT32 ui32BRN31939Mem; -#endif - IMG_UINT32 ui32OpenCLDelayCount; /* Counter to keep track OpenCL task completion time in units of regular task time out events */ IMG_UINT32 ui32InterruptCount; } SGXMKIF_HOST_CTL; @@ -269,6 +265,9 @@ typedef struct _SGXMKIF_2DCMD_SHARED_ { /* need to be able to check reads and writes on 2D ops, and update writes */ PVRSRV_DEVICE_SYNC_OBJECT s3DSyncData; + + IMG_UINT32 ui32NumStatusVals; + CTL_STATUS sCtlStatusInfo[SGXTQ_MAX_STATUS]; } SGXMKIF_2DCMD_SHARED, *PSGXMKIF_2DCMD_SHARED; #endif /* SGX_FEATURE_2D_HARDWARE */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/include/sgx_ukernel_status_codes.h b/jacinto6/sgx_src/eurasia_km/services4/include/sgx_ukernel_status_codes.h index dc8f2f3..e8c1626 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/include/sgx_ukernel_status_codes.h +++ b/jacinto6/sgx_src/eurasia_km/services4/include/sgx_ukernel_status_codes.h @@ -239,6 +239,14 @@ MKTC_ST(MKTC_KICKTA_TACMD_DEBUG) MKTC_ST(MKTC_KICKTA_FREECONTEXT) #define MKTC_KICKTA_PIM_PATCHING 0xAD00080C MKTC_ST(MKTC_KICKTA_PIM_PATCHING) +#define MKTC_KICKTA_TPC_CHECK_START 0xAD00080D +MKTC_ST(MKTC_KICKTA_TPC_CHECK_START) +#define MKTC_KICKTA_TPC_CHECK_END 0xAD00080E +MKTC_ST(MKTC_KICKTA_TPC_CHECK_END) +#define MKTC_KICKTA_TPC_CHECK_CORE 0xAD00080F +MKTC_ST(MKTC_KICKTA_TPC_CHECK_CORE) +#define MKTC_KICKTA_TPC_CHECK_FAIL 0xAD000810 +MKTC_ST(MKTC_KICKTA_TPC_CHECK_FAIL) #define MKTC_KICKTA_CHKPT_START_DUMMY_CS 0xAD0008A1 MKTC_ST(MKTC_KICKTA_CHKPT_START_DUMMY_CS) @@ -397,6 +405,7 @@ MKTC_ST(MKTC_FINDTA_SRC_WRITEOPSBLOCKED) #define MKTC_FINDTA_READOPS2BLOCKED 0xAD000E0F MKTC_ST(MKTC_FINDTA_READOPS2BLOCKED) + #define MKTC_CTRL_SRCREADOPSBLOCKED 0xAD000F00 MKTC_ST(MKTC_CTRL_SRCREADOPSBLOCKED) #define MKTC_CTRL_SRCWRITEOPSBLOCKED 0xAD000F01 @@ -517,6 +526,10 @@ MKTC_ST(MKTC_OOM_SPM_DEADLOCK_MEM_ADDED) MKTC_ST(MKTC_RESET) #define MKTC_SPM_INVALID_ZLSCONFIG 0xAD001226 MKTC_ST(MKTC_SPM_INVALID_ZLSCONFIG) +#define MKTC_SPM_DEADLOCK_RENDER_FINISHED 0xAD001227 +MKTC_ST(MKTC_SPM_DEADLOCK_RENDER_FINISHED) +#define MKTC_OOM_BLOCKEDRTDATA 0xAD001228 +MKTC_ST(MKTC_OOM_BLOCKEDRTDATA) #define MKTC_OOM_TYPE_MT 0xAD00122A MKTC_ST(MKTC_OOM_TYPE_MT) @@ -659,7 +672,7 @@ MKTC_ST(MKTC_TAFINISHED_TERM_COMPLETE_START) #define MKTC_TAFINISHED_TERM_COMPLETE_END 0xAD001711 MKTC_ST(MKTC_TAFINISHED_TERM_COMPLETE_END) -#define MKTC_TAFINISHED_DPMPAGERECYCLING 0xAD001720 +#define MKTC_TAFINISHED_DPMPAGERECYCLING 0xAD001720 MKTC_ST(MKTC_TAFINISHED_DPMPAGERECYCLING) #define MKTC_2DEVENT_2DCOMPLETE 0xAD001800 @@ -712,11 +725,21 @@ MKTC_ST(MKTC_FIND2D_ADDR_SPACE_DIFFERENT) MKTC_ST(MKTC_FTD_3DOPSBLOCKED) #define MKTC_FTD_DSTREADOPS2BLOCKED 0xAD001818 MKTC_ST(MKTC_FTD_DSTREADOPS2BLOCKED) +#define MKTC_U2DSO_UPDATESTATUSVALS 0xAD001819 +MKTC_ST(MKTC_U2DSO_UPDATESTATUSVALS) +#define MKTC_U2DSO_UPDATESTATUSVALS_DONE 0xAD00181A +MKTC_ST(MKTC_U2DSO_UPDATESTATUSVALS_DONE) #define MKTC_FCM_START 0xAD001900 MKTC_ST(MKTC_FCM_START) #define MKTC_FCM_END 0xAD001901 MKTC_ST(MKTC_FCM_END) +#define MKTC_FCM_PB_SAME 0xAD001902 +MKTC_ST(MKTC_FCM_PB_SAME) +#define MKTC_FCM_TQ_IN_PROGESS 0xAD001903 +MKTC_ST(MKTC_FCM_TQ_IN_PROGESS) +#define MKTC_FCM_TQ_MEMCONTEXT_DIFFERENT 0xAD001904 +MKTC_ST(MKTC_FCM_TQ_MEMCONTEXT_DIFFERENT) #define MKTC_TIMER_ACTIVE_POWER 0xAD001A00 MKTC_ST(MKTC_TIMER_ACTIVE_POWER) @@ -781,6 +804,10 @@ MKTC_ST(MKTC_RTA_CHECK_NEXT_SA_PROG) MKTC_ST(MKTC_RTA_CORE_COMPLETED) #define MKTC_RTA_DEBUG_SAS 0xAD001F07 MKTC_ST(MKTC_RTA_DEBUG_SAS) +#define MKTC_RTA_MTE_STATE_RESTORE_TASK 0xAD001F08 +MKTC_ST(MKTC_RTA_MTE_STATE_RESTORE_TASK) +#define MKTC_RTA_SA_STATE_RESTORE_TASK 0xAD001F09 +MKTC_ST(MKTC_RTA_SA_STATE_RESTORE_TASK) #define MKTC_RESUMETA_END 0xAD001F0F MKTC_ST(MKTC_RESUMETA_END) diff --git a/jacinto6/sgx_src/eurasia_km/services4/include/sgxinfo.h b/jacinto6/sgx_src/eurasia_km/services4/include/sgxinfo.h index 3f888cb..7ffdbc7 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/include/sgxinfo.h +++ b/jacinto6/sgx_src/eurasia_km/services4/include/sgxinfo.h @@ -45,9 +45,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "sgxscript.h" #include "servicesint.h" #include "services.h" -#if !defined (SUPPORT_SID_INTERFACE) #include "sgxapi_km.h" -#endif #include "sgx_mkif_km.h" @@ -84,17 +82,6 @@ typedef enum _SGXMKIF_CMD_TYPE_ typedef struct _SGX_BRIDGE_INIT_INFO_ { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelCCBMemInfo; - IMG_SID hKernelCCBCtlMemInfo; - IMG_SID hKernelCCBEventKickerMemInfo; - IMG_SID hKernelSGXHostCtlMemInfo; - IMG_SID hKernelSGXTA3DCtlMemInfo; -#if defined(FIX_HW_BRN_31272) || defined(FIX_HW_BRN_31780) || defined(FIX_HW_BRN_33920) - IMG_SID hKernelSGXPTLAWriteBackMemInfo; -#endif - IMG_SID hKernelSGXMiscMemInfo; -#else IMG_HANDLE hKernelCCBMemInfo; IMG_HANDLE hKernelCCBCtlMemInfo; IMG_HANDLE hKernelCCBEventKickerMemInfo; @@ -104,7 +91,6 @@ typedef struct _SGX_BRIDGE_INIT_INFO_ IMG_HANDLE hKernelSGXPTLAWriteBackMemInfo; #endif IMG_HANDLE hKernelSGXMiscMemInfo; -#endif IMG_UINT32 aui32HostKickAddr[SGXMKIF_CMD_MAX]; @@ -114,53 +100,16 @@ typedef struct _SGX_BRIDGE_INIT_INFO_ SGX_MISCINFO_STRUCT_SIZES sSGXStructSizes; #if defined(SGX_SUPPORT_HWPROFILING) -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelHWProfilingMemInfo; -#else IMG_HANDLE hKernelHWProfilingMemInfo; #endif -#endif #if defined(SUPPORT_SGX_HWPERF) -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelHWPerfCBMemInfo; -#else IMG_HANDLE hKernelHWPerfCBMemInfo; #endif -#endif -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelTASigBufferMemInfo; - IMG_SID hKernel3DSigBufferMemInfo; -#else IMG_HANDLE hKernelTASigBufferMemInfo; IMG_HANDLE hKernel3DSigBufferMemInfo; -#endif -#if defined(FIX_HW_BRN_29702) -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelCFIMemInfo; -#else - IMG_HANDLE hKernelCFIMemInfo; -#endif -#endif -#if defined(FIX_HW_BRN_29823) -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelDummyTermStreamMemInfo; -#else - IMG_HANDLE hKernelDummyTermStreamMemInfo; -#endif -#endif #if defined(FIX_HW_BRN_31542) || defined(FIX_HW_BRN_36513) -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelClearClipWAVDMStreamMemInfo; - IMG_SID hKernelClearClipWAIndexStreamMemInfo; - IMG_SID hKernelClearClipWAPDSMemInfo; - IMG_SID hKernelClearClipWAUSEMemInfo; - IMG_SID hKernelClearClipWAParamMemInfo; - IMG_SID hKernelClearClipWAPMPTMemInfo; - IMG_SID hKernelClearClipWATPCMemInfo; - IMG_SID hKernelClearClipWAPSGRgnHdrMemInfo; -#else IMG_HANDLE hKernelClearClipWAVDMStreamMemInfo; IMG_HANDLE hKernelClearClipWAIndexStreamMemInfo; IMG_HANDLE hKernelClearClipWAPDSMemInfo; @@ -170,19 +119,14 @@ typedef struct _SGX_BRIDGE_INIT_INFO_ IMG_HANDLE hKernelClearClipWATPCMemInfo; IMG_HANDLE hKernelClearClipWAPSGRgnHdrMemInfo; #endif -#endif #if defined(SGX_FEATURE_VDM_CONTEXT_SWITCH) && \ defined(FIX_HW_BRN_33657) && defined(SUPPORT_SECURE_33657_FIX) IMG_HANDLE hKernelVDMStateUpdateBufferMemInfo; #endif #if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelEDMStatusBufferMemInfo; -#else IMG_HANDLE hKernelEDMStatusBufferMemInfo; #endif -#endif IMG_UINT32 ui32EDMTaskReg0; IMG_UINT32 ui32EDMTaskReg1; @@ -201,11 +145,7 @@ typedef struct _SGX_BRIDGE_INIT_INFO_ IMG_UINT32 ui32CacheControl; IMG_UINT32 asInitDevData[SGX_MAX_DEV_DATA]; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID asInitMemHandles[SGX_MAX_INIT_MEM_HANDLES]; -#else IMG_HANDLE asInitMemHandles[SGX_MAX_INIT_MEM_HANDLES]; -#endif } SGX_BRIDGE_INIT_INFO; @@ -214,11 +154,7 @@ typedef struct _SGX_DEVICE_SYNC_LIST_ { PSGXMKIF_HWDEVICE_SYNC_LIST psHWDeviceSyncList; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelHWSyncListMemInfo; -#else IMG_HANDLE hKernelHWSyncListMemInfo; -#endif PVRSRV_CLIENT_MEM_INFO *psHWDeviceSyncListClientMemInfo; PVRSRV_CLIENT_MEM_INFO *psAccessResourceClientMemInfo; @@ -228,47 +164,27 @@ typedef struct _SGX_DEVICE_SYNC_LIST_ /* Must be the last variable in the structure */ IMG_UINT32 ui32NumSyncObjects; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID ahSyncHandles[1]; -#else IMG_HANDLE ahSyncHandles[1]; -#endif } SGX_DEVICE_SYNC_LIST, *PSGX_DEVICE_SYNC_LIST; typedef struct _SGX_INTERNEL_STATUS_UPDATE_ { CTL_STATUS sCtlStatus; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else IMG_HANDLE hKernelMemInfo; -#endif } SGX_INTERNEL_STATUS_UPDATE; typedef struct _SGX_CCB_KICK_ { SGXMKIF_COMMAND sCommand; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hCCBKernelMemInfo; -#else IMG_HANDLE hCCBKernelMemInfo; -#endif IMG_UINT32 ui32NumDstSyncObjects; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelHWSyncListMemInfo; -#else IMG_HANDLE hKernelHWSyncListMemInfo; -#endif /* DST syncs */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID *pahDstSyncHandles; -#else IMG_HANDLE *pahDstSyncHandles; -#endif IMG_UINT32 ui32NumTAStatusVals; IMG_UINT32 ui32Num3DStatusVals; @@ -277,14 +193,9 @@ typedef struct _SGX_CCB_KICK_ SGX_INTERNEL_STATUS_UPDATE asTAStatusUpdate[SGX_MAX_TA_STATUS_VALS]; SGX_INTERNEL_STATUS_UPDATE as3DStatusUpdate[SGX_MAX_3D_STATUS_VALS]; #else -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID ahTAStatusSyncInfo[SGX_MAX_TA_STATUS_VALS]; - IMG_SID ah3DStatusSyncInfo[SGX_MAX_3D_STATUS_VALS]; -#else IMG_HANDLE ahTAStatusSyncInfo[SGX_MAX_TA_STATUS_VALS]; IMG_HANDLE ah3DStatusSyncInfo[SGX_MAX_3D_STATUS_VALS]; #endif -#endif IMG_BOOL bFirstKickOrResume; #if defined(NO_HARDWARE) || defined(PDUMP) @@ -298,46 +209,23 @@ typedef struct _SGX_CCB_KICK_ #if defined(SUPPORT_SGX_GENERALISED_SYNCOBJECTS) /* SRC and DST syncs */ IMG_UINT32 ui32NumTASrcSyncs; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID ahTASrcKernelSyncInfo[SGX_MAX_TA_SRC_SYNCS]; -#else IMG_HANDLE ahTASrcKernelSyncInfo[SGX_MAX_TA_SRC_SYNCS]; -#endif IMG_UINT32 ui32NumTADstSyncs; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID ahTADstKernelSyncInfo[SGX_MAX_TA_DST_SYNCS]; -#else IMG_HANDLE ahTADstKernelSyncInfo[SGX_MAX_TA_DST_SYNCS]; -#endif IMG_UINT32 ui32Num3DSrcSyncs; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID ah3DSrcKernelSyncInfo[SGX_MAX_3D_SRC_SYNCS]; -#else IMG_HANDLE ah3DSrcKernelSyncInfo[SGX_MAX_3D_SRC_SYNCS]; -#endif #else /* SRC syncs */ IMG_UINT32 ui32NumSrcSyncs; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID ahSrcKernelSyncInfo[SGX_MAX_SRC_SYNCS_TA]; -#else IMG_HANDLE ahSrcKernelSyncInfo[SGX_MAX_SRC_SYNCS_TA]; #endif -#endif /* TA/3D dependency data */ IMG_BOOL bTADependency; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hTA3DSyncInfo; - - IMG_SID hTASyncInfo; - IMG_SID h3DSyncInfo; -#else IMG_HANDLE hTA3DSyncInfo; IMG_HANDLE hTASyncInfo; IMG_HANDLE h3DSyncInfo; -#endif #if defined(PDUMP) IMG_UINT32 ui32CCBDumpWOff; #endif @@ -345,6 +233,12 @@ typedef struct _SGX_CCB_KICK_ IMG_UINT32 ui32WriteOpsPendingVal; #endif IMG_HANDLE hDevMemContext; + IMG_DEV_VIRTADDR sHWRTDataSetDevAddr; + IMG_DEV_VIRTADDR sHWRTDataDevAddr; + IMG_UINT32 ui32FrameNum; +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) + IMG_BOOL bIsFirstKick; +#endif } SGX_CCB_KICK; @@ -376,11 +270,7 @@ typedef struct _SGX_CLIENT_INFO_ typedef struct _SGX_INTERNAL_DEVINFO_ { IMG_UINT32 ui32Flags; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hHostCtlKernelMemInfoHandle; -#else IMG_HANDLE hHostCtlKernelMemInfoHandle; -#endif IMG_BOOL bForcePTOff; } SGX_INTERNAL_DEVINFO; @@ -396,36 +286,19 @@ typedef struct _SGX_INTERNAL_DEVINFO_KM_ #if defined(TRANSFER_QUEUE) typedef struct _PVRSRV_TRANSFER_SGX_KICK_ { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hCCBMemInfo; -#else IMG_HANDLE hCCBMemInfo; -#endif IMG_UINT32 ui32SharedCmdCCBOffset; IMG_DEV_VIRTADDR sHWTransferContextDevVAddr; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hTASyncInfo; - IMG_SID h3DSyncInfo; -#else IMG_HANDLE hTASyncInfo; IMG_HANDLE h3DSyncInfo; -#endif IMG_UINT32 ui32NumSrcSync; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID ahSrcSyncInfo[SGX_MAX_TRANSFER_SYNC_OPS]; -#else IMG_HANDLE ahSrcSyncInfo[SGX_MAX_TRANSFER_SYNC_OPS]; -#endif IMG_UINT32 ui32NumDstSync; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID ahDstSyncInfo[SGX_MAX_TRANSFER_SYNC_OPS]; -#else IMG_HANDLE ahDstSyncInfo[SGX_MAX_TRANSFER_SYNC_OPS]; -#endif IMG_UINT32 ui32Flags; @@ -434,33 +307,21 @@ typedef struct _PVRSRV_TRANSFER_SGX_KICK_ IMG_UINT32 ui32CCBDumpWOff; #endif IMG_HANDLE hDevMemContext; +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + /* Android >JB MR1 doesn't use ahSrcSyncInfo for synchronization */ + IMG_INT iFenceFd; +#endif } PVRSRV_TRANSFER_SGX_KICK, *PPVRSRV_TRANSFER_SGX_KICK; #if defined(SGX_FEATURE_2D_HARDWARE) typedef struct _PVRSRV_2D_SGX_KICK_ { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hCCBMemInfo; -#else IMG_HANDLE hCCBMemInfo; -#endif IMG_UINT32 ui32SharedCmdCCBOffset; IMG_DEV_VIRTADDR sHW2DContextDevVAddr; IMG_UINT32 ui32NumSrcSync; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID ahSrcSyncInfo[SGX_MAX_2D_SRC_SYNC_OPS]; - - /* need to be able to check reads and writes on dest, and update writes */ - IMG_SID hDstSyncInfo; - - /* need to be able to check reads and writes on TA ops, and update writes */ - IMG_SID hTASyncInfo; - - /* need to be able to check reads and writes on 2D ops, and update writes */ - IMG_SID h3DSyncInfo; -#else IMG_HANDLE ahSrcSyncInfo[SGX_MAX_2D_SRC_SYNC_OPS]; /* need to be able to check reads and writes on dest, and update writes */ @@ -471,13 +332,16 @@ typedef struct _PVRSRV_2D_SGX_KICK_ /* need to be able to check reads and writes on 2D ops, and update writes */ IMG_HANDLE h3DSyncInfo; -#endif IMG_UINT32 ui32PDumpFlags; #if defined(PDUMP) IMG_UINT32 ui32CCBDumpWOff; #endif IMG_HANDLE hDevMemContext; +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + /* Android >JB MR1 doesn't use ahSrcSyncInfo for synchronization */ + IMG_INT iFenceFd; +#endif } PVRSRV_2D_SGX_KICK, *PPVRSRV_2D_SGX_KICK; #endif /* defined(SGX_FEATURE_2D_HARDWARE) */ #endif /* defined(TRANSFER_QUEUE) */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.c index d98a71c..2321a69 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.c @@ -80,12 +80,24 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif #include "env_data.h" +#include "ttrace.h" +#include "ttrace_tokens.h" #if defined (__linux__) || defined(__QNXNTO__) #include "mmap.h" #endif +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) +#include <linux/file.h> +#include <linux/version.h> +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)) +#include <linux/sync.h> +#else +#include <../drivers/staging/android/sync.h> +#endif +#endif + #include "srvkm.h" /* FIXME: we should include an OS specific header here to allow configuration of @@ -106,7 +118,7 @@ PVRSRV_BRIDGE_DISPATCH_TABLE_ENTRY g_BridgeDispatchTable[BRIDGE_DISPATCH_TABLE_E PVRSRV_BRIDGE_GLOBAL_STATS g_BridgeGlobalStats; #endif -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) static IMG_BOOL abSharedDeviceMemHeap[PVRSRV_MAX_CLIENT_HEAPS]; static IMG_BOOL *pbSharedDeviceMemHeap = abSharedDeviceMemHeap; #else @@ -202,9 +214,6 @@ PVRSRVCreateDeviceMemContextBW(IMG_UINT32 ui32BridgeID, IMG_HANDLE hDevMemContextInt; IMG_UINT32 i; IMG_BOOL bCreated; -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_HEAP_INFO_KM asHeapInfo[PVRSRV_MAX_CLIENT_HEAPS]; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_CREATE_DEVMEMCONTEXT); @@ -229,11 +238,7 @@ PVRSRVCreateDeviceMemContextBW(IMG_UINT32 ui32BridgeID, psPerProc, &hDevMemContextInt, &psCreateDevMemContextOUT->ui32ClientHeapCount, -#if defined (SUPPORT_SID_INTERFACE) - &asHeapInfo[0], -#else &psCreateDevMemContextOUT->sHeapInfo[0], -#endif &bCreated, pbSharedDeviceMemHeap); @@ -270,13 +275,9 @@ PVRSRVCreateDeviceMemContextBW(IMG_UINT32 ui32BridgeID, for(i = 0; i < psCreateDevMemContextOUT->ui32ClientHeapCount; i++) { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemHeapExt; -#else IMG_HANDLE hDevMemHeapExt; -#endif -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) if(abSharedDeviceMemHeap[i]) #endif { @@ -287,20 +288,12 @@ PVRSRVCreateDeviceMemContextBW(IMG_UINT32 ui32BridgeID, * driver, hence, we use shared handles for these * heaps. */ -#if defined (SUPPORT_SID_INTERFACE) - PVRSRVAllocHandleNR(psPerProc->psHandleBase, - &hDevMemHeapExt, - asHeapInfo[i].hDevMemHeap, - PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP, - PVRSRV_HANDLE_ALLOC_FLAG_SHARED); -#else PVRSRVAllocHandleNR(psPerProc->psHandleBase, &hDevMemHeapExt, psCreateDevMemContextOUT->sHeapInfo[i].hDevMemHeap, PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP, PVRSRV_HANDLE_ALLOC_FLAG_SHARED); -#endif } -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) else { /* @@ -311,31 +304,18 @@ PVRSRVCreateDeviceMemContextBW(IMG_UINT32 ui32BridgeID, */ if(bCreated) { -#if defined (SUPPORT_SID_INTERFACE) - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &hDevMemHeapExt, - asHeapInfo[i].hDevMemHeap, - PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP, - PVRSRV_HANDLE_ALLOC_FLAG_NONE, - psCreateDevMemContextOUT->hDevMemContext); -#else PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, &hDevMemHeapExt, psCreateDevMemContextOUT->sHeapInfo[i].hDevMemHeap, PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP, PVRSRV_HANDLE_ALLOC_FLAG_NONE, psCreateDevMemContextOUT->hDevMemContext); -#endif } else { psCreateDevMemContextOUT->eError = PVRSRVFindHandle(psPerProc->psHandleBase, &hDevMemHeapExt, -#if defined (SUPPORT_SID_INTERFACE) - asHeapInfo[i].hDevMemHeap, -#else psCreateDevMemContextOUT->sHeapInfo[i].hDevMemHeap, -#endif PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP); if(psCreateDevMemContextOUT->eError != PVRSRV_OK) { @@ -345,13 +325,6 @@ PVRSRVCreateDeviceMemContextBW(IMG_UINT32 ui32BridgeID, } #endif psCreateDevMemContextOUT->sHeapInfo[i].hDevMemHeap = hDevMemHeapExt; -#if defined (SUPPORT_SID_INTERFACE) - psCreateDevMemContextOUT->sHeapInfo[i].ui32HeapID = asHeapInfo[i].ui32HeapID; - psCreateDevMemContextOUT->sHeapInfo[i].sDevVAddrBase = asHeapInfo[i].sDevVAddrBase; - psCreateDevMemContextOUT->sHeapInfo[i].ui32HeapByteSize = asHeapInfo[i].ui32HeapByteSize; - psCreateDevMemContextOUT->sHeapInfo[i].ui32Attribs = asHeapInfo[i].ui32Attribs; - psCreateDevMemContextOUT->sHeapInfo[i].ui32XTileStride = asHeapInfo[i].ui32XTileStride; -#endif } COMMIT_HANDLE_BATCH_OR_ERROR(psCreateDevMemContextOUT->eError, psPerProc) @@ -420,9 +393,6 @@ PVRSRVGetDeviceMemHeapInfoBW(IMG_UINT32 ui32BridgeID, IMG_HANDLE hDevCookieInt; IMG_HANDLE hDevMemContextInt; IMG_UINT32 i; -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_HEAP_INFO_KM asHeapInfo[PVRSRV_MAX_CLIENT_HEAPS]; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_GET_DEVMEM_HEAPINFO); @@ -452,11 +422,7 @@ PVRSRVGetDeviceMemHeapInfoBW(IMG_UINT32 ui32BridgeID, PVRSRVGetDeviceMemHeapInfoKM(hDevCookieInt, hDevMemContextInt, &psGetDevMemHeapInfoOUT->ui32ClientHeapCount, -#if defined (SUPPORT_SID_INTERFACE) - &asHeapInfo[0], -#else &psGetDevMemHeapInfoOUT->sHeapInfo[0], -#endif pbSharedDeviceMemHeap); if(psGetDevMemHeapInfoOUT->eError != PVRSRV_OK) @@ -466,13 +432,9 @@ PVRSRVGetDeviceMemHeapInfoBW(IMG_UINT32 ui32BridgeID, for(i = 0; i < psGetDevMemHeapInfoOUT->ui32ClientHeapCount; i++) { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hDevMemHeapExt; -#else IMG_HANDLE hDevMemHeapExt; -#endif -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) if(abSharedDeviceMemHeap[i]) #endif { @@ -483,20 +445,12 @@ PVRSRVGetDeviceMemHeapInfoBW(IMG_UINT32 ui32BridgeID, * driver, hence, we use shared handles for these * heaps. */ -#if defined (SUPPORT_SID_INTERFACE) - PVRSRVAllocHandleNR(psPerProc->psHandleBase, - &hDevMemHeapExt, - asHeapInfo[i].hDevMemHeap, - PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP, - PVRSRV_HANDLE_ALLOC_FLAG_SHARED); -#else PVRSRVAllocHandleNR(psPerProc->psHandleBase, &hDevMemHeapExt, psGetDevMemHeapInfoOUT->sHeapInfo[i].hDevMemHeap, PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP, PVRSRV_HANDLE_ALLOC_FLAG_SHARED); -#endif } -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) else { /* @@ -508,11 +462,7 @@ PVRSRVGetDeviceMemHeapInfoBW(IMG_UINT32 ui32BridgeID, psGetDevMemHeapInfoOUT->eError = PVRSRVFindHandle(psPerProc->psHandleBase, &hDevMemHeapExt, -#if defined (SUPPORT_SID_INTERFACE) - asHeapInfo[i].hDevMemHeap, -#else psGetDevMemHeapInfoOUT->sHeapInfo[i].hDevMemHeap, -#endif PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP); if(psGetDevMemHeapInfoOUT->eError != PVRSRV_OK) { @@ -521,13 +471,6 @@ PVRSRVGetDeviceMemHeapInfoBW(IMG_UINT32 ui32BridgeID, } #endif psGetDevMemHeapInfoOUT->sHeapInfo[i].hDevMemHeap = hDevMemHeapExt; -#if defined (SUPPORT_SID_INTERFACE) - psGetDevMemHeapInfoOUT->sHeapInfo[i].ui32HeapID = asHeapInfo[i].ui32HeapID; - psGetDevMemHeapInfoOUT->sHeapInfo[i].sDevVAddrBase = asHeapInfo[i].sDevVAddrBase; - psGetDevMemHeapInfoOUT->sHeapInfo[i].ui32HeapByteSize = asHeapInfo[i].ui32HeapByteSize; - psGetDevMemHeapInfoOUT->sHeapInfo[i].ui32Attribs = asHeapInfo[i].ui32Attribs; - psGetDevMemHeapInfoOUT->sHeapInfo[i].ui32XTileStride = asHeapInfo[i].ui32XTileStride; -#endif } COMMIT_HANDLE_BATCH_OR_ERROR(psGetDevMemHeapInfoOUT->eError, psPerProc) @@ -672,8 +615,8 @@ PVRSRVAllocDeviceMemBW(IMG_UINT32 ui32BridgeID, psPerProc, hDevMemHeapInt, psAllocDeviceMemIN->ui32Attribs, - psAllocDeviceMemIN->ui32Size, - psAllocDeviceMemIN->ui32Alignment, + psAllocDeviceMemIN->uSize, + psAllocDeviceMemIN->uAlignment, psAllocDeviceMemIN->pvPrivData, psAllocDeviceMemIN->ui32PrivDataLength, psAllocDeviceMemIN->ui32ChunkSize, @@ -683,12 +626,6 @@ PVRSRVAllocDeviceMemBW(IMG_UINT32 ui32BridgeID, &psMemInfo, "" /*FIXME: add something meaningful*/); - /* Allow mapping this buffer to the GC MMU only on allocation time, if - * this buffer is mapped into another process context we don't want the - * GC MMU mapping to happen. - */ - psAllocDeviceMemIN->ui32Attribs &= ~PVRSRV_MAP_GC_MMU; - if (bUseShareMemWorkaround) { PVR_ASSERT(ui32ShareIndex != 7654321); @@ -707,8 +644,8 @@ PVRSRVAllocDeviceMemBW(IMG_UINT32 ui32BridgeID, psMemInfo->sShareMemWorkaround.ui32ShareIndex = ui32ShareIndex; psMemInfo->sShareMemWorkaround.hDevCookieInt = hDevCookieInt; psMemInfo->sShareMemWorkaround.ui32OrigReqAttribs = psAllocDeviceMemIN->ui32Attribs; - psMemInfo->sShareMemWorkaround.ui32OrigReqSize = (IMG_UINT32)psAllocDeviceMemIN->ui32Size; - psMemInfo->sShareMemWorkaround.ui32OrigReqAlignment = (IMG_UINT32)psAllocDeviceMemIN->ui32Alignment; + psMemInfo->sShareMemWorkaround.ui32OrigReqSize = (IMG_UINT32)psAllocDeviceMemIN->uSize; + psMemInfo->sShareMemWorkaround.ui32OrigReqAlignment = (IMG_UINT32)psAllocDeviceMemIN->uAlignment; } OSMemSet(&psAllocDeviceMemOUT->sClientMemInfo, @@ -726,13 +663,7 @@ PVRSRVAllocDeviceMemBW(IMG_UINT32 ui32BridgeID, psAllocDeviceMemOUT->sClientMemInfo.sDevVAddr = psMemInfo->sDevVAddr; psAllocDeviceMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags; psAllocDeviceMemOUT->sClientMemInfo.uAllocSize = psMemInfo->uAllocSize; - OSMemCopy(psAllocDeviceMemOUT->sClientMemInfo.planeOffsets, psMemInfo->planeOffsets, - sizeof(psMemInfo->planeOffsets)); -#if defined (SUPPORT_SID_INTERFACE) - /* see below */ -#else psAllocDeviceMemOUT->sClientMemInfo.hMappingInfo = psMemInfo->sMemBlk.hOSMemHandle; -#endif PVRSRVAllocHandleNR(psPerProc->psHandleBase, &psAllocDeviceMemOUT->sClientMemInfo.hKernelMemInfo, @@ -740,23 +671,6 @@ PVRSRVAllocDeviceMemBW(IMG_UINT32 ui32BridgeID, PVRSRV_HANDLE_TYPE_MEM_INFO, PVRSRV_HANDLE_ALLOC_FLAG_NONE); -#if defined (SUPPORT_SID_INTERFACE) - PVR_ASSERT(psAllocDeviceMemOUT->sClientMemInfo.hKernelMemInfo != 0); - - if (psMemInfo->sMemBlk.hOSMemHandle != IMG_NULL) - { - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &psAllocDeviceMemOUT->sClientMemInfo.hMappingInfo, - psMemInfo->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_MEM_INFO, - PVRSRV_HANDLE_ALLOC_FLAG_NONE, - psAllocDeviceMemOUT->sClientMemInfo.hKernelMemInfo); - } - else - { - psAllocDeviceMemOUT->sClientMemInfo.hMappingInfo = 0; - } -#endif if(psAllocDeviceMemIN->ui32Attribs & PVRSRV_MEM_NO_SYNCOBJ) { @@ -780,25 +694,9 @@ PVRSRVAllocDeviceMemBW(IMG_UINT32 ui32BridgeID, psAllocDeviceMemOUT->sClientSyncInfo.sReadOps2CompleteDevVAddr = psMemInfo->psKernelSyncInfo->sReadOps2CompleteDevVAddr; -#if defined (SUPPORT_SID_INTERFACE) - if (psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle != IMG_NULL) - { - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &psAllocDeviceMemOUT->sClientSyncInfo.hMappingInfo, - psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_SYNC_INFO, - PVRSRV_HANDLE_ALLOC_FLAG_NONE, - psAllocDeviceMemOUT->sClientMemInfo.hKernelMemInfo); - } - else - { - psAllocDeviceMemOUT->sClientSyncInfo.hMappingInfo = 0; - } -#else psAllocDeviceMemOUT->sClientSyncInfo.hMappingInfo = psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle; #endif -#endif PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, &psAllocDeviceMemOUT->sClientSyncInfo.hKernelSyncInfo, @@ -842,11 +740,7 @@ PVRSRVFreeDeviceMemBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &pvKernelMemInfo, -#if defined (SUPPORT_SID_INTERFACE) - psFreeDeviceMemIN->hKernelMemInfo, -#else psFreeDeviceMemIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); if(psRetOUT->eError != PVRSRV_OK) @@ -863,11 +757,7 @@ PVRSRVFreeDeviceMemBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - psFreeDeviceMemIN->hKernelMemInfo, -#else psFreeDeviceMemIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); return 0; @@ -875,228 +765,13 @@ PVRSRVFreeDeviceMemBW(IMG_UINT32 ui32BridgeID, static IMG_INT -PVRSRVMultiManageDevMemBW(IMG_UINT32 ui32BridgeID, - PVRSRV_BRIDGE_IN_MULTI_MANAGE_DEV_MEM *psMultiMemDevRequestIN, - PVRSRV_BRIDGE_OUT_MULTI_MANAGE_DEV_MEM *psMultiMemDevRequestOUT, - PVRSRV_PER_PROCESS_DATA *psPerProc) -{ - IMG_HANDLE hDevCookieInt; - PVRSRV_KERNEL_MEM_INFO *psSharedBuffKernelMemInfo = NULL; - PVRSRV_MANAGE_DEV_MEM_REQUEST* pRequestsArray; - PVRSRV_MANAGE_DEV_MEM_RESPONSE* pResponseArray; - IMG_UINT32 reqNum; - - PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_MULTI_MANAGE_DEV_MEM); - - psMultiMemDevRequestOUT->eError = - PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt, - psMultiMemDevRequestIN->hDevCookie, - PVRSRV_HANDLE_TYPE_DEV_NODE); - - if(psMultiMemDevRequestOUT->eError != PVRSRV_OK) - { - PVR_DPF((PVR_DBG_ERROR,"%s: invalid hDevCookie", __FUNCTION__)); - return 0; - } - - if(psMultiMemDevRequestIN->hKernelMemInfo) - { - PVRSRV_MULTI_MANAGE_DEV_MEM_REQUESTS* psMultiMemDevRequest; - psMultiMemDevRequestOUT->eError = - PVRSRVLookupHandle(psPerProc->psHandleBase, - (IMG_VOID **)&psSharedBuffKernelMemInfo, - #if defined (SUPPORT_SID_INTERFACE) - psMultiMemDevRequestIN->hKernelMemInfo, - #else - psMultiMemDevRequestIN->hKernelMemInfo, - #endif - PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO); - - if(psMultiMemDevRequestOUT->eError != PVRSRV_OK) - { - PVR_DPF((PVR_DBG_ERROR,"%s: invalid shared memory hKernelMemInfo", __FUNCTION__)); - return 0; - } - - psMultiMemDevRequest = (PVRSRV_MULTI_MANAGE_DEV_MEM_REQUESTS*)psSharedBuffKernelMemInfo->pvLinAddrKM; - if( (psMultiMemDevRequest->psSharedMemClientMemInfo != psMultiMemDevRequestIN->psSharedMemClientMemInfo ) || - (psMultiMemDevRequest->ui32MaxNumberOfRequests != psMultiMemDevRequestIN->ui32MaxNumberOfRequests) || - psMultiMemDevRequest->ui32NumberOfValidRequests != psMultiMemDevRequestIN->ui32NumberOfValidRequests || - psMultiMemDevRequest->ui32CtrlFlags != psMultiMemDevRequestIN->ui32CtrlFlags) - { - psMultiMemDevRequestOUT->eError = PVRSRV_ERROR_BAD_MAPPING; - return 0; - } - pRequestsArray = psMultiMemDevRequest->sMemRequests; - pResponseArray = psMultiMemDevRequest->sMemRequests; - } - else - { - pRequestsArray = psMultiMemDevRequestIN->sMemRequests; - pResponseArray = psMultiMemDevRequestOUT->sMemResponse; - } - - PVR_DPF((PVR_DBG_MESSAGE, "\n%s: %s %d Number of request/s, Control flag = 0x%08x\n", - __FUNCTION__, - (psMultiMemDevRequestIN->hKernelMemInfo ? "Shared" : "Direct"), - psMultiMemDevRequestIN->ui32NumberOfValidRequests, - psMultiMemDevRequestIN->ui32CtrlFlags)); - - for(reqNum = 0; reqNum < psMultiMemDevRequestIN->ui32NumberOfValidRequests; reqNum++) - { - PVRSRV_MANAGE_DEV_MEM_REQUEST *pRequest = &pRequestsArray[reqNum]; - PVRSRV_MANAGE_DEV_MEM_REQUEST *pResponse = &pResponseArray[reqNum]; - PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo = NULL; - - /* At the kernel size, psClientMemInfo only works as a verification token */ - if(psMultiMemDevRequestIN->hKernelMemInfo == NULL) - { - pResponse->psClientMemInfo = pRequest->psClientMemInfo; - pResponse->eReqType = pRequest->eReqType; - } - - PVR_DPF((PVR_DBG_MESSAGE, "%s: Request %d for ClientMemInfo %p\n" - "DevVirtAddr 0x%08x, GpuRefCount %d " - "CpuVirtAddr %p, CpuRefCount %d, Kernel Handle %p, sync %p\n" - "Size %d, Attrib 0x%08x, Align %d, Subsystem 0x%llx, Hints 0x%08x " - "transfer slot %d\n", - __FUNCTION__, pResponse->eReqType, - pRequest->psClientMemInfo, - pRequest->sDevVAddr.uiAddr, - pRequest->ui32GpuMapRefCount, - pRequest->pvLinAddr, - pRequest->ui32CpuMapRefCount, - pRequest->hKernelMemInfo, - pRequest->hKernelSyncInfo, - pRequest->uSize, - pRequest->ui32Attribs, - pRequest->uAlignment, - pRequest->uiSubSystem, - pRequest->ui32Hints, - pRequest->ui32TransferFromToReqSlotIndx)); - - pResponse->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, - (IMG_PVOID *)&psKernelMemInfo, - #if defined (SUPPORT_SID_INTERFACE) - pRequest->hKernelMemInfo, - #else - pRequest->hKernelMemInfo, - #endif - PVRSRV_HANDLE_TYPE_MEM_INFO); - if(pResponse->eError != PVRSRV_OK) - { - PVR_DPF((PVR_DBG_ERROR,"%s: invalid hKernelMemInfo for slot %d", - __FUNCTION__, reqNum)); - continue; - } - - PVR_DPF((PVR_DBG_MESSAGE, "%s: KernelMemInfo %p -%s SHARED\n" - "DevVirtAddr 0x%08x, RefCount %d " - "Size %d, Flags 0x%08x, OrigAlign %d, Subsystem 0x%llx, Hints 0x%08x\n", - __FUNCTION__, psKernelMemInfo, - (psKernelMemInfo->sShareMemWorkaround.bInUse ? "" : "NOT"), - psKernelMemInfo->sDevVAddr.uiAddr, - psKernelMemInfo->ui32RefCount, - psKernelMemInfo->uAllocSize, - psKernelMemInfo->ui32Flags, - psKernelMemInfo->sShareMemWorkaround.ui32OrigReqAlignment, - (IMG_UINT64)0, 0)); - - if(psKernelMemInfo->sDevVAddr.uiAddr != pRequest->sDevVAddr.uiAddr) - { - PVR_DPF((PVR_DBG_WARNING, "%s: Kernel and Client MemInfo's " - "virtual addresses are not equal\n" - "Kernel DevVirtAddr 0x%08x != Client DevVirtAddr 0x%08x", - __FUNCTION__, - psKernelMemInfo->sDevVAddr.uiAddr, pRequest->sDevVAddr.uiAddr)); - } - - switch(pResponse->eReqType) - { - case PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_MAP: - case PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_LOCK_MAP: - { - IMG_INT32 result = PVRSRVRemapToDevKM(hDevCookieInt, - psKernelMemInfo, &pResponse->sDevVAddr); - - if(result < 0) - { - pResponse->eError = -result; - PVR_DPF((PVR_DBG_ERROR, "Request for GPU Virtual " - "memory mapping had failed " - "with error %d", - pResponse->eError)); - } - else - { - pResponse->ui32GpuMapRefCount = result; - pResponse->eError = PVRSRV_OK; - } - } - break; - case PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_SWAP_MAP_TO_NEXT: - pResponse->eError = PVRSRV_OK; - pResponse->ui32GpuMapRefCount = 1; - pResponse->sDevVAddr = psKernelMemInfo->sDevVAddr; - break; - case PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_UNMAP: - case PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_UNLOCK_MAP: - { - IMG_INT32 result = PVRSRVUnmapFromDevKM(hDevCookieInt, psKernelMemInfo); - if(result < 0) - { - pResponse->eError = -result; - PVR_DPF((PVR_DBG_ERROR, "Request for GPU Virtual memory " - "un-mapping had failed " - "with error %d", - pResponse->eError)); - } - else - { - pResponse->ui32GpuMapRefCount = result; - pResponse->eError = PVRSRV_OK; - } - pResponse->sDevVAddr = psKernelMemInfo->sDevVAddr; - } - break; - case PVRSRV_MULTI_MANAGE_DEV_MEM_RQST_SWAP_MAP_FROM_PREV: - pResponse->eError = PVRSRV_OK; - pResponse->ui32GpuMapRefCount = 1; - pResponse->sDevVAddr = psKernelMemInfo->sDevVAddr; - break; - default: - pResponse->eError = PVRSRV_ERROR_INVALID_PARAMS; - break; - } - - PVR_DPF((PVR_DBG_MESSAGE, "%s: RETURN: ClientMemInfo %p " - "DevVirtAddr 0x%08x, GpuMapRefCount %d, err %d\n", - __FUNCTION__, pRequest->psClientMemInfo, - pResponse->sDevVAddr.uiAddr, - pResponse->ui32GpuMapRefCount, - pResponse->eError)); - } - - if(psMultiMemDevRequestIN->hKernelMemInfo == NULL) - psMultiMemDevRequestOUT->ui32CtrlFlags = psMultiMemDevRequestIN->ui32CtrlFlags; - /* No status implemented yet */ - psMultiMemDevRequestOUT->ui32StatusFlags = 0; - - return 0; -} - -static IMG_INT PVRSRVExportDeviceMemBW(IMG_UINT32 ui32BridgeID, PVRSRV_BRIDGE_IN_EXPORTDEVICEMEM *psExportDeviceMemIN, PVRSRV_BRIDGE_OUT_EXPORTDEVICEMEM *psExportDeviceMemOUT, PVRSRV_PER_PROCESS_DATA *psPerProc) { IMG_HANDLE hDevCookieInt; -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo = IMG_NULL; -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; -#endif PVR_ASSERT(ui32BridgeID == PVRSRV_GET_BRIDGE_ID(PVRSRV_BRIDGE_EXPORT_DEVICEMEM) || ui32BridgeID == PVRSRV_GET_BRIDGE_ID(PVRSRV_BRIDGE_EXPORT_DEVICEMEM_2)); @@ -1119,11 +794,7 @@ PVRSRVExportDeviceMemBW(IMG_UINT32 ui32BridgeID, psExportDeviceMemOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, (IMG_PVOID *)&psKernelMemInfo, -#if defined (SUPPORT_SID_INTERFACE) - psExportDeviceMemIN->hKernelMemInfo, -#else psExportDeviceMemIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); if(psExportDeviceMemOUT->eError != PVRSRV_OK) @@ -1205,19 +876,6 @@ PVRSRVMapDeviceMemoryBW(IMG_UINT32 ui32BridgeID, { PVR_DPF((PVR_DBG_MESSAGE, "using the mem wrap workaround.")); - /* Check the XPROC mapping count -if it is "0", - * then the object is about to go away - do not allow mapping */ - if(BM_XProcGetShareDataRefCount(psSrcKernelMemInfo->sShareMemWorkaround.ui32ShareIndex) < 1) - { - psMapDevMemOUT->eError = PVRSRV_ERROR_MAPPING_NOT_FOUND; - PVR_DPF((PVR_DBG_WARNING, "%s: Can't map buffer with slot %d, size %d " - "and refcount %d\n\t Invalid XPROC refcount of %d", - __FUNCTION__, psSrcKernelMemInfo->sShareMemWorkaround.ui32ShareIndex, - psSrcKernelMemInfo->uAllocSize, psSrcKernelMemInfo->ui32RefCount, - BM_XProcGetShareDataRefCount(psSrcKernelMemInfo->sShareMemWorkaround.ui32ShareIndex))); - return 0; - } - /* Ensure we get the same ID for this allocation, such that it inherits the same physical block. Rather than add a lot of plumbing to several APIs, we call into buffer manager directly @@ -1294,13 +952,7 @@ PVRSRVMapDeviceMemoryBW(IMG_UINT32 ui32BridgeID, psMapDevMemOUT->sDstClientMemInfo.sDevVAddr = psDstKernelMemInfo->sDevVAddr; psMapDevMemOUT->sDstClientMemInfo.ui32Flags = psDstKernelMemInfo->ui32Flags; psMapDevMemOUT->sDstClientMemInfo.uAllocSize = psDstKernelMemInfo->uAllocSize; - OSMemCopy(psMapDevMemOUT->sDstClientMemInfo.planeOffsets, psDstKernelMemInfo->planeOffsets, - sizeof(psDstKernelMemInfo->planeOffsets)); -#if defined (SUPPORT_SID_INTERFACE) - /* see below */ -#else psMapDevMemOUT->sDstClientMemInfo.hMappingInfo = psDstKernelMemInfo->sMemBlk.hOSMemHandle; -#endif /* allocate handle to the DST kernel meminfo */ PVRSRVAllocHandleNR(psPerProc->psHandleBase, @@ -1310,22 +962,6 @@ PVRSRVMapDeviceMemoryBW(IMG_UINT32 ui32BridgeID, PVRSRV_HANDLE_ALLOC_FLAG_NONE); psMapDevMemOUT->sDstClientSyncInfo.hKernelSyncInfo = IMG_NULL; -#if defined (SUPPORT_SID_INTERFACE) - /* alloc subhandle for the mapping info */ - if (psDstKernelMemInfo->sMemBlk.hOSMemHandle != IMG_NULL) - { - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &psMapDevMemOUT->sDstClientMemInfo.hMappingInfo, - psDstKernelMemInfo->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_MEM_INFO, - PVRSRV_HANDLE_ALLOC_FLAG_NONE, - psMapDevMemOUT->sDstClientMemInfo.hKernelMemInfo); - } - else - { - psMapDevMemOUT->sDstClientMemInfo.hMappingInfo = 0; - } -#endif /* and setup the sync info */ if(psDstKernelMemInfo->psKernelSyncInfo) @@ -1340,26 +976,9 @@ PVRSRVMapDeviceMemoryBW(IMG_UINT32 ui32BridgeID, psMapDevMemOUT->sDstClientSyncInfo.sReadOps2CompleteDevVAddr = psDstKernelMemInfo->psKernelSyncInfo->sReadOps2CompleteDevVAddr; -#if defined (SUPPORT_SID_INTERFACE) - /* alloc subhandle for the mapping info */ - if (psDstKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle != IMG_NULL) - { - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &psMapDevMemOUT->sDstClientSyncInfo.hMappingInfo, - psDstKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_MEM_INFO, - PVRSRV_HANDLE_ALLOC_FLAG_NONE, - psMapDevMemOUT->sDstClientMemInfo.hKernelMemInfo); - } - else - { - psMapDevMemOUT->sDstClientSyncInfo.hMappingInfo = 0; - } -#else psMapDevMemOUT->sDstClientSyncInfo.hMappingInfo = psDstKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle; #endif -#endif psMapDevMemOUT->sDstClientMemInfo.psClientSyncInfo = &psMapDevMemOUT->sDstClientSyncInfo; /* @@ -1393,11 +1012,7 @@ PVRSRVUnmapDeviceMemoryBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, (IMG_VOID**)&psKernelMemInfo, -#if defined (SUPPORT_SID_INTERFACE) - psUnmapDevMemIN->hKernelMemInfo, -#else psUnmapDevMemIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); if(psRetOUT->eError != PVRSRV_OK) { @@ -1423,17 +1038,13 @@ PVRSRVUnmapDeviceMemoryBW(IMG_UINT32 ui32BridgeID, } psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - psUnmapDevMemIN->hKernelMemInfo, -#else psUnmapDevMemIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); return 0; } - +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) static IMG_INT PVRSRVMapDeviceClassMemoryBW(IMG_UINT32 ui32BridgeID, @@ -1482,7 +1093,7 @@ PVRSRVMapDeviceClassMemoryBW(IMG_UINT32 ui32BridgeID, /* Having looked up the handle, now check its type */ switch(eHandleType) { -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) case PVRSRV_HANDLE_TYPE_DISP_BUFFER: case PVRSRV_HANDLE_TYPE_BUF_BUFFER: #else @@ -1519,23 +1130,7 @@ PVRSRVMapDeviceClassMemoryBW(IMG_UINT32 ui32BridgeID, psMapDevClassMemOUT->sClientMemInfo.sDevVAddr = psMemInfo->sDevVAddr; psMapDevClassMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags; psMapDevClassMemOUT->sClientMemInfo.uAllocSize = psMemInfo->uAllocSize; -#if defined (SUPPORT_SID_INTERFACE) - if (psMemInfo->sMemBlk.hOSMemHandle != 0) - { - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &psMapDevClassMemOUT->sClientMemInfo.hMappingInfo, - psMemInfo->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_MEM_INFO, - PVRSRV_HANDLE_ALLOC_FLAG_NONE, - psMapDevClassMemIN->hDeviceClassBuffer); - } - else - { - psMapDevClassMemOUT->sClientMemInfo.hMappingInfo = 0; - } -#else psMapDevClassMemOUT->sClientMemInfo.hMappingInfo = psMemInfo->sMemBlk.hOSMemHandle; -#endif PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, &psMapDevClassMemOUT->sClientMemInfo.hKernelMemInfo, @@ -1559,25 +1154,9 @@ PVRSRVMapDeviceClassMemoryBW(IMG_UINT32 ui32BridgeID, psMapDevClassMemOUT->sClientSyncInfo.sReadOps2CompleteDevVAddr = psMemInfo->psKernelSyncInfo->sReadOps2CompleteDevVAddr; -#if defined (SUPPORT_SID_INTERFACE) - if (psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle != 0) - { - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &psMapDevClassMemOUT->sClientSyncInfo.hMappingInfo, - psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_SYNC_INFO, - PVRSRV_HANDLE_ALLOC_FLAG_MULTI, - psMapDevClassMemOUT->sClientMemInfo.hKernelMemInfo); - } - else - { - psMapDevClassMemOUT->sClientSyncInfo.hMappingInfo = 0; - } -#else psMapDevClassMemOUT->sClientSyncInfo.hMappingInfo = psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle; #endif -#endif psMapDevClassMemOUT->sClientMemInfo.psClientSyncInfo = &psMapDevClassMemOUT->sClientSyncInfo; /* @@ -1611,11 +1190,7 @@ PVRSRVUnmapDeviceClassMemoryBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &pvKernelMemInfo, -#if defined (SUPPORT_SID_INTERFACE) - psUnmapDevClassMemIN->hKernelMemInfo, -#else psUnmapDevClassMemIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); if(psRetOUT->eError != PVRSRV_OK) { @@ -1631,16 +1206,14 @@ PVRSRVUnmapDeviceClassMemoryBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - psUnmapDevClassMemIN->hKernelMemInfo, -#else psUnmapDevClassMemIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); return 0; } +#endif /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ + #if defined(OS_PVRSRV_WRAP_EXT_MEM_BW) IMG_INT @@ -1716,8 +1289,8 @@ PVRSRVWrapExtMemoryBW(IMG_UINT32 ui32BridgeID, PVRSRVWrapExtMemoryKM(hDevCookieInt, psPerProc, hDevMemContextInt, - psWrapExtMemIN->ui32ByteSize, - psWrapExtMemIN->ui32PageOffset, + psWrapExtMemIN->uByteSize, + psWrapExtMemIN->uPageOffset, psWrapExtMemIN->bPhysContig, psSysPAddr, psWrapExtMemIN->pvLinAddr, @@ -1745,11 +1318,7 @@ PVRSRVWrapExtMemoryBW(IMG_UINT32 ui32BridgeID, psWrapExtMemOUT->sClientMemInfo.sDevVAddr = psMemInfo->sDevVAddr; psWrapExtMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags; psWrapExtMemOUT->sClientMemInfo.uAllocSize = psMemInfo->uAllocSize; -#if defined (SUPPORT_SID_INTERFACE) -/* see below */ -#else psWrapExtMemOUT->sClientMemInfo.hMappingInfo = psMemInfo->sMemBlk.hOSMemHandle; -#endif PVRSRVAllocHandleNR(psPerProc->psHandleBase, &psWrapExtMemOUT->sClientMemInfo.hKernelMemInfo, @@ -1757,22 +1326,6 @@ PVRSRVWrapExtMemoryBW(IMG_UINT32 ui32BridgeID, PVRSRV_HANDLE_TYPE_MEM_INFO, PVRSRV_HANDLE_ALLOC_FLAG_NONE); -#if defined (SUPPORT_SID_INTERFACE) - /* alloc subhandle for the mapping info */ - if (psMemInfo->sMemBlk.hOSMemHandle != IMG_NULL) - { - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &psWrapExtMemOUT->sClientMemInfo.hMappingInfo, - psMemInfo->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_MEM_INFO, - PVRSRV_HANDLE_ALLOC_FLAG_NONE, - psWrapExtMemOUT->sClientMemInfo.hKernelMemInfo); - } - else - { - psWrapExtMemOUT->sClientMemInfo.hMappingInfo = 0; - } -#endif /* setup the sync info */ #if !defined(PVRSRV_DISABLE_UM_SYNCOBJ_MAPPINGS) @@ -1785,26 +1338,9 @@ PVRSRVWrapExtMemoryBW(IMG_UINT32 ui32BridgeID, psWrapExtMemOUT->sClientSyncInfo.sReadOps2CompleteDevVAddr = psMemInfo->psKernelSyncInfo->sReadOps2CompleteDevVAddr; -#if defined (SUPPORT_SID_INTERFACE) - /* alloc subhandle for the mapping info */ - if (psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle != IMG_NULL) - { - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &psWrapExtMemOUT->sClientSyncInfo.hMappingInfo, - psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_MEM_INFO, - PVRSRV_HANDLE_ALLOC_FLAG_NONE, - psWrapExtMemOUT->sClientMemInfo.hKernelMemInfo); - } - else - { - psWrapExtMemOUT->sClientSyncInfo.hMappingInfo = 0; - } -#else psWrapExtMemOUT->sClientSyncInfo.hMappingInfo = psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle; #endif -#endif psWrapExtMemOUT->sClientMemInfo.psClientSyncInfo = &psWrapExtMemOUT->sClientSyncInfo; @@ -1864,6 +1400,7 @@ PVRSRVMapIonHandleBW(IMG_UINT32 ui32BridgeID, PVRSRV_PER_PROCESS_DATA *psPerProc) { PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; + IMG_UINT64 ui64Stamp; psMapIonOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &psMapIonIN->hDevCookie, @@ -1876,9 +1413,9 @@ PVRSRVMapIonHandleBW(IMG_UINT32 ui32BridgeID, } psMapIonOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, - &psMapIonIN->hDevMemContext, - psMapIonIN->hDevMemContext, - PVRSRV_HANDLE_TYPE_DEV_MEM_CONTEXT); + &psMapIonIN->hDevMemHeap, + psMapIonIN->hDevMemHeap, + PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP); if (psMapIonOUT->eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "%s: Failed to lookup memory context handle", __FUNCTION__)); @@ -1887,11 +1424,16 @@ PVRSRVMapIonHandleBW(IMG_UINT32 ui32BridgeID, psMapIonOUT->eError = PVRSRVMapIonHandleKM(psPerProc, psMapIonIN->hDevCookie, - psMapIonIN->hDevMemContext, - psMapIonIN->handle, + psMapIonIN->hDevMemHeap, + psMapIonIN->ui32NumFDs, + psMapIonIN->ai32BufferFDs, psMapIonIN->ui32Attribs, - psMapIonIN->ui32Size, - &psKernelMemInfo); + psMapIonIN->ui32ChunkCount, + psMapIonIN->auiOffset, + psMapIonIN->auiSize, + &psMapIonOUT->uiIonBufferSize, + &psKernelMemInfo, + &ui64Stamp); if (psMapIonOUT->eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "%s: Failed to map ion handle", __FUNCTION__)); @@ -1913,6 +1455,9 @@ PVRSRVMapIonHandleBW(IMG_UINT32 ui32BridgeID, /* No mapping info, we map through ion */ psMapIonOUT->sClientMemInfo.hMappingInfo = IMG_NULL; +#if defined(SUPPORT_MEMINFO_IDS) + psMapIonOUT->sClientMemInfo.ui64Stamp = ui64Stamp; +#endif PVRSRVAllocHandleNR(psPerProc->psHandleBase, &psMapIonOUT->sClientMemInfo.hKernelMemInfo, @@ -1941,25 +1486,9 @@ PVRSRVMapIonHandleBW(IMG_UINT32 ui32BridgeID, psMapIonOUT->sClientSyncInfo.sReadOps2CompleteDevVAddr = psKernelMemInfo->psKernelSyncInfo->sReadOps2CompleteDevVAddr; -#if defined (SUPPORT_SID_INTERFACE) - if (psKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle != IMG_NULL) - { - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &psMapIonOUT->sClientSyncInfo.hMappingInfo, - psMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_SYNC_INFO, - PVRSRV_HANDLE_ALLOC_FLAG_NONE, - psMapIonOUT->sClientMemInfo.hKernelMemInfo); - } - else - { - psMapIonOUT->sClientSyncInfo.hMappingInfo = 0; - } -#else psMapIonOUT->sClientSyncInfo.hMappingInfo = psKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle; #endif -#endif PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, &psMapIonOUT->sClientSyncInfo.hKernelSyncInfo, @@ -1987,11 +1516,7 @@ PVRSRVUnmapIonHandleBW(IMG_UINT32 ui32BridgeID, psUnmapIonOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &pvKernelMemInfo, -#if defined (SUPPORT_SID_INTERFACE) - psUnmapIonIN->hKernelMemInfo, -#else psUnmapIonIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); if(psUnmapIonOUT->eError != PVRSRV_OK) @@ -2008,11 +1533,7 @@ PVRSRVUnmapIonHandleBW(IMG_UINT32 ui32BridgeID, psUnmapIonOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - psUnmapIonIN->hKernelMemInfo, -#else psUnmapIonIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); return 0; @@ -2031,9 +1552,9 @@ PVRSRVGetFreeDeviceMemBW(IMG_UINT32 ui32BridgeID, psGetFreeDeviceMemOUT->eError = PVRSRVGetFreeDeviceMemKM(psGetFreeDeviceMemIN->ui32Flags, - &psGetFreeDeviceMemOUT->ui32Total, - &psGetFreeDeviceMemOUT->ui32Free, - &psGetFreeDeviceMemOUT->ui32LargestBlock); + &psGetFreeDeviceMemOUT->uTotal, + &psGetFreeDeviceMemOUT->uFree, + &psGetFreeDeviceMemOUT->uLargestBlock); return 0; } @@ -2050,10 +1571,10 @@ PVRMMapOSMemHandleToMMapDataBW(IMG_UINT32 ui32BridgeID, psMMapDataOUT->eError = PVRMMapOSMemHandleToMMapData(psPerProc, psMMapDataIN->hMHandle, - &psMMapDataOUT->ui32MMapOffset, - &psMMapDataOUT->ui32ByteOffset, - &psMMapDataOUT->ui32RealByteSize, - &psMMapDataOUT->ui32UserVAddr); + &psMMapDataOUT->uiMMapOffset, + &psMMapDataOUT->uiByteOffset, + &psMMapDataOUT->uiRealByteSize, + &psMMapDataOUT->uiUserVAddr); #else PVR_UNREFERENCED_PARAMETER(psPerProc); PVR_UNREFERENCED_PARAMETER(psMMapDataIN); @@ -2077,8 +1598,8 @@ PVRMMapReleaseMMapDataBW(IMG_UINT32 ui32BridgeID, PVRMMapReleaseMMapData(psPerProc, psMMapDataIN->hMHandle, &psMMapDataOUT->bMUnmap, - &psMMapDataOUT->ui32RealByteSize, - &psMMapDataOUT->ui32UserVAddr); + &psMMapDataOUT->uiRealByteSize, + &psMMapDataOUT->uiUserVAddr); #else PVR_UNREFERENCED_PARAMETER(psPerProc); @@ -2090,34 +1611,6 @@ PVRMMapReleaseMMapDataBW(IMG_UINT32 ui32BridgeID, } -#if defined (SUPPORT_SID_INTERFACE) -static IMG_INT -PVRSRVChangeDeviceMemoryAttributesBW(IMG_UINT32 ui32BridgeID, - PVRSRV_BRIDGE_IN_CHG_DEV_MEM_ATTRIBS *psChgMemAttribIN, - PVRSRV_BRIDGE_RETURN *psRetOUT, - PVRSRV_PER_PROCESS_DATA *psPerProc) -{ - IMG_HANDLE hKernelMemInfo; - - PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_CHG_DEV_MEM_ATTRIBS); - - psRetOUT->eError = - PVRSRVLookupHandle(psPerProc->psHandleBase, - &hKernelMemInfo, - psChgMemAttribIN->hKernelMemInfo, - PVRSRV_HANDLE_TYPE_MEM_INFO); - - if(psRetOUT->eError != PVRSRV_OK) - { - return 0; - } - - psRetOUT->eError = - PVRSRVChangeDeviceMemoryAttributesKM(hKernelMemInfo, psChgMemAttribIN->ui32Attribs); - - return 0; -} -#else static IMG_INT PVRSRVChangeDeviceMemoryAttributesBW(IMG_UINT32 ui32BridgeID, PVRSRV_BRIDGE_IN_CHG_DEV_MEM_ATTRIBS *psChgMemAttribIN, @@ -2131,7 +1624,6 @@ PVRSRVChangeDeviceMemoryAttributesBW(IMG_UINT32 ui32BridgeID, return 0; } -#endif #ifdef PDUMP static IMG_INT @@ -2251,11 +1743,7 @@ PDumpMemPolBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &pvMemInfo, -#if defined (SUPPORT_SID_INTERFACE) - psPDumpMemPolIN->hKernelMemInfo, -#else psPDumpMemPolIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); if(psRetOUT->eError != PVRSRV_OK) { @@ -2287,11 +1775,7 @@ PDumpMemBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &pvMemInfo, -#if defined (SUPPORT_SID_INTERFACE) - psPDumpMemDumpIN->hKernelMemInfo, -#else psPDumpMemDumpIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); if(psRetOUT->eError != PVRSRV_OK) { @@ -2442,11 +1926,7 @@ PDumpSyncDumpBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &pvSyncInfo, -#if defined (SUPPORT_SID_INTERFACE) - psPDumpSyncDumpIN->hKernelSyncInfo, -#else psPDumpSyncDumpIN->psKernelSyncInfo, -#endif PVRSRV_HANDLE_TYPE_SYNC_INFO); if(psRetOUT->eError != PVRSRV_OK) { @@ -2482,11 +1962,7 @@ PDumpSyncPolBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &pvSyncInfo, -#if defined (SUPPORT_SID_INTERFACE) - psPDumpSyncPolIN->hKernelSyncInfo, -#else psPDumpSyncPolIN->psKernelSyncInfo, -#endif PVRSRV_HANDLE_TYPE_SYNC_INFO); if(psRetOUT->eError != PVRSRV_OK) { @@ -2630,30 +2106,13 @@ PVRSRVGetMiscInfoBW(IMG_UINT32 ui32BridgeID, PVRSRV_BRIDGE_OUT_GET_MISC_INFO *psGetMiscInfoOUT, PVRSRV_PER_PROCESS_DATA *psPerProc) { -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_MISC_INFO_KM sMiscInfo = {0}; -#endif PVRSRV_ERROR eError; PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_GET_MISC_INFO); -#if defined (SUPPORT_SID_INTERFACE) - sMiscInfo.ui32StateRequest = psGetMiscInfoIN->sMiscInfo.ui32StateRequest; - sMiscInfo.ui32StatePresent = psGetMiscInfoIN->sMiscInfo.ui32StatePresent; - sMiscInfo.ui32MemoryStrLen = psGetMiscInfoIN->sMiscInfo.ui32MemoryStrLen; - sMiscInfo.pszMemoryStr = psGetMiscInfoIN->sMiscInfo.pszMemoryStr; - - OSMemCopy(&sMiscInfo.sCacheOpCtl, - &psGetMiscInfoIN->sMiscInfo.sCacheOpCtl, - sizeof(sMiscInfo.sCacheOpCtl)); - OSMemCopy(&sMiscInfo.sGetRefCountCtl, - &psGetMiscInfoIN->sMiscInfo.sGetRefCountCtl, - sizeof(sMiscInfo.sGetRefCountCtl)); -#else OSMemCopy(&psGetMiscInfoOUT->sMiscInfo, &psGetMiscInfoIN->sMiscInfo, sizeof(PVRSRV_MISC_INFO)); -#endif if (((psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_MEMSTATS_PRESENT) != 0) && ((psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_DDKVERSION_PRESENT) != 0) && @@ -2670,20 +2129,6 @@ PVRSRVGetMiscInfoBW(IMG_UINT32 ui32BridgeID, ((psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_FREEMEM_PRESENT) != 0)) { /* Alloc kernel side buffer to write into */ -#if defined (SUPPORT_SID_INTERFACE) - ASSIGN_AND_EXIT_ON_ERROR(psGetMiscInfoOUT->eError, - OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, - psGetMiscInfoOUT->sMiscInfo.ui32MemoryStrLen, - (IMG_VOID **)&sMiscInfo.pszMemoryStr, 0, - "Output string buffer")); - psGetMiscInfoOUT->eError = PVRSRVGetMiscInfoKM(&sMiscInfo); - - /* Copy result to user */ - eError = CopyToUserWrapper(psPerProc, ui32BridgeID, - psGetMiscInfoIN->sMiscInfo.pszMemoryStr, - sMiscInfo.pszMemoryStr, - sMiscInfo.ui32MemoryStrLen); -#else ASSIGN_AND_EXIT_ON_ERROR(psGetMiscInfoOUT->eError, OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, psGetMiscInfoOUT->sMiscInfo.ui32MemoryStrLen, @@ -2697,18 +2142,11 @@ PVRSRVGetMiscInfoBW(IMG_UINT32 ui32BridgeID, psGetMiscInfoIN->sMiscInfo.pszMemoryStr, psGetMiscInfoOUT->sMiscInfo.pszMemoryStr, psGetMiscInfoOUT->sMiscInfo.ui32MemoryStrLen); -#endif /* Free kernel side buffer again */ -#if defined (SUPPORT_SID_INTERFACE) - OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, - sMiscInfo.ui32MemoryStrLen, - (IMG_VOID *)sMiscInfo.pszMemoryStr, 0); -#else OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, psGetMiscInfoOUT->sMiscInfo.ui32MemoryStrLen, (IMG_VOID *)psGetMiscInfoOUT->sMiscInfo.pszMemoryStr, 0); -#endif /* Replace output buffer pointer with input pointer, as both are expected * to point to the same userspace memory. @@ -2726,11 +2164,7 @@ PVRSRVGetMiscInfoBW(IMG_UINT32 ui32BridgeID, } else { -#if defined (SUPPORT_SID_INTERFACE) - psGetMiscInfoOUT->eError = PVRSRVGetMiscInfoKM(&sMiscInfo); -#else psGetMiscInfoOUT->eError = PVRSRVGetMiscInfoKM(&psGetMiscInfoOUT->sMiscInfo); -#endif } /* Return on error so exit status of PVRSRVGetMiscInfoKM is propagated to client. @@ -2746,19 +2180,11 @@ PVRSRVGetMiscInfoBW(IMG_UINT32 ui32BridgeID, * (a shared handle is allocated at most once), and there is no * resource allocation to undo if the handle allocation fails. */ -#if defined (SUPPORT_SID_INTERFACE) - if (sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT) -#else if (psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_GLOBALEVENTOBJECT_PRESENT) -#endif { psGetMiscInfoOUT->eError = PVRSRVAllocHandle(psPerProc->psHandleBase, &psGetMiscInfoOUT->sMiscInfo.sGlobalEventObject.hOSEventKM, -#if defined (SUPPORT_SID_INTERFACE) - sMiscInfo.sGlobalEventObject.hOSEventKM, -#else psGetMiscInfoOUT->sMiscInfo.sGlobalEventObject.hOSEventKM, -#endif PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT, PVRSRV_HANDLE_ALLOC_FLAG_SHARED); @@ -2767,27 +2193,14 @@ PVRSRVGetMiscInfoBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - OSMemCopy(&psGetMiscInfoOUT->sMiscInfo.sGlobalEventObject.szName, - sMiscInfo.sGlobalEventObject.szName, - EVENTOBJNAME_MAXLENGTH); -#endif } -#if defined (SUPPORT_SID_INTERFACE) - if (sMiscInfo.hSOCTimerRegisterOSMemHandle) -#else if (psGetMiscInfoOUT->sMiscInfo.hSOCTimerRegisterOSMemHandle) -#endif { /* Allocate handle for SOC OSMemHandle */ psGetMiscInfoOUT->eError = PVRSRVAllocHandle(psPerProc->psHandleBase, &psGetMiscInfoOUT->sMiscInfo.hSOCTimerRegisterOSMemHandle, -#if defined (SUPPORT_SID_INTERFACE) - sMiscInfo.hSOCTimerRegisterOSMemHandle, -#else psGetMiscInfoOUT->sMiscInfo.hSOCTimerRegisterOSMemHandle, -#endif PVRSRV_HANDLE_TYPE_SOC_TIMER, PVRSRV_HANDLE_ALLOC_FLAG_SHARED); @@ -2796,32 +2209,6 @@ PVRSRVGetMiscInfoBW(IMG_UINT32 ui32BridgeID, return 0; } } -#if defined (SUPPORT_SID_INTERFACE) - else - { - psGetMiscInfoOUT->sMiscInfo.hSOCTimerRegisterOSMemHandle = 0; - } - - /* copy data from local sMiscInfo to OUT */ - psGetMiscInfoOUT->sMiscInfo.ui32StateRequest = sMiscInfo.ui32StateRequest; - psGetMiscInfoOUT->sMiscInfo.ui32StatePresent = sMiscInfo.ui32StatePresent; - - psGetMiscInfoOUT->sMiscInfo.pvSOCTimerRegisterKM = sMiscInfo.pvSOCTimerRegisterKM; - psGetMiscInfoOUT->sMiscInfo.pvSOCTimerRegisterUM = sMiscInfo.pvSOCTimerRegisterUM; - psGetMiscInfoOUT->sMiscInfo.pvSOCClockGateRegs = sMiscInfo.pvSOCClockGateRegs; - - psGetMiscInfoOUT->sMiscInfo.ui32SOCClockGateRegsSize = sMiscInfo.ui32SOCClockGateRegsSize; - - OSMemCopy(&psGetMiscInfoOUT->sMiscInfo.aui32DDKVersion, - &sMiscInfo.aui32DDKVersion, - sizeof(psGetMiscInfoOUT->sMiscInfo.aui32DDKVersion)); - OSMemCopy(&psGetMiscInfoOUT->sMiscInfo.sCacheOpCtl, - &sMiscInfo.sCacheOpCtl, - sizeof(psGetMiscInfoOUT->sMiscInfo.sCacheOpCtl)); - OSMemCopy(&psGetMiscInfoOUT->sMiscInfo.sGetRefCountCtl, - &sMiscInfo.sGetRefCountCtl, - sizeof(psGetMiscInfoOUT->sMiscInfo.sGetRefCountCtl)); -#endif return 0; } @@ -2882,6 +2269,8 @@ PVRSRVDisconnectBW(IMG_UINT32 ui32BridgeID, return 0; } +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) + static IMG_INT PVRSRVEnumerateDCBW(IMG_UINT32 ui32BridgeID, PVRSRV_BRIDGE_IN_ENUMCLASS *psEnumDispClassIN, @@ -3369,9 +2758,6 @@ PVRSRVGetDCBuffersBW(IMG_UINT32 ui32BridgeID, IMG_VOID *pvDispClassInfo; IMG_VOID *pvSwapChain; IMG_UINT32 i; -#if defined (SUPPORT_SID_INTERFACE) - IMG_HANDLE *pahBuffer; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_GET_DISPCLASS_BUFFERS); @@ -3397,27 +2783,12 @@ PVRSRVGetDCBuffersBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - psGetDispClassBuffersOUT->eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, - sizeof(IMG_HANDLE) * PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS, - (IMG_PVOID *)&pahBuffer, 0, - "Temp Swapchain Buffers"); - - if (psGetDispClassBuffersOUT->eError != PVRSRV_OK) - { - return 0; - } -#endif psGetDispClassBuffersOUT->eError = PVRSRVGetDCBuffersKM(pvDispClassInfo, pvSwapChain, &psGetDispClassBuffersOUT->ui32BufferCount, -#if defined (SUPPORT_SID_INTERFACE) - pahBuffer, -#else psGetDispClassBuffersOUT->ahBuffer, -#endif psGetDispClassBuffersOUT->asPhyAddr); if (psGetDispClassBuffersOUT->eError != PVRSRV_OK) { @@ -3428,37 +2799,19 @@ PVRSRVGetDCBuffersBW(IMG_UINT32 ui32BridgeID, for(i = 0; i < psGetDispClassBuffersOUT->ui32BufferCount; i++) { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hBufferExt; -#else IMG_HANDLE hBufferExt; -#endif /* PRQA S 1461 15 */ /* ignore warning about enum type being converted */ -#if defined (SUPPORT_SID_INTERFACE) - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &hBufferExt, - pahBuffer[i], - PVRSRV_HANDLE_TYPE_DISP_BUFFER, - (PVRSRV_HANDLE_ALLOC_FLAG)(PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE | PVRSRV_HANDLE_ALLOC_FLAG_SHARED), - psGetDispClassBuffersIN->hSwapChain); -#else PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, &hBufferExt, psGetDispClassBuffersOUT->ahBuffer[i], PVRSRV_HANDLE_TYPE_DISP_BUFFER, (PVRSRV_HANDLE_ALLOC_FLAG)(PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE | PVRSRV_HANDLE_ALLOC_FLAG_SHARED), psGetDispClassBuffersIN->hSwapChain); -#endif psGetDispClassBuffersOUT->ahBuffer[i] = hBufferExt; } -#if defined (SUPPORT_SID_INTERFACE) - OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, - sizeof(IMG_HANDLE) * PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS, - (IMG_PVOID)pahBuffer, 0); -#endif COMMIT_HANDLE_BATCH_OR_ERROR(psGetDispClassBuffersOUT->eError, psPerProc) @@ -3473,9 +2826,6 @@ PVRSRVSwapToDCBufferBW(IMG_UINT32 ui32BridgeID, { IMG_VOID *pvDispClassInfo; IMG_VOID *pvSwapChainBuf; -#if defined (SUPPORT_SID_INTERFACE) - IMG_HANDLE hPrivateTag; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_BUFFER); @@ -3500,35 +2850,12 @@ PVRSRVSwapToDCBufferBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - if (psSwapDispClassBufferIN->hPrivateTag != 0) - { - psRetOUT->eError = - PVRSRVLookupSubHandle(psPerProc->psHandleBase, - &hPrivateTag, - psSwapDispClassBufferIN->hPrivateTag, - PVRSRV_HANDLE_TYPE_DISP_BUFFER, - psSwapDispClassBufferIN->hDeviceKM); - if(psRetOUT->eError != PVRSRV_OK) - { - return 0; - } - } - else - { - hPrivateTag = IMG_NULL; - } -#endif psRetOUT->eError = PVRSRVSwapToDCBufferKM(pvDispClassInfo, pvSwapChainBuf, psSwapDispClassBufferIN->ui32SwapInterval, -#if defined (SUPPORT_SID_INTERFACE) - hPrivateTag, -#else psSwapDispClassBufferIN->hPrivateTag, -#endif psSwapDispClassBufferIN->ui32ClipRectCount, psSwapDispClassBufferIN->sClipRect); @@ -3538,34 +2865,45 @@ PVRSRVSwapToDCBufferBW(IMG_UINT32 ui32BridgeID, static IMG_INT PVRSRVSwapToDCBuffer2BW(IMG_UINT32 ui32BridgeID, PVRSRV_BRIDGE_IN_SWAP_DISPCLASS_TO_BUFFER2 *psSwapDispClassBufferIN, - PVRSRV_BRIDGE_RETURN *psRetOUT, + PVRSRV_BRIDGE_OUT_SWAP_DISPCLASS_TO_BUFFER2 *psSwapDispClassBufferOUT, PVRSRV_PER_PROCESS_DATA *psPerProc) { IMG_VOID *pvPrivData = IMG_NULL; + IMG_HANDLE hFence = IMG_NULL; IMG_VOID *pvDispClassInfo; IMG_VOID *pvSwapChain; IMG_UINT32 i; +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + int iReleaseFd = get_unused_fd(); + if(iReleaseFd < 0) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to find unused fd (%d)", + __func__, iReleaseFd)); + return 0; + } +#endif /* defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ + PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_BUFFER2); - psRetOUT->eError = + psSwapDispClassBufferOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &pvDispClassInfo, psSwapDispClassBufferIN->hDeviceKM, PVRSRV_HANDLE_TYPE_DISP_INFO); - if(psRetOUT->eError != PVRSRV_OK) + if(psSwapDispClassBufferOUT->eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVSwapToDCBuffer2BW: Failed to look up DISP_INFO handle")); return 0; } - psRetOUT->eError = + psSwapDispClassBufferOUT->eError = PVRSRVLookupSubHandle(psPerProc->psHandleBase, &pvSwapChain, psSwapDispClassBufferIN->hSwapChain, PVRSRV_HANDLE_TYPE_DISP_SWAP_CHAIN, psSwapDispClassBufferIN->hDeviceKM); - if(psRetOUT->eError != PVRSRV_OK) + if(psSwapDispClassBufferOUT->eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVSwapToDCBuffer2BW: Failed to look up DISP_BUFFER handle")); return 0; @@ -3589,33 +2927,37 @@ PVRSRVSwapToDCBuffer2BW(IMG_UINT32 ui32BridgeID, for (i = 0; i < psSwapDispClassBufferIN->ui32NumMemInfos; i++) { - PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo; PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; - psRetOUT->eError = + psSwapDispClassBufferOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, (IMG_PVOID *)&psKernelMemInfo, psSwapDispClassBufferIN->ppsKernelMemInfos[i], PVRSRV_HANDLE_TYPE_MEM_INFO); - if(psRetOUT->eError != PVRSRV_OK) + if(psSwapDispClassBufferOUT->eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVSwapToDCBuffer2BW: Failed to look up MEM_INFO handle")); return 0; } + psSwapDispClassBufferIN->ppsKernelMemInfos[i] = psKernelMemInfo; - psRetOUT->eError = - PVRSRVLookupHandle(psPerProc->psHandleBase, - (IMG_PVOID *)&psKernelSyncInfo, - psSwapDispClassBufferIN->ppsKernelSyncInfos[i], - PVRSRV_HANDLE_TYPE_SYNC_INFO); - if(psRetOUT->eError != PVRSRV_OK) +#if !defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) { - PVR_DPF((PVR_DBG_ERROR, "PVRSRVSwapToDCBuffer2BW: Failed to look up SYNC_INFO handle")); - return 0; + PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo; + + psSwapDispClassBufferOUT->eError = + PVRSRVLookupHandle(psPerProc->psHandleBase, + (IMG_PVOID *)&psKernelSyncInfo, + psSwapDispClassBufferIN->ppsKernelSyncInfos[i], + PVRSRV_HANDLE_TYPE_SYNC_INFO); + if(psSwapDispClassBufferOUT->eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR, "PVRSRVSwapToDCBuffer2BW: Failed to look up SYNC_INFO handle")); + return 0; + } + psSwapDispClassBufferIN->ppsKernelSyncInfos[i] = psKernelSyncInfo; } - - psSwapDispClassBufferIN->ppsKernelMemInfos[i] = psKernelMemInfo; - psSwapDispClassBufferIN->ppsKernelSyncInfos[i] = psKernelSyncInfo; +#endif /* !defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ } if(psSwapDispClassBufferIN->ui32PrivDataLength > 0) @@ -3643,7 +2985,7 @@ PVRSRVSwapToDCBuffer2BW(IMG_UINT32 ui32BridgeID, } } - psRetOUT->eError = + psSwapDispClassBufferOUT->eError = PVRSRVSwapToDCBuffer2KM(pvDispClassInfo, pvSwapChain, psSwapDispClassBufferIN->ui32SwapInterval, @@ -3651,15 +2993,32 @@ PVRSRVSwapToDCBuffer2BW(IMG_UINT32 ui32BridgeID, psSwapDispClassBufferIN->ppsKernelSyncInfos, psSwapDispClassBufferIN->ui32NumMemInfos, pvPrivData, - psSwapDispClassBufferIN->ui32PrivDataLength); + psSwapDispClassBufferIN->ui32PrivDataLength, + &hFence); - if(psRetOUT->eError != PVRSRV_OK) + if(psSwapDispClassBufferOUT->eError != PVRSRV_OK) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, psSwapDispClassBufferIN->ui32PrivDataLength, pvPrivData, IMG_NULL); } +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + if(hFence) + { + struct sync_fence *psFence = hFence; + sync_fence_install(psFence, iReleaseFd); + psSwapDispClassBufferOUT->hFence = (IMG_HANDLE)iReleaseFd; + } + else + { + psSwapDispClassBufferOUT->hFence = (IMG_HANDLE)-1; + put_unused_fd(iReleaseFd); + } +#else /* defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ + psSwapDispClassBufferOUT->hFence = (IMG_HANDLE)-1; +#endif /* defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ + return 0; } @@ -3854,6 +3213,7 @@ PVRSRVGetBCBufferBW(IMG_UINT32 ui32BridgeID, return 0; } +#endif /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ static IMG_INT PVRSRVAllocSharedSysMemoryBW(IMG_UINT32 ui32BridgeID, @@ -3870,7 +3230,7 @@ PVRSRVAllocSharedSysMemoryBW(IMG_UINT32 ui32BridgeID, psAllocSharedSysMemOUT->eError = PVRSRVAllocSharedSysMemoryKM(psPerProc, psAllocSharedSysMemIN->ui32Flags, - psAllocSharedSysMemIN->ui32Size, + psAllocSharedSysMemIN->uSize, &psKernelMemInfo); if(psAllocSharedSysMemOUT->eError != PVRSRV_OK) { @@ -3889,22 +3249,7 @@ PVRSRVAllocSharedSysMemoryBW(IMG_UINT32 ui32BridgeID, psKernelMemInfo->ui32Flags; psAllocSharedSysMemOUT->sClientMemInfo.uAllocSize = psKernelMemInfo->uAllocSize; -#if defined (SUPPORT_SID_INTERFACE) - if (psKernelMemInfo->sMemBlk.hOSMemHandle != IMG_NULL) - { - PVRSRVAllocHandleNR(psPerProc->psHandleBase, - &psAllocSharedSysMemOUT->sClientMemInfo.hMappingInfo, - psKernelMemInfo->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO, - PVRSRV_HANDLE_ALLOC_FLAG_NONE); - } - else - { - psAllocSharedSysMemOUT->sClientMemInfo.hMappingInfo = 0; - } -#else psAllocSharedSysMemOUT->sClientMemInfo.hMappingInfo = psKernelMemInfo->sMemBlk.hOSMemHandle; -#endif PVRSRVAllocHandleNR(psPerProc->psHandleBase, &psAllocSharedSysMemOUT->sClientMemInfo.hKernelMemInfo, @@ -3930,11 +3275,7 @@ PVRSRVFreeSharedSysMemoryBW(IMG_UINT32 ui32BridgeID, psFreeSharedSysMemOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, (IMG_VOID **)&psKernelMemInfo, -#if defined (SUPPORT_SID_INTERFACE) - psFreeSharedSysMemIN->hKernelMemInfo, -#else psFreeSharedSysMemIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO); if(psFreeSharedSysMemOUT->eError != PVRSRV_OK) @@ -3944,27 +3285,10 @@ PVRSRVFreeSharedSysMemoryBW(IMG_UINT32 ui32BridgeID, PVRSRVFreeSharedSysMemoryKM(psKernelMemInfo); if(psFreeSharedSysMemOUT->eError != PVRSRV_OK) return 0; -#if defined (SUPPORT_SID_INTERFACE) - if (psFreeSharedSysMemIN->hMappingInfo != 0) - { - psFreeSharedSysMemOUT->eError = - PVRSRVReleaseHandle(psPerProc->psHandleBase, - psFreeSharedSysMemIN->hMappingInfo, - PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO); - if(psFreeSharedSysMemOUT->eError != PVRSRV_OK) - { - return 0; - } - } -#endif psFreeSharedSysMemOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - psFreeSharedSysMemIN->hKernelMemInfo, -#else psFreeSharedSysMemIN->psKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO); return 0; } @@ -3977,11 +3301,7 @@ PVRSRVMapMemInfoMemBW(IMG_UINT32 ui32BridgeID, { PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; PVRSRV_HANDLE_TYPE eHandleType; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hParent; -#else IMG_HANDLE hParent; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_MAP_MEMINFO_MEM); NEW_HANDLE_BATCH_OR_ERROR(psMapMemInfoMemOUT->eError, psPerProc, 2) @@ -3998,7 +3318,7 @@ PVRSRVMapMemInfoMemBW(IMG_UINT32 ui32BridgeID, switch (eHandleType) { -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) case PVRSRV_HANDLE_TYPE_MEM_INFO: case PVRSRV_HANDLE_TYPE_MEM_INFO_REF: case PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO: @@ -4025,11 +3345,7 @@ PVRSRVMapMemInfoMemBW(IMG_UINT32 ui32BridgeID, { return 0; } -#if defined (SUPPORT_SID_INTERFACE) - if (hParent == 0) -#else if (hParent == IMG_NULL) -#endif { hParent = psMapMemInfoMemIN->hKernelMemInfo; } @@ -4048,23 +3364,7 @@ PVRSRVMapMemInfoMemBW(IMG_UINT32 ui32BridgeID, psKernelMemInfo->ui32Flags; psMapMemInfoMemOUT->sClientMemInfo.uAllocSize = psKernelMemInfo->uAllocSize; -#if defined (SUPPORT_SID_INTERFACE) - if (psKernelMemInfo->sMemBlk.hOSMemHandle != IMG_NULL) - { - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &psMapMemInfoMemOUT->sClientMemInfo.hMappingInfo, - psKernelMemInfo->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_MEM_INFO_REF, - PVRSRV_HANDLE_ALLOC_FLAG_MULTI, - hParent); - } - else - { - psMapMemInfoMemOUT->sClientMemInfo.hMappingInfo = 0; - } -#else psMapMemInfoMemOUT->sClientMemInfo.hMappingInfo = psKernelMemInfo->sMemBlk.hOSMemHandle; -#endif PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, &psMapMemInfoMemOUT->sClientMemInfo.hKernelMemInfo, @@ -4093,25 +3393,9 @@ PVRSRVMapMemInfoMemBW(IMG_UINT32 ui32BridgeID, psMapMemInfoMemOUT->sClientSyncInfo.sReadOps2CompleteDevVAddr = psKernelMemInfo->psKernelSyncInfo->sReadOps2CompleteDevVAddr; -#if defined (SUPPORT_SID_INTERFACE) - if (psKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle != IMG_NULL) - { - PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, - &psMapMemInfoMemOUT->sClientSyncInfo.hMappingInfo, - psKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle, - PVRSRV_HANDLE_TYPE_SYNC_INFO, - PVRSRV_HANDLE_ALLOC_FLAG_MULTI, - psMapMemInfoMemOUT->sClientMemInfo.hKernelMemInfo); - } - else - { - psMapMemInfoMemOUT->sClientSyncInfo.hMappingInfo = 0; - } -#else psMapMemInfoMemOUT->sClientSyncInfo.hMappingInfo = psKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle; #endif -#endif psMapMemInfoMemOUT->sClientMemInfo.psClientSyncInfo = &psMapMemInfoMemOUT->sClientSyncInfo; @@ -4174,7 +3458,7 @@ _SetDispatchTableEntry(IMG_UINT32 ui32Index, BridgeWrapperFunction pfFunction, const IMG_CHAR *pszFunctionName) { - static IMG_UINT32 ui32PrevIndex = ~0UL; /* -1 */ + static IMG_UINT uiPrevIndex = ~0U; /* -1 */ #if !defined(DEBUG) PVR_UNREFERENCED_PARAMETER(pszIOCName); #endif @@ -4217,20 +3501,20 @@ _SetDispatchTableEntry(IMG_UINT32 ui32Index, * etc is likly to modify the available ioctls and thus be a point where * mistakes are exposed. This isn't run at at a performance critical time. */ -// if((ui32PrevIndex != (IMG_UINT32)-1) && - if((ui32PrevIndex != ~0UL) && - ((ui32Index >= ui32PrevIndex + DISPATCH_TABLE_GAP_THRESHOLD) || - (ui32Index <= ui32PrevIndex))) +// if((uiPrevIndex != (IMG_UINT)-1) && + if((uiPrevIndex != ~0U) && + ((ui32Index >= uiPrevIndex + DISPATCH_TABLE_GAP_THRESHOLD) || + (ui32Index <= uiPrevIndex))) { #if defined(DEBUG_BRIDGE_KM) PVR_DPF((PVR_DBG_WARNING, "%s: There is a gap in the dispatch table between indices %u (%s) and %u (%s)", - __FUNCTION__, ui32PrevIndex, g_BridgeDispatchTable[ui32PrevIndex].pszIOCName, + __FUNCTION__, uiPrevIndex, g_BridgeDispatchTable[uiPrevIndex].pszIOCName, ui32Index, pszIOCName)); #else PVR_DPF((PVR_DBG_WARNING, "%s: There is a gap in the dispatch table between indices %u and %u (%s)", - __FUNCTION__, (IMG_UINT)ui32PrevIndex, (IMG_UINT)ui32Index, pszIOCName)); + __FUNCTION__, (IMG_UINT)uiPrevIndex, (IMG_UINT)ui32Index, pszIOCName)); #endif PVR_DPF((PVR_DBG_ERROR, "NOTE: Enabling DEBUG_BRIDGE_KM_DISPATCH_TABLE may help debug this issue.")); } @@ -4243,7 +3527,7 @@ _SetDispatchTableEntry(IMG_UINT32 ui32Index, g_BridgeDispatchTable[ui32Index].ui32CopyFromUserTotalBytes = 0; #endif - ui32PrevIndex = ui32Index; + uiPrevIndex = ui32Index; } static IMG_INT @@ -4340,10 +3624,6 @@ PVRSRVEventObjectOpenBW(IMG_UINT32 ui32BridgeID, PVRSRV_BRIDGE_OUT_EVENT_OBJECT_OPEN *psEventObjectOpenOUT, PVRSRV_PER_PROCESS_DATA *psPerProc) { -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_EVENTOBJECT_KM sEventObject; - IMG_HANDLE hOSEvent; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EVENT_OBJECT_OPEN); @@ -4351,11 +3631,7 @@ PVRSRVEventObjectOpenBW(IMG_UINT32 ui32BridgeID, psEventObjectOpenOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sEventObject.hOSEventKM, -#else &psEventObjectOpenIN->sEventObject.hOSEventKM, -#endif psEventObjectOpenIN->sEventObject.hOSEventKM, PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT); @@ -4364,38 +3640,18 @@ PVRSRVEventObjectOpenBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - OSMemCopy(&sEventObject.szName, - &psEventObjectOpenIN->sEventObject.szName, - EVENTOBJNAME_MAXLENGTH); - - psEventObjectOpenOUT->eError = OSEventObjectOpenKM(&sEventObject, &hOSEvent); -#else psEventObjectOpenOUT->eError = OSEventObjectOpenKM(&psEventObjectOpenIN->sEventObject, &psEventObjectOpenOUT->hOSEvent); -#endif if(psEventObjectOpenOUT->eError != PVRSRV_OK) { return 0; } -#if defined (SUPPORT_SID_INTERFACE) -/* Windows7, WinXP and Vista already use an Index type handle which the client glue uses directly */ -/* Linux requires a SID handle */ -#if !defined (WINXP) && !defined(SUPPORT_VISTA) - PVRSRVAllocHandleNR(psPerProc->psHandleBase, - &psEventObjectOpenOUT->hOSEvent, - hOSEvent, - PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT, - PVRSRV_HANDLE_ALLOC_FLAG_MULTI); -#endif -#else PVRSRVAllocHandleNR(psPerProc->psHandleBase, &psEventObjectOpenOUT->hOSEvent, psEventObjectOpenOUT->hOSEvent, PVRSRV_HANDLE_TYPE_EVENT_OBJECT_CONNECT, PVRSRV_HANDLE_ALLOC_FLAG_MULTI); -#endif COMMIT_HANDLE_BATCH_OR_ERROR(psEventObjectOpenOUT->eError, psPerProc) @@ -4410,19 +3666,12 @@ PVRSRVEventObjectCloseBW(IMG_UINT32 ui32BridgeID, PVRSRV_PER_PROCESS_DATA *psPerProc) { IMG_HANDLE hOSEventKM; -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_EVENTOBJECT_KM sEventObject; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_EVENT_OBJECT_CLOSE); psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sEventObject.hOSEventKM, -#else &psEventObjectCloseIN->sEventObject.hOSEventKM, -#endif psEventObjectCloseIN->sEventObject.hOSEventKM, PVRSRV_HANDLE_TYPE_SHARED_EVENT_OBJECT); if(psRetOUT->eError != PVRSRV_OK) @@ -4440,20 +3689,7 @@ PVRSRVEventObjectCloseBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - if(CopyFromUserWrapper(psPerProc, ui32BridgeID, - &sEventObject.szName, - &psEventObjectCloseIN->sEventObject.szName, - EVENTOBJNAME_MAXLENGTH) != PVRSRV_OK) - { - /*not nulling pointer, out of scope*/ - return -EFAULT; - } - - psRetOUT->eError = OSEventObjectCloseKM(&sEventObject, hOSEventKM); -#else psRetOUT->eError = OSEventObjectCloseKM(&psEventObjectCloseIN->sEventObject, hOSEventKM); -#endif return 0; } @@ -4581,6 +3817,17 @@ static PVRSRV_ERROR DoModifyCompleteSyncOps(MODIFY_SYNC_OP_INFO *psModSyncOpInfo psKernelSyncInfo->psSyncData->ui32ReadOpsComplete++; } + /* update the ROp2Complete */ + if(psModSyncOpInfo->ui32ModifyFlags & PVRSRV_MODIFYSYNCOPS_FLAGS_RO2_INC) + { + psKernelSyncInfo->psSyncData->ui32ReadOps2Complete++; + } + + PVR_TTRACE(PVRSRV_TRACE_GROUP_MODOBJ, PVRSRV_TRACE_CLASS_CMD_COMP_START, MODOBJ_TOKEN_COMPLETE_PENDING); + PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_MODOBJ, MODOBJ_TOKEN_SYNC_UPDATE, + psKernelSyncInfo, PVRSRV_SYNCOP_COMPLETE); + PVR_TTRACE(PVRSRV_TRACE_GROUP_MODOBJ, PVRSRV_TRACE_CLASS_CMD_COMP_END, MODOBJ_TOKEN_COMPLETE_PENDING); + return PVRSRV_OK; } @@ -4715,8 +3962,6 @@ PVRSRVDestroySyncInfoModObjBW(IMG_UINT32 return 0; } - PVRSRVKernelSyncInfoDecRef(psModSyncOpInfo->psKernelSyncInfo, IMG_NULL); - psDestroySyncInfoModObjOUT->eError = PVRSRVReleaseHandle(psPerProc->psHandleBase, psDestroySyncInfoModObjIN->hKernelSyncInfoModObj, PVRSRV_HANDLE_TYPE_SYNC_INFO_MOD_OBJ); @@ -4799,14 +4044,42 @@ PVRSRVModifyPendingSyncOpsBW(IMG_UINT32 ui32BridgeID, psModifySyncOpsOUT->ui32WriteOpsPending = psKernelSyncInfo->psSyncData->ui32WriteOpsPending; psModifySyncOpsOUT->ui32ReadOps2Pending = psKernelSyncInfo->psSyncData->ui32ReadOps2Pending; + PVR_TTRACE(PVRSRV_TRACE_GROUP_MODOBJ, PVRSRV_TRACE_CLASS_CMD_START, MODOBJ_TOKEN_MODIFY_PENDING); + if(psModifySyncOpsIN->ui32ModifyFlags & PVRSRV_MODIFYSYNCOPS_FLAGS_WO_INC) + { + PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_MODOBJ, MODOBJ_TOKEN_WRITE_SYNC, + psKernelSyncInfo, PVRSRV_SYNCOP_SAMPLE); + } + else if (psModifySyncOpsIN->ui32ModifyFlags & PVRSRV_MODIFYSYNCOPS_FLAGS_RO_INC) + { + PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_MODOBJ, MODOBJ_TOKEN_READ_SYNC, + psKernelSyncInfo, PVRSRV_SYNCOP_SAMPLE); + } + else if (psModifySyncOpsIN->ui32ModifyFlags & PVRSRV_MODIFYSYNCOPS_FLAGS_RO2_INC) + { + PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_MODOBJ, MODOBJ_TOKEN_READ2_SYNC, + psKernelSyncInfo, PVRSRV_SYNCOP_SAMPLE); + } + else + { + PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_MODOBJ, MODOBJ_TOKEN_READ_WRITE_SYNC, + psKernelSyncInfo, PVRSRV_SYNCOP_SAMPLE); + } + PVR_TTRACE(PVRSRV_TRACE_GROUP_MODOBJ, PVRSRV_TRACE_CLASS_CMD_END, MODOBJ_TOKEN_MODIFY_PENDING); + if(psModifySyncOpsIN->ui32ModifyFlags & PVRSRV_MODIFYSYNCOPS_FLAGS_WO_INC) { - psKernelSyncInfo->psSyncData->ui32WriteOpsPending++; + SyncTakeWriteOp(psKernelSyncInfo, SYNC_OP_CLASS_MODOBJ); } if(psModifySyncOpsIN->ui32ModifyFlags & PVRSRV_MODIFYSYNCOPS_FLAGS_RO_INC) { - psKernelSyncInfo->psSyncData->ui32ReadOpsPending++; + SyncTakeReadOp(psKernelSyncInfo, SYNC_OP_CLASS_MODOBJ); + } + + if(psModifySyncOpsIN->ui32ModifyFlags & PVRSRV_MODIFYSYNCOPS_FLAGS_RO2_INC) + { + SyncTakeReadOp2(psKernelSyncInfo, SYNC_OP_CLASS_MODOBJ); } /* pull the resman item to the front of the list */ @@ -5209,8 +4482,6 @@ CommonBridgeInit(IMG_VOID) SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_EXT_MEMORY, DummyBW); SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_DEV_MEMORY, PVRSRVMapDeviceMemoryBW); SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_DEV_MEMORY, PVRSRVUnmapDeviceMemoryBW); - SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_DEVICECLASS_MEMORY, PVRSRVMapDeviceClassMemoryBW); - SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_DEVICECLASS_MEMORY, PVRSRVUnmapDeviceClassMemoryBW); SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_MEM_INFO_TO_USER, DummyBW); SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_MEM_INFO_FROM_USER, DummyBW); SetDispatchTableEntry(PVRSRV_BRIDGE_EXPORT_DEVICEMEM, PVRSRVExportDeviceMemBW); @@ -5218,10 +4489,6 @@ CommonBridgeInit(IMG_VOID) SetDispatchTableEntry(PVRSRV_BRIDGE_CHG_DEV_MEM_ATTRIBS, PVRSRVChangeDeviceMemoryAttributesBW); SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_DEV_MEMORY_2, PVRSRVMapDeviceMemoryBW); SetDispatchTableEntry(PVRSRV_BRIDGE_EXPORT_DEVICEMEM_2, PVRSRVExportDeviceMemBW); - SetDispatchTableEntry(PVRSRV_BRIDGE_MULTI_MANAGE_DEV_MEM, PVRSRVMultiManageDevMemBW); - SetDispatchTableEntry(PVRSRV_BRIDGE_CORE_CMD_RESERVED_1, DummyBW); - SetDispatchTableEntry(PVRSRV_BRIDGE_CORE_CMD_RESERVED_2, DummyBW); - SetDispatchTableEntry(PVRSRV_BRIDGE_CORE_CMD_RESERVED_3, DummyBW); #if defined(SUPPORT_ION) SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_ION_HANDLE, PVRSRVMapIonHandleBW); SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_ION_HANDLE, PVRSRVUnmapIonHandleBW); @@ -5275,6 +4542,10 @@ CommonBridgeInit(IMG_VOID) /* DisplayClass APIs */ SetDispatchTableEntry(PVRSRV_BRIDGE_GET_OEMJTABLE, DummyBW); +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) + SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_DEVICECLASS_MEMORY, PVRSRVMapDeviceClassMemoryBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_DEVICECLASS_MEMORY, PVRSRVUnmapDeviceClassMemoryBW); + /* device class enum */ SetDispatchTableEntry(PVRSRV_BRIDGE_ENUM_CLASS, PVRSRVEnumerateDCBW); @@ -5305,6 +4576,37 @@ CommonBridgeInit(IMG_VOID) SetDispatchTableEntry(PVRSRV_BRIDGE_CLOSE_BUFFERCLASS_DEVICE, PVRSRVCloseBCDeviceBW); SetDispatchTableEntry(PVRSRV_BRIDGE_GET_BUFFERCLASS_INFO, PVRSRVGetBCInfoBW); SetDispatchTableEntry(PVRSRV_BRIDGE_GET_BUFFERCLASS_BUFFER, PVRSRVGetBCBufferBW); +#else /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ + SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_DEVICECLASS_MEMORY, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_DEVICECLASS_MEMORY, DummyBW); + + /* device class enum */ + SetDispatchTableEntry(PVRSRV_BRIDGE_ENUM_CLASS, DummyBW); + + /* display class API */ + SetDispatchTableEntry(PVRSRV_BRIDGE_OPEN_DISPCLASS_DEVICE, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_CLOSE_DISPCLASS_DEVICE, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_ENUM_DISPCLASS_FORMATS, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_ENUM_DISPCLASS_DIMS, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_GET_DISPCLASS_SYSBUFFER, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_GET_DISPCLASS_INFO, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_CREATE_DISPCLASS_SWAPCHAIN, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_DESTROY_DISPCLASS_SWAPCHAIN, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_SET_DISPCLASS_DSTRECT, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_SET_DISPCLASS_SRCRECT, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_SET_DISPCLASS_DSTCOLOURKEY, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_SET_DISPCLASS_SRCCOLOURKEY, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_GET_DISPCLASS_BUFFERS, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_BUFFER, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_BUFFER2, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_SWAP_DISPCLASS_TO_SYSTEM, DummyBW); + + /* buffer class API */ + SetDispatchTableEntry(PVRSRV_BRIDGE_OPEN_BUFFERCLASS_DEVICE, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_CLOSE_BUFFERCLASS_DEVICE, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_GET_BUFFERCLASS_INFO, DummyBW); + SetDispatchTableEntry(PVRSRV_BRIDGE_GET_BUFFERCLASS_BUFFER, DummyBW); +#endif /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ /* Wrap/Unwrap external memory */ SetDispatchTableEntry(PVRSRV_BRIDGE_WRAP_EXT_MEMORY, PVRSRVWrapExtMemoryBW); @@ -5416,6 +4718,7 @@ IMG_INT BridgedDispatchKM(PVRSRV_PER_PROCESS_DATA * psPerProc, case PVRSRV_GET_BRIDGE_ID(PVRSRV_BRIDGE_DISCONNECT_SERVICES): case PVRSRV_GET_BRIDGE_ID(PVRSRV_BRIDGE_INITSRV_CONNECT): case PVRSRV_GET_BRIDGE_ID(PVRSRV_BRIDGE_INITSRV_DISCONNECT): + case PVRSRV_GET_BRIDGE_ID(PVRSRV_BRIDGE_UM_KM_COMPAT_CHECK): break; default: PVR_DPF((PVR_DBG_ERROR, "%s: Driver initialisation not completed yet.", @@ -5476,15 +4779,21 @@ IMG_INT BridgedDispatchKM(PVRSRV_PER_PROCESS_DATA * psPerProc, __FUNCTION__, ui32BridgeID)); goto return_fault; } - pfBridgeHandler = - (BridgeWrapperFunction)g_BridgeDispatchTable[ui32BridgeID].pfFunction; - err = pfBridgeHandler(ui32BridgeID, + + if( ui32BridgeID == PVRSRV_GET_BRIDGE_ID(PVRSRV_BRIDGE_UM_KM_COMPAT_CHECK)) + PVRSRVCompatCheckKM(psBridgeIn, psBridgeOut); + else + { + pfBridgeHandler = + (BridgeWrapperFunction)g_BridgeDispatchTable[ui32BridgeID].pfFunction; + err = pfBridgeHandler(ui32BridgeID, psBridgeIn, psBridgeOut, psPerProc); - if(err < 0) - { - goto return_fault; + if(err < 0) + { + goto return_fault; + } } #if defined(__linux__) diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.h index b0145f7..0a1cc6e 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.h @@ -52,7 +52,7 @@ extern "C" { #if defined(__linux__) #define PVRSRV_GET_BRIDGE_ID(X) _IOC_NR(X) #else -#define PVRSRV_GET_BRIDGE_ID(X) ((X) - PVRSRV_IOWR(PVRSRV_BRIDGE_CORE_CMD_FIRST)) +#define PVRSRV_GET_BRIDGE_ID(X) ((X) - PVRSRV_IOWR(PVRSRV_BRIDGE_UMKM_CMD_FIRST)) #endif #ifndef ENOMEM @@ -99,7 +99,7 @@ CopyToUserWrapper(PVRSRV_PER_PROCESS_DATA *pProcData, #define ASSIGN_AND_EXIT_ON_ERROR(error, src) \ ASSIGN_AND_RETURN_ON_ERROR(error, src, 0) -#if defined (PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) #ifdef INLINE_IS_PRAGMA #pragma inline(NewHandleBatch) #endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_support.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_support.c index 25baf29..2ccdc66 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_support.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_support.c @@ -52,11 +52,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * handle. */ PVRSRV_ERROR -#if defined (SUPPORT_SID_INTERFACE) -PVRSRVLookupOSMemHandle(PVRSRV_HANDLE_BASE *psHandleBase, IMG_HANDLE *phOSMemHandle, IMG_SID hMHandle) -#else PVRSRVLookupOSMemHandle(PVRSRV_HANDLE_BASE *psHandleBase, IMG_HANDLE *phOSMemHandle, IMG_HANDLE hMHandle) -#endif { IMG_HANDLE hMHandleInt; PVRSRV_HANDLE_TYPE eHandleType; @@ -76,7 +72,7 @@ PVRSRVLookupOSMemHandle(PVRSRV_HANDLE_BASE *psHandleBase, IMG_HANDLE *phOSMemHan switch(eHandleType) { -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) case PVRSRV_HANDLE_TYPE_MEM_INFO: case PVRSRV_HANDLE_TYPE_MEM_INFO_REF: case PVRSRV_HANDLE_TYPE_SHARED_SYS_MEM_INFO: diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_support.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_support.h index 04d5168..e32fa88 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_support.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_support.h @@ -55,11 +55,7 @@ extern "C" { * Derive the internal OS specific memory handle from a secure * handle. */ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRSRVLookupOSMemHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phOSMemHandle, IMG_SID hMHandle); -#else PVRSRV_ERROR PVRSRVLookupOSMemHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phOSMemHandle, IMG_HANDLE hMHandle); -#endif #if defined (__cplusplus) } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c index 84c7e10..f23fd49 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/sgx/bridged_sgx_bridge.c @@ -141,9 +141,6 @@ SGXGetInternalDevInfoBW(IMG_UINT32 ui32BridgeID, PVRSRV_PER_PROCESS_DATA *psPerProc) { IMG_HANDLE hDevCookieInt; -#if defined (SUPPORT_SID_INTERFACE) - SGX_INTERNAL_DEVINFO_KM sSGXInternalDevInfo; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_GETINTERNALDEVINFO); @@ -159,11 +156,7 @@ SGXGetInternalDevInfoBW(IMG_UINT32 ui32BridgeID, psSGXGetInternalDevInfoOUT->eError = SGXGetInternalDevInfoKM(hDevCookieInt, -#if defined (SUPPORT_SID_INTERFACE) - &sSGXInternalDevInfo); -#else &psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo); -#endif /* * Handle is not allocated in batch mode, as there is no resource @@ -172,11 +165,7 @@ SGXGetInternalDevInfoBW(IMG_UINT32 ui32BridgeID, psSGXGetInternalDevInfoOUT->eError = PVRSRVAllocHandle(psPerProc->psHandleBase, &psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.hHostCtlKernelMemInfoHandle, -#if defined (SUPPORT_SID_INTERFACE) - sSGXInternalDevInfo.hHostCtlKernelMemInfoHandle, -#else psSGXGetInternalDevInfoOUT->sSGXInternalDevInfo.hHostCtlKernelMemInfoHandle, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO, PVRSRV_HANDLE_ALLOC_FLAG_SHARED); @@ -194,12 +183,7 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, IMG_UINT32 i; IMG_INT ret = 0; IMG_UINT32 ui32NumDstSyncs; -#if defined (SUPPORT_SID_INTERFACE) - SGX_CCB_KICK_KM sCCBKickKM = {{0}}; - IMG_HANDLE ahSyncInfoHandles[16]; -#else IMG_HANDLE *phKernelSyncInfoHandles = IMG_NULL; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DOKICK); @@ -216,11 +200,7 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.hCCBKernelMemInfo, -#else &psDoKickIN->sCCBKick.hCCBKernelMemInfo, -#endif psDoKickIN->sCCBKick.hCCBKernelMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); @@ -229,24 +209,11 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - if (psDoKickIN->sCCBKick.ui32NumDstSyncObjects > 16) - { - return 0; - } - - if(psDoKickIN->sCCBKick.hTA3DSyncInfo != 0) -#else if(psDoKickIN->sCCBKick.hTA3DSyncInfo != IMG_NULL) -#endif { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.hTA3DSyncInfo, -#else &psDoKickIN->sCCBKick.hTA3DSyncInfo, -#endif psDoKickIN->sCCBKick.hTA3DSyncInfo, PVRSRV_HANDLE_TYPE_SYNC_INFO); @@ -256,19 +223,11 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, } } -#if defined (SUPPORT_SID_INTERFACE) - if(psDoKickIN->sCCBKick.hTASyncInfo != 0) -#else if(psDoKickIN->sCCBKick.hTASyncInfo != IMG_NULL) -#endif { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.hTASyncInfo, -#else &psDoKickIN->sCCBKick.hTASyncInfo, -#endif psDoKickIN->sCCBKick.hTASyncInfo, PVRSRV_HANDLE_TYPE_SYNC_INFO); @@ -292,19 +251,11 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, } #endif -#if defined (SUPPORT_SID_INTERFACE) - if(psDoKickIN->sCCBKick.h3DSyncInfo != 0) -#else if(psDoKickIN->sCCBKick.h3DSyncInfo != IMG_NULL) -#endif { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.h3DSyncInfo, -#else &psDoKickIN->sCCBKick.h3DSyncInfo, -#endif psDoKickIN->sCCBKick.h3DSyncInfo, PVRSRV_HANDLE_TYPE_SYNC_INFO); @@ -323,18 +274,11 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - sCCBKickKM.ui32NumTASrcSyncs = psDoKickIN->sCCBKick.ui32NumTASrcSyncs; -#endif for(i=0; i<psDoKickIN->sCCBKick.ui32NumTASrcSyncs; i++) { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.ahTASrcKernelSyncInfo[i], -#else &psDoKickIN->sCCBKick.ahTASrcKernelSyncInfo[i], -#endif psDoKickIN->sCCBKick.ahTASrcKernelSyncInfo[i], PVRSRV_HANDLE_TYPE_SYNC_INFO); @@ -350,18 +294,11 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - sCCBKickKM.ui32NumTADstSyncs = psDoKickIN->sCCBKick.ui32NumTADstSyncs; -#endif for(i=0; i<psDoKickIN->sCCBKick.ui32NumTADstSyncs; i++) { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.ahTADstKernelSyncInfo[i], -#else &psDoKickIN->sCCBKick.ahTADstKernelSyncInfo[i], -#endif psDoKickIN->sCCBKick.ahTADstKernelSyncInfo[i], PVRSRV_HANDLE_TYPE_SYNC_INFO); @@ -377,18 +314,11 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - sCCBKickKM.ui32Num3DSrcSyncs = psDoKickIN->sCCBKick.ui32Num3DSrcSyncs; -#endif for(i=0; i<psDoKickIN->sCCBKick.ui32Num3DSrcSyncs; i++) { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.ah3DSrcKernelSyncInfo[i], -#else &psDoKickIN->sCCBKick.ah3DSrcKernelSyncInfo[i], -#endif psDoKickIN->sCCBKick.ah3DSrcKernelSyncInfo[i], PVRSRV_HANDLE_TYPE_SYNC_INFO); @@ -405,18 +335,12 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - sCCBKickKM.ui32NumSrcSyncs = psDoKickIN->sCCBKick.ui32NumSrcSyncs; -#endif +#if !defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) for(i=0; i<psDoKickIN->sCCBKick.ui32NumSrcSyncs; i++) { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.ahSrcKernelSyncInfo[i], -#else &psDoKickIN->sCCBKick.ahSrcKernelSyncInfo[i], -#endif psDoKickIN->sCCBKick.ahSrcKernelSyncInfo[i], PVRSRV_HANDLE_TYPE_SYNC_INFO); @@ -425,7 +349,8 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, return 0; } } -#endif/* #if defined(SUPPORT_SGX_GENERALISED_SYNCOBJECTS) */ +#endif /* !defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ +#endif /* defined(SUPPORT_SGX_GENERALISED_SYNCOBJECTS) */ if (psDoKickIN->sCCBKick.ui32NumTAStatusVals > SGX_MAX_TA_STATUS_VALS) { @@ -437,25 +362,14 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = #if defined(SUPPORT_SGX_NEW_STATUS_VALS) PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.asTAStatusUpdate[i].hKernelMemInfo, -#else &psDoKickIN->sCCBKick.asTAStatusUpdate[i].hKernelMemInfo, -#endif psDoKickIN->sCCBKick.asTAStatusUpdate[i].hKernelMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); -#if defined (SUPPORT_SID_INTERFACE) - sCCBKickKM.asTAStatusUpdate[i].sCtlStatus = psDoKickIN->sCCBKick.asTAStatusUpdate[i].sCtlStatus; -#endif #else PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.ahTAStatusSyncInfo[i], -#else &psDoKickIN->sCCBKick.ahTAStatusSyncInfo[i], -#endif psDoKickIN->sCCBKick.ahTAStatusSyncInfo[i], PVRSRV_HANDLE_TYPE_SYNC_INFO); #endif @@ -475,24 +389,13 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = #if defined(SUPPORT_SGX_NEW_STATUS_VALS) PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.as3DStatusUpdate[i].hKernelMemInfo, -#else &psDoKickIN->sCCBKick.as3DStatusUpdate[i].hKernelMemInfo, -#endif psDoKickIN->sCCBKick.as3DStatusUpdate[i].hKernelMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); -#if defined (SUPPORT_SID_INTERFACE) - sCCBKickKM.as3DStatusUpdate[i].sCtlStatus = psDoKickIN->sCCBKick.as3DStatusUpdate[i].sCtlStatus; -#endif #else PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.ah3DStatusSyncInfo[i], -#else &psDoKickIN->sCCBKick.ah3DStatusSyncInfo[i], -#endif psDoKickIN->sCCBKick.ah3DStatusSyncInfo[i], PVRSRV_HANDLE_TYPE_SYNC_INFO); #endif @@ -526,9 +429,6 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - sCCBKickKM.pahDstSyncHandles = phKernelSyncInfoHandles; -#else if(CopyFromUserWrapper(psPerProc, ui32BridgeID, phKernelSyncInfoHandles, @@ -541,17 +441,12 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, /* Set sCCBKick.pahDstSyncHandles to point to the local memory */ psDoKickIN->sCCBKick.pahDstSyncHandles = phKernelSyncInfoHandles; -#endif for( i = 0; i < ui32NumDstSyncs; i++) { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.pahDstSyncHandles[i], -#else &psDoKickIN->sCCBKick.pahDstSyncHandles[i], -#endif psDoKickIN->sCCBKick.pahDstSyncHandles[i], PVRSRV_HANDLE_TYPE_SYNC_INFO); @@ -564,11 +459,7 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM.hKernelHWSyncListMemInfo, -#else &psDoKickIN->sCCBKick.hKernelHWSyncListMemInfo, -#endif psDoKickIN->sCCBKick.hKernelHWSyncListMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); @@ -578,34 +469,9 @@ SGXDoKickBW(IMG_UINT32 ui32BridgeID, } } -#if defined (SUPPORT_SID_INTERFACE) - OSMemCopy(&sCCBKickKM.sCommand, &psDoKickIN->sCCBKick.sCommand, sizeof(sCCBKickKM.sCommand)); - - sCCBKickKM.ui32NumDstSyncObjects = psDoKickIN->sCCBKick.ui32NumDstSyncObjects; - sCCBKickKM.ui32NumTAStatusVals = psDoKickIN->sCCBKick.ui32NumTAStatusVals; - sCCBKickKM.ui32Num3DStatusVals = psDoKickIN->sCCBKick.ui32Num3DStatusVals; - sCCBKickKM.bFirstKickOrResume = psDoKickIN->sCCBKick.bFirstKickOrResume; - sCCBKickKM.ui32CCBOffset = psDoKickIN->sCCBKick.ui32CCBOffset; - sCCBKickKM.bTADependency = psDoKickIN->sCCBKick.bTADependency; - -#if defined(NO_HARDWARE) || defined(PDUMP) - sCCBKickKM.bTerminateOrAbort = psDoKickIN->sCCBKick.bTerminateOrAbort; -#endif -#if defined(PDUMP) - sCCBKickKM.ui32CCBDumpWOff = psDoKickIN->sCCBKick.ui32CCBDumpWOff; -#endif - -#if defined(NO_HARDWARE) - sCCBKickKM.ui32WriteOpsPendingVal = psDoKickIN->sCCBKick.ui32WriteOpsPendingVal; -#endif -#endif /* #if defined (SUPPORT_SID_INTERFACE) */ psRetOUT->eError = SGXDoKickKM(hDevCookieInt, -#if defined (SUPPORT_SID_INTERFACE) - &sCCBKickKM); -#else &psDoKickIN->sCCBKick); -#endif PVRSRV_BRIDGE_SGX_DOKICK_RETURN_RESULT: @@ -657,9 +523,6 @@ SGXSubmitTransferBW(IMG_UINT32 ui32BridgeID, { IMG_HANDLE hDevCookieInt; PVRSRV_TRANSFER_SGX_KICK *psKick; -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_TRANSFER_SGX_KICK_KM sKickKM = {0}; -#endif IMG_UINT32 i; PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_SUBMITTRANSFER); @@ -693,11 +556,7 @@ SGXSubmitTransferBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sKickKM.hCCBMemInfo, -#else &psKick->hCCBMemInfo, -#endif psKick->hCCBMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if(psRetOUT->eError != PVRSRV_OK) @@ -709,11 +568,7 @@ SGXSubmitTransferBW(IMG_UINT32 ui32BridgeID, { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sKickKM.hTASyncInfo, -#else &psKick->hTASyncInfo, -#endif psKick->hTASyncInfo, PVRSRV_HANDLE_TYPE_SYNC_INFO); if(psRetOUT->eError != PVRSRV_OK) @@ -726,11 +581,7 @@ SGXSubmitTransferBW(IMG_UINT32 ui32BridgeID, { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sKickKM.h3DSyncInfo, -#else &psKick->h3DSyncInfo, -#endif psKick->h3DSyncInfo, PVRSRV_HANDLE_TYPE_SYNC_INFO); if(psRetOUT->eError != PVRSRV_OK) @@ -748,11 +599,7 @@ SGXSubmitTransferBW(IMG_UINT32 ui32BridgeID, { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sKickKM.ahSrcSyncInfo[i], -#else &psKick->ahSrcSyncInfo[i], -#endif psKick->ahSrcSyncInfo[i], PVRSRV_HANDLE_TYPE_SYNC_INFO); if(psRetOUT->eError != PVRSRV_OK) @@ -770,11 +617,7 @@ SGXSubmitTransferBW(IMG_UINT32 ui32BridgeID, { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sKickKM.ahDstSyncInfo[i], -#else &psKick->ahDstSyncInfo[i], -#endif psKick->ahDstSyncInfo[i], PVRSRV_HANDLE_TYPE_SYNC_INFO); if(psRetOUT->eError != PVRSRV_OK) @@ -783,21 +626,7 @@ SGXSubmitTransferBW(IMG_UINT32 ui32BridgeID, } } -#if defined (SUPPORT_SID_INTERFACE) - sKickKM.sHWTransferContextDevVAddr = psKick->sHWTransferContextDevVAddr; - sKickKM.ui32SharedCmdCCBOffset = psKick->ui32SharedCmdCCBOffset; - sKickKM.ui32NumSrcSync = psKick->ui32NumSrcSync; - sKickKM.ui32NumDstSync = psKick->ui32NumDstSync; - sKickKM.ui32Flags = psKick->ui32Flags; - sKickKM.ui32PDumpFlags = psKick->ui32PDumpFlags; -#if defined(PDUMP) - sKickKM.ui32CCBDumpWOff = psKick->ui32CCBDumpWOff; -#endif - - psRetOUT->eError = SGXSubmitTransferKM(hDevCookieInt, &sKickKM); -#else psRetOUT->eError = SGXSubmitTransferKM(hDevCookieInt, psKick); -#endif return 0; } @@ -896,9 +725,6 @@ SGXSubmit2DBW(IMG_UINT32 ui32BridgeID, { IMG_HANDLE hDevCookieInt; PVRSRV_2D_SGX_KICK *psKick; -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_2D_SGX_KICK_KM sKickKM; -#endif IMG_UINT32 i; PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_SUBMIT2D); @@ -935,11 +761,7 @@ SGXSubmit2DBW(IMG_UINT32 ui32BridgeID, psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sKickKM.hCCBMemInfo, -#else &psKick->hCCBMemInfo, -#endif psKick->hCCBMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if(psRetOUT->eError != PVRSRV_OK) @@ -947,19 +769,11 @@ SGXSubmit2DBW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - if (psKick->hTASyncInfo != 0) -#else if (psKick->hTASyncInfo != IMG_NULL) -#endif { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sKickKM.hTASyncInfo, -#else &psKick->hTASyncInfo, -#endif psKick->hTASyncInfo, PVRSRV_HANDLE_TYPE_SYNC_INFO); if(psRetOUT->eError != PVRSRV_OK) @@ -967,22 +781,12 @@ SGXSubmit2DBW(IMG_UINT32 ui32BridgeID, return 0; } } -#if defined (SUPPORT_SID_INTERFACE) - else - { - sKickKM.hTASyncInfo = IMG_NULL; - } -#endif if (psKick->h3DSyncInfo != IMG_NULL) { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sKickKM.h3DSyncInfo, -#else &psKick->h3DSyncInfo, -#endif psKick->h3DSyncInfo, PVRSRV_HANDLE_TYPE_SYNC_INFO); if(psRetOUT->eError != PVRSRV_OK) @@ -990,39 +794,12 @@ SGXSubmit2DBW(IMG_UINT32 ui32BridgeID, return 0; } } -#if defined (SUPPORT_SID_INTERFACE) - else - { - sKickKM.h3DSyncInfo = IMG_NULL; - } -#endif if (psKick->ui32NumSrcSync > SGX_MAX_2D_SRC_SYNC_OPS) { psRetOUT->eError = PVRSRV_ERROR_INVALID_PARAMS; return 0; } -#if defined (SUPPORT_SID_INTERFACE) - for (i = 0; i < SGX_MAX_2D_SRC_SYNC_OPS; i++) - { - if (i < psKick->ui32NumSrcSync) - { - psRetOUT->eError = - PVRSRVLookupHandle(psPerProc->psHandleBase, - &sKickKM.ahSrcSyncInfo[i], - psKick->ahSrcSyncInfo[i], - PVRSRV_HANDLE_TYPE_SYNC_INFO); - if(psRetOUT->eError != PVRSRV_OK) - { - return 0; - } - } - else - { - sKickKM.ahSrcSyncInfo[i] = IMG_NULL; - } - } -#else for (i = 0; i < psKick->ui32NumSrcSync; i++) { psRetOUT->eError = @@ -1035,17 +812,12 @@ SGXSubmit2DBW(IMG_UINT32 ui32BridgeID, return 0; } } -#endif if (psKick->hDstSyncInfo != IMG_NULL) { psRetOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &sKickKM.hDstSyncInfo, -#else &psKick->hDstSyncInfo, -#endif psKick->hDstSyncInfo, PVRSRV_HANDLE_TYPE_SYNC_INFO); if(psRetOUT->eError != PVRSRV_OK) @@ -1053,28 +825,9 @@ SGXSubmit2DBW(IMG_UINT32 ui32BridgeID, return 0; } } -#if defined (SUPPORT_SID_INTERFACE) - else - { - sKickKM.hDstSyncInfo = IMG_NULL; - } - - /* copy common members across */ - sKickKM.ui32SharedCmdCCBOffset = psKick->ui32SharedCmdCCBOffset; - sKickKM.ui32NumSrcSync = psKick->ui32NumSrcSync; - sKickKM.ui32PDumpFlags = psKick->ui32PDumpFlags; - sKickKM.sHW2DContextDevVAddr = psKick->sHW2DContextDevVAddr; -#if defined(PDUMP) - sKickKM.ui32CCBDumpWOff = psKick->ui32CCBDumpWOff; -#endif -#endif psRetOUT->eError = -#if defined (SUPPORT_SID_INTERFACE) - SGXSubmit2DKM(hDevCookieInt, &sKickKM); -#else SGXSubmit2DKM(hDevCookieInt, psKick); -#endif return 0; } @@ -1230,19 +983,12 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, PVRSRV_PER_PROCESS_DATA *psPerProc) { IMG_HANDLE hDevCookieInt; -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_ERROR eError = PVRSRV_OK; -#else PVRSRV_ERROR eError; -#endif IMG_BOOL bDissociateFailed = IMG_FALSE; IMG_BOOL bLookupFailed = IMG_FALSE; IMG_BOOL bReleaseFailed = IMG_FALSE; IMG_HANDLE hDummy; IMG_UINT32 i; -#if defined (SUPPORT_SID_INTERFACE) - SGX_BRIDGE_INIT_INFO_KM asInitInfoKM = {0}; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_DEVINITPART2); @@ -1264,7 +1010,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, { return 0; } - + /* Check all the meminfo handles */ eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &hDummy, @@ -1372,28 +1118,6 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, bLookupFailed = IMG_TRUE; } -#if defined(FIX_HW_BRN_29702) - eError = PVRSRVLookupHandle(psPerProc->psHandleBase, - &hDummy, - psSGXDevInitPart2IN->sInitInfo.hKernelCFIMemInfo, - PVRSRV_HANDLE_TYPE_MEM_INFO); - if (eError != PVRSRV_OK) - { - bLookupFailed = IMG_TRUE; - } -#endif - -#if defined(FIX_HW_BRN_29823) - eError = PVRSRVLookupHandle(psPerProc->psHandleBase, - &hDummy, - psSGXDevInitPart2IN->sInitInfo.hKernelDummyTermStreamMemInfo, - PVRSRV_HANDLE_TYPE_MEM_INFO); - if (eError != PVRSRV_OK) - { - bLookupFailed = IMG_TRUE; - } -#endif - #if defined(FIX_HW_BRN_31542) || defined(FIX_HW_BRN_36513) eError = PVRSRVLookupHandle(psPerProc->psHandleBase, @@ -1488,17 +1212,9 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hHandle = psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i]; -#else IMG_HANDLE hHandle = psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i]; -#endif -#if defined (SUPPORT_SID_INTERFACE) - if (hHandle == 0) -#else if (hHandle == IMG_NULL) -#endif { continue; } @@ -1522,11 +1238,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, /* Lookup and release the device memory handles */ eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelCCBMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelCCBMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelCCBMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1535,11 +1247,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, } eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelCCBCtlMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelCCBCtlMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelCCBCtlMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1548,11 +1256,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, } eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelCCBEventKickerMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelCCBEventKickerMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelCCBEventKickerMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1562,11 +1266,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelSGXHostCtlMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelSGXHostCtlMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelSGXHostCtlMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1575,11 +1275,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, } eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelSGXTA3DCtlMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelSGXTA3DCtlMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelSGXTA3DCtlMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1589,11 +1285,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, #if defined(FIX_HW_BRN_31272) || defined(FIX_HW_BRN_31780) || defined(FIX_HW_BRN_33920) eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelSGXPTLAWriteBackMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelSGXPTLAWriteBackMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelSGXPTLAWriteBackMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1603,11 +1295,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, #endif eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelSGXMiscMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelSGXMiscMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelSGXMiscMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1618,11 +1306,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, #if defined(SGX_SUPPORT_HWPROFILING) eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelHWProfilingMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelHWProfilingMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelHWProfilingMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1633,11 +1317,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, #if defined(SUPPORT_SGX_HWPERF) eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelHWPerfCBMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelHWPerfCBMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelHWPerfCBMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1647,11 +1327,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, #endif eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelTASigBufferMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelTASigBufferMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelTASigBufferMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1660,11 +1336,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, } eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernel3DSigBufferMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernel3DSigBufferMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernel3DSigBufferMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1672,44 +1344,10 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, bReleaseFailed = IMG_TRUE; } -#if defined(FIX_HW_BRN_29702) - eError = PVRSRVLookupHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelCFIMemInfo, -#else - &psSGXDevInitPart2IN->sInitInfo.hKernelCFIMemInfo, -#endif - psSGXDevInitPart2IN->sInitInfo.hKernelCFIMemInfo, - PVRSRV_HANDLE_TYPE_MEM_INFO); - if (eError != PVRSRV_OK) - { - bLookupFailed = IMG_TRUE; - } -#endif - -#if defined(FIX_HW_BRN_29823) - eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelDummyTermStreamMemInfo, -#else - &psSGXDevInitPart2IN->sInitInfo.hKernelDummyTermStreamMemInfo, -#endif - psSGXDevInitPart2IN->sInitInfo.hKernelDummyTermStreamMemInfo, - PVRSRV_HANDLE_TYPE_MEM_INFO); - if (eError != PVRSRV_OK) - { - bReleaseFailed = IMG_TRUE; - } -#endif - #if defined(FIX_HW_BRN_31542) || defined(FIX_HW_BRN_36513) eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelClearClipWAVDMStreamMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAVDMStreamMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAVDMStreamMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1717,11 +1355,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, bReleaseFailed = IMG_TRUE; } eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelClearClipWAIndexStreamMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAIndexStreamMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAIndexStreamMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1729,11 +1363,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, bReleaseFailed = IMG_TRUE; } eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelClearClipWAPDSMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPDSMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPDSMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1741,11 +1371,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, bReleaseFailed = IMG_TRUE; } eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelClearClipWAUSEMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAUSEMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAUSEMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1753,11 +1379,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, bReleaseFailed = IMG_TRUE; } eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelClearClipWAParamMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAParamMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAParamMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1765,11 +1387,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, bReleaseFailed = IMG_TRUE; } eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelClearClipWAPMPTMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPMPTMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPMPTMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1777,11 +1395,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, bReleaseFailed = IMG_TRUE; } eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelClearClipWATPCMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWATPCMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWATPCMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1789,11 +1403,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, bReleaseFailed = IMG_TRUE; } eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelClearClipWAPSGRgnHdrMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPSGRgnHdrMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPSGRgnHdrMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1815,11 +1425,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, #if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - &asInitInfoKM.hKernelEDMStatusBufferMemInfo, -#else &psSGXDevInitPart2IN->sInitInfo.hKernelEDMStatusBufferMemInfo, -#endif psSGXDevInitPart2IN->sInitInfo.hKernelEDMStatusBufferMemInfo, PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) @@ -1830,26 +1436,14 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hHandle = psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i]; - IMG_HANDLE *phHandleKM = &asInitInfoKM.asInitMemHandles[i]; - - if (hHandle == 0) -#else IMG_HANDLE *phHandle = &psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i]; if (*phHandle == IMG_NULL) -#endif continue; eError = PVRSRVLookupAndReleaseHandle(psPerProc->psHandleBase, -#if defined (SUPPORT_SID_INTERFACE) - phHandleKM, - hHandle, -#else phHandle, *phHandle, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); if (eError != PVRSRV_OK) { @@ -1870,62 +1464,38 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, } /* Dissociate device memory from caller */ -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCCBMemInfo); -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCCBMemInfo); -#endif if (eError != PVRSRV_OK) { bDissociateFailed = IMG_TRUE; } -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCCBCtlMemInfo); -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCCBCtlMemInfo); -#endif if (eError != PVRSRV_OK) { bDissociateFailed = IMG_TRUE; } -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCCBEventKickerMemInfo); -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCCBEventKickerMemInfo); -#endif if (eError != PVRSRV_OK) { bDissociateFailed = IMG_TRUE; } -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXHostCtlMemInfo); -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXHostCtlMemInfo); -#endif if (eError != PVRSRV_OK) { bDissociateFailed = IMG_TRUE; } -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXTA3DCtlMemInfo); -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXTA3DCtlMemInfo); -#endif if (eError != PVRSRV_OK) { bDissociateFailed = IMG_TRUE; } #if defined(FIX_HW_BRN_31272) || defined(FIX_HW_BRN_31780) || defined(FIX_HW_BRN_33920) -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXPTLAWriteBackMemInfo); -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXPTLAWriteBackMemInfo); -#endif if (eError != PVRSRV_OK) { bDissociateFailed = IMG_TRUE; @@ -1933,11 +1503,7 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, #endif /* Dissociate SGX MiscInfo buffer from user space */ -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXMiscMemInfo); -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXMiscMemInfo); -#endif if (eError != PVRSRV_OK) { bDissociateFailed = IMG_TRUE; @@ -1945,158 +1511,48 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, #if defined(SGX_SUPPORT_HWPROFILING) -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelHWProfilingMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelHWProfilingMemInfo); bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); #endif -#endif #if defined(SUPPORT_SGX_HWPERF) -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelHWPerfCBMemInfo); -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelHWPerfCBMemInfo); -#endif if (eError != PVRSRV_OK) { bDissociateFailed = IMG_TRUE; } #endif -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelTASigBufferMemInfo); -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelTASigBufferMemInfo); -#endif if (eError != PVRSRV_OK) { bDissociateFailed = IMG_TRUE; } -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernel3DSigBufferMemInfo); -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernel3DSigBufferMemInfo); -#endif if (eError != PVRSRV_OK) { bDissociateFailed = IMG_TRUE; } -#if defined(FIX_HW_BRN_29702) -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCFIMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCFIMemInfo); - bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); -#endif -#endif - -#if defined(FIX_HW_BRN_29823) -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelDummyTermStreamMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelDummyTermStreamMemInfo); - bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); -#endif -#endif - #if defined(FIX_HW_BRN_31542) || defined(FIX_HW_BRN_36513) -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAVDMStreamMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAVDMStreamMemInfo); bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); -#endif -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAIndexStreamMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAIndexStreamMemInfo); bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); -#endif -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAPDSMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPDSMemInfo); bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); -#endif -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAUSEMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAUSEMemInfo); bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); -#endif -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAParamMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAParamMemInfo); bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); -#endif -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAPMPTMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPMPTMemInfo); bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); -#endif -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWATPCMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWATPCMemInfo); bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); -#endif -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelClearClipWAPSGRgnHdrMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelClearClipWAPSGRgnHdrMemInfo); bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); #endif -#endif #if defined(SGX_FEATURE_VDM_CONTEXT_SWITCH) && \ defined(FIX_HW_BRN_33657) && defined(SUPPORT_SECURE_33657_FIX) @@ -2105,25 +1561,13 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, #endif #if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) -#if defined (SUPPORT_SID_INTERFACE) - eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelEDMStatusBufferMemInfo); - if (eError != PVRSRV_OK) - { - bDissociateFailed = IMG_TRUE; - } -#else eError = PVRSRVDissociateDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelEDMStatusBufferMemInfo); bDissociateFailed |= (IMG_BOOL)(eError != PVRSRV_OK); #endif -#endif for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) { -#if defined (SUPPORT_SID_INTERFACE) - IMG_HANDLE hHandle = asInitInfoKM.asInitMemHandles[i]; -#else IMG_HANDLE hHandle = psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i]; -#endif if (hHandle == IMG_NULL) continue; @@ -2138,16 +1582,6 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, /* If any dissociations failed, free all the device memory passed in */ if(bDissociateFailed) { -#if defined (SUPPORT_SID_INTERFACE) - PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCCBMemInfo); - PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelCCBCtlMemInfo); - PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXHostCtlMemInfo); - PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXTA3DCtlMemInfo); -#if defined(FIX_HW_BRN_31272) || defined(FIX_HW_BRN_31780) || defined(FIX_HW_BRN_33920) - PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXPTLAWriteBackMemInfo); -#endif - PVRSRVFreeDeviceMemKM(hDevCookieInt, asInitInfoKM.hKernelSGXMiscMemInfo); -#else PVRSRVFreeDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCCBMemInfo); PVRSRVFreeDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelCCBCtlMemInfo); PVRSRVFreeDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXHostCtlMemInfo); @@ -2156,19 +1590,12 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, PVRSRVFreeDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXPTLAWriteBackMemInfo); #endif PVRSRVFreeDeviceMemKM(hDevCookieInt, psSGXDevInitPart2IN->sInitInfo.hKernelSGXMiscMemInfo); -#endif for (i = 0; i < SGX_MAX_INIT_MEM_HANDLES; i++) { -#if defined (SUPPORT_SID_INTERFACE) - IMG_HANDLE hHandle = asInitInfoKM.asInitMemHandles[i]; - - if (hHandle == 0) -#else IMG_HANDLE hHandle = psSGXDevInitPart2IN->sInitInfo.asInitMemHandles[i]; if (hHandle == IMG_NULL) -#endif continue; PVRSRVFreeDeviceMemKM(hDevCookieInt, (PVRSRV_KERNEL_MEM_INFO *)hHandle); @@ -2184,33 +1611,10 @@ SGXDevInitPart2BW(IMG_UINT32 ui32BridgeID, return 0; } -#if defined (SUPPORT_SID_INTERFACE) - asInitInfoKM.sScripts = psSGXDevInitPart2IN->sInitInfo.sScripts; - asInitInfoKM.ui32ClientBuildOptions = psSGXDevInitPart2IN->sInitInfo.ui32ClientBuildOptions; - asInitInfoKM.sSGXStructSizes = psSGXDevInitPart2IN->sInitInfo.sSGXStructSizes; - asInitInfoKM.ui32CacheControl = psSGXDevInitPart2IN->sInitInfo.ui32CacheControl; - asInitInfoKM.ui32EDMTaskReg0 = psSGXDevInitPart2IN->sInitInfo.ui32EDMTaskReg0; - asInitInfoKM.ui32EDMTaskReg1 = psSGXDevInitPart2IN->sInitInfo.ui32EDMTaskReg1; - asInitInfoKM.ui32ClkGateStatusReg = psSGXDevInitPart2IN->sInitInfo.ui32ClkGateStatusReg; - asInitInfoKM.ui32ClkGateStatusMask = psSGXDevInitPart2IN->sInitInfo.ui32ClkGateStatusMask; - - OSMemCopy(&asInitInfoKM.asInitDevData , - &psSGXDevInitPart2IN->sInitInfo.asInitDevData, - sizeof(asInitInfoKM.asInitDevData)); - OSMemCopy(&asInitInfoKM.aui32HostKickAddr, - &psSGXDevInitPart2IN->sInitInfo.aui32HostKickAddr, - sizeof(asInitInfoKM.aui32HostKickAddr)); - - psSGXDevInitPart2OUT->eError = - DevInitSGXPart2KM(psPerProc, - hDevCookieInt, - &asInitInfoKM); -#else psSGXDevInitPart2OUT->eError = DevInitSGXPart2KM(psPerProc, hDevCookieInt, &psSGXDevInitPart2IN->sInitInfo); -#endif return 0; } @@ -2359,11 +1763,7 @@ SGXUnregisterHWTransferContextBW(IMG_UINT32 ui32BridgeID, PVRSRV_BRIDGE_RETURN *psRetOUT, PVRSRV_PER_PROCESS_DATA *psPerProc) { -#if defined (SUPPORT_SID_INTERFACE) - IMG_HANDLE hHWTransferContextInt = 0; -#else IMG_HANDLE hHWTransferContextInt; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_UNREGISTER_HW_TRANSFER_CONTEXT); @@ -2740,11 +2140,7 @@ SGXAddSharedPBDescBW(IMG_UINT32 ui32BridgeID, IMG_UINT32 ui32KernelMemInfoHandlesCount = psSGXAddSharedPBDescIN->ui32KernelMemInfoHandlesCount; IMG_INT ret = 0; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID *phKernelMemInfoHandles = 0; -#else IMG_HANDLE *phKernelMemInfoHandles = IMG_NULL; -#endif PVRSRV_KERNEL_MEM_INFO **ppsKernelMemInfos = IMG_NULL; IMG_UINT32 i; PVRSRV_ERROR eError; @@ -2954,9 +2350,6 @@ SGXGetInfoForSrvinitBW(IMG_UINT32 ui32BridgeID, { IMG_HANDLE hDevCookieInt; IMG_UINT32 i; -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_HEAP_INFO_KM asHeapInfo[PVRSRV_MAX_CLIENT_HEAPS]; -#endif PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGXINFO_FOR_SRVINIT); NEW_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc, PVRSRV_MAX_CLIENT_HEAPS); @@ -2979,12 +2372,7 @@ SGXGetInfoForSrvinitBW(IMG_UINT32 ui32BridgeID, psSGXInfoForSrvinitOUT->eError = SGXGetInfoForSrvinitKM(hDevCookieInt, -#if defined (SUPPORT_SID_INTERFACE) - &asHeapInfo[0], - &psSGXInfoForSrvinitOUT->sInitInfo.sPDDevPAddr); -#else &psSGXInfoForSrvinitOUT->sInitInfo); -#endif if(psSGXInfoForSrvinitOUT->eError != PVRSRV_OK) { @@ -2997,28 +2385,6 @@ SGXGetInfoForSrvinitBW(IMG_UINT32 ui32BridgeID, psHeapInfo = &psSGXInfoForSrvinitOUT->sInitInfo.asHeapInfo[i]; -#if defined (SUPPORT_SID_INTERFACE) - if ((asHeapInfo[i].ui32HeapID != (IMG_UINT32)SGX_UNDEFINED_HEAP_ID) && - (asHeapInfo[i].hDevMemHeap != IMG_NULL)) - { - /* Allocate heap handle */ - PVRSRVAllocHandleNR(psPerProc->psHandleBase, - &psHeapInfo->hDevMemHeap, - asHeapInfo[i].hDevMemHeap, - PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP, - PVRSRV_HANDLE_ALLOC_FLAG_SHARED); - } - else - { - psHeapInfo->hDevMemHeap = 0; - } - - psHeapInfo->ui32HeapID = asHeapInfo[i].ui32HeapID; - psHeapInfo->sDevVAddrBase = asHeapInfo[i].sDevVAddrBase; - psHeapInfo->ui32HeapByteSize = asHeapInfo[i].ui32HeapByteSize; - psHeapInfo->ui32Attribs = asHeapInfo[i].ui32Attribs; - psHeapInfo->ui32XTileStride = asHeapInfo[i].ui32XTileStride; -#else if (psHeapInfo->ui32HeapID != (IMG_UINT32)SGX_UNDEFINED_HEAP_ID) { IMG_HANDLE hDevMemHeapExt; @@ -3034,7 +2400,6 @@ SGXGetInfoForSrvinitBW(IMG_UINT32 ui32BridgeID, psHeapInfo->hDevMemHeap = hDevMemHeapExt; } } -#endif } COMMIT_HANDLE_BATCH_OR_ERROR(psSGXInfoForSrvinitOUT->eError, psPerProc); @@ -3052,11 +2417,7 @@ SGXGetInfoForSrvinitBW(IMG_UINT32 ui32BridgeID, *****************************************************************************/ static IMG_VOID DumpBufferArray(PVRSRV_PER_PROCESS_DATA *psPerProc, -#if defined (SUPPORT_SID_INTERFACE) - PSGX_KICKTA_DUMP_BUFFER_KM psBufferArray, -#else PSGX_KICKTA_DUMP_BUFFER psBufferArray, -#endif IMG_UINT32 ui32BufferArrayLength, IMG_BOOL bDumpPolls) { @@ -3064,11 +2425,7 @@ DumpBufferArray(PVRSRV_PER_PROCESS_DATA *psPerProc, for (i=0; i<ui32BufferArrayLength; i++) { -#if defined (SUPPORT_SID_INTERFACE) - PSGX_KICKTA_DUMP_BUFFER_KM psBuffer; -#else PSGX_KICKTA_DUMP_BUFFER psBuffer; -#endif PVRSRV_KERNEL_MEM_INFO *psCtrlMemInfoKM; IMG_CHAR * pszName; IMG_HANDLE hUniqueTag; @@ -3180,17 +2537,12 @@ SGXPDumpBufferArrayBW(IMG_UINT32 ui32BridgeID, PVRSRV_PER_PROCESS_DATA *psPerProc) { IMG_UINT32 i; -#if defined (SUPPORT_SID_INTERFACE) - SGX_KICKTA_DUMP_BUFFER *psUMPtr; - SGX_KICKTA_DUMP_BUFFER_KM *psKickTADumpBufferKM, *psKMPtr; -#else #if defined(__QNXNTO__) const IMG_UINT32 NAME_BUFFER_SIZE = 30; IMG_PCHAR pszNameBuffer, pszName; IMG_UINT32 ui32NameBufferArraySize, ui32NameLength; #endif SGX_KICKTA_DUMP_BUFFER *psKickTADumpBuffer; -#endif IMG_UINT32 ui32BufferArrayLength = psPDumpBufferArrayIN->ui32BufferArrayLength; IMG_UINT32 ui32BufferArraySize = @@ -3201,22 +2553,14 @@ SGXPDumpBufferArrayBW(IMG_UINT32 ui32BridgeID, PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SGX_PDUMP_BUFFER_ARRAY); -#if defined (SUPPORT_SID_INTERFACE) - if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, - ui32BufferArraySize, - (IMG_PVOID *)&psKickTADumpBufferKM, 0, - "Array of Kick Tile Accelerator Dump Buffer") != PVRSRV_OK) -#else if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize, (IMG_PVOID *)&psKickTADumpBuffer, 0, "Array of Kick Tile Accelerator Dump Buffer") != PVRSRV_OK) -#endif { return -ENOMEM; } -#if !defined (SUPPORT_SID_INTERFACE) if(CopyFromUserWrapper(psPerProc, ui32BridgeID, psKickTADumpBuffer, @@ -3266,25 +2610,14 @@ SGXPDumpBufferArrayBW(IMG_UINT32 ui32BridgeID, } } #endif -#endif for(i = 0; i < ui32BufferArrayLength; i++) { -#if defined (SUPPORT_SID_INTERFACE) - IMG_VOID *pvMemInfo = IMG_NULL; - psUMPtr = &psPDumpBufferArrayIN->psBufferArray[i]; - psKMPtr = &psKickTADumpBufferKM[i]; -#else IMG_VOID *pvMemInfo; -#endif eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &pvMemInfo, -#if defined (SUPPORT_SID_INTERFACE) - psUMPtr->hKernelMemInfo, -#else psKickTADumpBuffer[i].hKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); if(eError != PVRSRV_OK) @@ -3293,20 +2626,12 @@ SGXPDumpBufferArrayBW(IMG_UINT32 ui32BridgeID, "PVRSRVLookupHandle failed (%d)", eError)); break; } -#if defined (SUPPORT_SID_INTERFACE) - psKMPtr->hKernelMemInfo = pvMemInfo; -#else psKickTADumpBuffer[i].hKernelMemInfo = pvMemInfo; -#endif #if defined(SUPPORT_SGX_NEW_STATUS_VALS) eError = PVRSRVLookupHandle(psPerProc->psHandleBase, &pvMemInfo, -#if defined (SUPPORT_SID_INTERFACE) - psUMPtr->hCtrlKernelMemInfo, -#else psKickTADumpBuffer[i].hCtrlKernelMemInfo, -#endif PVRSRV_HANDLE_TYPE_MEM_INFO); if(eError != PVRSRV_OK) @@ -3315,46 +2640,23 @@ SGXPDumpBufferArrayBW(IMG_UINT32 ui32BridgeID, "PVRSRVLookupHandle failed (%d)", eError)); break; } -#if defined (SUPPORT_SID_INTERFACE) - psKMPtr->hCtrlKernelMemInfo = pvMemInfo; - psKMPtr->sCtrlDevVAddr = psUMPtr->sCtrlDevVAddr; -#else psKickTADumpBuffer[i].hCtrlKernelMemInfo = pvMemInfo; #endif -#endif -#if defined (SUPPORT_SID_INTERFACE) - psKMPtr->ui32SpaceUsed = psUMPtr->ui32SpaceUsed; - psKMPtr->ui32Start = psUMPtr->ui32Start; - psKMPtr->ui32End = psUMPtr->ui32End; - psKMPtr->ui32BufferSize = psUMPtr->ui32BufferSize; - psKMPtr->ui32BackEndLength = psUMPtr->ui32BackEndLength; - psKMPtr->uiAllocIndex = psUMPtr->uiAllocIndex; - psKMPtr->pvLinAddr = psUMPtr->pvLinAddr; - psKMPtr->pszName = psUMPtr->pszName; -#endif } if(eError == PVRSRV_OK) { DumpBufferArray(psPerProc, -#if defined (SUPPORT_SID_INTERFACE) - psKickTADumpBufferKM, -#else psKickTADumpBuffer, -#endif ui32BufferArrayLength, psPDumpBufferArrayIN->bDumpPolls); } -#if defined (SUPPORT_SID_INTERFACE) - OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize, psKickTADumpBufferKM, 0); -#else OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32BufferArraySize, psKickTADumpBuffer, 0); #if defined (__QNXNTO__) OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32NameBufferArraySize, pszNameBuffer, 0); #endif -#endif /*not nulling pointer, out of scope*/ return 0; @@ -3657,7 +2959,7 @@ SGXPDumpHWPerfCBBW(IMG_UINT32 ui32BridgeID, PVRSRV_PER_PROCESS_DATA *psPerProc) { #if defined(SUPPORT_SGX_HWPERF) -#if defined(__linux__) +#if defined(__linux__) || defined(__QNXNTO__) PVRSRV_SGXDEV_INFO *psDevInfo; PVRSRV_DEVICE_NODE *psDeviceNode; IMG_HANDLE hDevMemContextInt = 0; diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/buffer_manager.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/buffer_manager.c index 9ce7a11..1013542 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/buffer_manager.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/buffer_manager.c @@ -50,23 +50,23 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "lists.h" static IMG_BOOL -ZeroBuf(BM_BUF *pBuf, BM_MAPPING *pMapping, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui32Flags); +ZeroBuf(BM_BUF *pBuf, BM_MAPPING *pMapping, IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags); static IMG_VOID BM_FreeMemory (IMG_VOID *pH, IMG_UINTPTR_T base, BM_MAPPING *psMapping); static IMG_BOOL BM_ImportMemory(IMG_VOID *pH, IMG_SIZE_T uSize, IMG_SIZE_T *pActualSize, BM_MAPPING **ppsMapping, - IMG_UINT32 uFlags, IMG_PVOID pvPrivData, + IMG_UINT32 ui32Flags, IMG_PVOID pvPrivData, IMG_UINT32 ui32PrivDataLength, IMG_UINTPTR_T *pBase); -static IMG_INT32 +static IMG_BOOL DevMemoryAlloc (BM_CONTEXT *pBMContext, BM_MAPPING *pMapping, IMG_SIZE_T *pActualSize, - IMG_UINT32 uFlags, + IMG_UINT32 ui32Flags, IMG_UINT32 dev_vaddr_alignment, IMG_DEV_VIRTADDR *pDevVAddr); -static IMG_INT32 +static IMG_VOID DevMemoryFree (BM_MAPPING *pMapping); /*! @@ -90,7 +90,7 @@ DevMemoryFree (BM_MAPPING *pMapping); @Input psBMHeap - BM heap @Input psDevVAddr - device virtual address (optional) @Input uSize - requested buffer size in bytes. - @Input uFlags - property flags for the buffer. + @Input ui32Flags - property flags for the buffer. @Input uDevVAddrAlignment - required device virtual address alignment, or 0. @Input pvPrivData - opaque private data passed through to allocator @@ -107,7 +107,7 @@ AllocMemory (BM_CONTEXT *pBMContext, BM_HEAP *psBMHeap, IMG_DEV_VIRTADDR *psDevVAddr, IMG_SIZE_T uSize, - IMG_UINT32 uFlags, + IMG_UINT32 ui32Flags, IMG_UINT32 uDevVAddrAlignment, IMG_PVOID pvPrivData, IMG_UINT32 ui32PrivDataLength, @@ -122,16 +122,16 @@ AllocMemory (BM_CONTEXT *pBMContext, RA_ARENA *pArena = IMG_NULL; PVR_DPF ((PVR_DBG_MESSAGE, - "AllocMemory (uSize=0x%x, uFlags=0x%x, align=0x%x)", - uSize, uFlags, uDevVAddrAlignment)); + "AllocMemory (uSize=0x%" SIZE_T_FMT_LEN "x, ui32Flags=0x%x, align=0x%x)", + uSize, ui32Flags, uDevVAddrAlignment)); /* what to do depends on combination of DevVaddr generation and backing RAM requirement */ - if(uFlags & PVRSRV_MEM_RAM_BACKED_ALLOCATION) + if(ui32Flags & PVRSRV_MEM_RAM_BACKED_ALLOCATION) { - if(uFlags & PVRSRV_MEM_USER_SUPPLIED_DEVVADDR) + if(ui32Flags & PVRSRV_MEM_USER_SUPPLIED_DEVVADDR) { /* user supplied DevVAddr, RAM backing */ PVR_DPF ((PVR_DBG_ERROR, "AllocMemory: combination of DevVAddr management and RAM backing mode unsupported")); @@ -156,82 +156,64 @@ AllocMemory (BM_CONTEXT *pBMContext, } /* Now allocate from the arena we chose above. */ - /* in case of a pageable buffer, we must bypass RA which could - * combine/split individual mappings between buffers: - */ - if (uFlags & (PVRSRV_MEM_SPARSE | PVRSRV_HAP_GPU_PAGEABLE)) + if (ui32Flags & PVRSRV_MEM_SPARSE) { IMG_BOOL bSuccess; - IMG_SIZE_T puiActualSize; - IMG_SIZE_T uRequestSize = uSize; - - if(uFlags & PVRSRV_MEM_SPARSE) + IMG_SIZE_T uActualSize; + + /* Allocate physcial memory */ + bSuccess = BM_ImportMemory(psBMHeap, + ui32ChunkSize * ui32NumPhysChunks, + &uActualSize, + &pMapping, + ui32Flags, + pvPrivData, + ui32PrivDataLength, + IMG_NULL); /* We allocate VM space */ + + if (!bSuccess) { - uRequestSize = ui32ChunkSize * ui32NumPhysChunks; - uSize = ui32ChunkSize * ui32NumVirtChunks; + PVR_DPF((PVR_DBG_ERROR, "AllocMemory: BM_ImportMemory failed")); + return IMG_FALSE; } - /* Allocate physical memory */ - if (!BM_ImportMemory(psBMHeap, - uRequestSize, - &puiActualSize, - &pMapping, - uFlags, - pvPrivData, - ui32PrivDataLength, - (IMG_UINTPTR_T *)&(pBuf->DevVAddr.uiAddr))) + if (uActualSize != ui32ChunkSize * ui32NumPhysChunks) { - PVR_DPF((PVR_DBG_ERROR, - "BM_ImportMemory: Failed to allocate device memory")); + /* + Most likley the chunksize was not host page multiple so + return with an error + */ + PVR_DPF((PVR_DBG_ERROR, "AllocMemory: Failed to allocate memory for sparse allocation")); + BM_FreeMemory(pArena, IMG_NULL, pMapping); return IMG_FALSE; } - pBuf->hOSMemHandle = pMapping->hOSMemHandle; - - /* We allocate VM space for sparse area */ - if(uFlags & PVRSRV_MEM_SPARSE) - { - if (puiActualSize != ui32ChunkSize * ui32NumPhysChunks) - { - /* - * Most likely the chunk size was not host page multiple, - * so return with an error - */ - PVR_DPF((PVR_DBG_ERROR, "AllocMemory: Failed to allocate" - "memory for sparse allocation")); - BM_FreeMemory(pArena, IMG_NULL, pMapping); - return IMG_FALSE; - } - pMapping->uSizeVM = uSize; - pMapping->ui32ChunkSize = ui32ChunkSize; - pMapping->ui32NumVirtChunks = ui32NumVirtChunks; - pMapping->ui32NumPhysChunks = ui32NumPhysChunks; - pMapping->pabMapChunk = pabMapChunk; + pMapping->uSizeVM = ui32ChunkSize * ui32NumVirtChunks; + uSize = pMapping->uSizeVM; + pMapping->ui32ChunkSize = ui32ChunkSize; + pMapping->ui32NumVirtChunks = ui32NumVirtChunks; + pMapping->ui32NumPhysChunks = ui32NumPhysChunks; + pMapping->pabMapChunk = pabMapChunk; - if (!(uFlags & PVRSRV_HAP_NO_GPU_VIRTUAL_ON_ALLOC)) - { - /* Allocate VA space and map in the physical memory */ - bSuccess = DevMemoryAlloc (pBMContext, - pMapping, - IMG_NULL, - uFlags, - (IMG_UINT32)uDevVAddrAlignment, - &pMapping->DevVAddr); - if (!bSuccess) - { - PVR_DPF((PVR_DBG_ERROR, - "AllocMemory: Failed to allocate device memory")); - BM_FreeMemory(pArena, IMG_NULL, pMapping); - return IMG_FALSE; - } - - /* uDevVAddrAlignment is currently set to zero so QAC - * generates warning which we override */ - /* PRQA S 3356,3358 1 */ - PVR_ASSERT (uDevVAddrAlignment>1?(pMapping->DevVAddr.uiAddr%uDevVAddrAlignment)==0:1); - pBuf->DevVAddr.uiAddr = pMapping->DevVAddr.uiAddr; - } + /* Allocate VA space and map in the physical memory */ + bSuccess = DevMemoryAlloc (pBMContext, + pMapping, + IMG_NULL, + ui32Flags, + uDevVAddrAlignment, + &pMapping->DevVAddr); + if (!bSuccess) + { + PVR_DPF((PVR_DBG_ERROR, + "AllocMemory: Failed to allocate device memory")); + BM_FreeMemory(pArena, IMG_NULL, pMapping); + return IMG_FALSE; } + + /* uDevVAddrAlignment is currently set to zero so QAC generates warning which we override */ + /* PRQA S 3356,3358 1 */ + PVR_ASSERT (uDevVAddrAlignment>1?(pMapping->DevVAddr.uiAddr%uDevVAddrAlignment)==0:1); + pBuf->DevVAddr.uiAddr = pMapping->DevVAddr.uiAddr; } else { @@ -239,15 +221,14 @@ AllocMemory (BM_CONTEXT *pBMContext, uSize, IMG_NULL, (IMG_VOID*) &pMapping, - uFlags, + ui32Flags, uDevVAddrAlignment, 0, pvPrivData, ui32PrivDataLength, (IMG_UINTPTR_T *)&(pBuf->DevVAddr.uiAddr))) { - PVR_DPF((PVR_DBG_ERROR, "AllocMemory: RA_Alloc(0x%x) hOSMemHandle %p, flags 0x%08x FAILED", - uSize, pMapping->hOSMemHandle, uFlags)); + PVR_DPF((PVR_DBG_ERROR, "AllocMemory: RA_Alloc(0x%" SIZE_T_FMT_LEN "x) FAILED", uSize)); return IMG_FALSE; } } @@ -283,9 +264,9 @@ AllocMemory (BM_CONTEXT *pBMContext, * will have a physical address, else 0 */ pBuf->CpuPAddr.uiAddr = pMapping->CpuPAddr.uiAddr + uOffset; - if(uFlags & PVRSRV_MEM_ZERO) + if(ui32Flags & PVRSRV_MEM_ZERO) { - if(!ZeroBuf(pBuf, pMapping, uSize, psBMHeap->ui32Attribs | uFlags)) + if(!ZeroBuf(pBuf, pMapping, uSize, psBMHeap->ui32Attribs | ui32Flags)) { return IMG_FALSE; } @@ -293,7 +274,7 @@ AllocMemory (BM_CONTEXT *pBMContext, } else { - if(uFlags & PVRSRV_MEM_USER_SUPPLIED_DEVVADDR) + if(ui32Flags & PVRSRV_MEM_USER_SUPPLIED_DEVVADDR) { /* user supplied DevVAddr, no RAM backing */ PVR_ASSERT(psDevVAddr != IMG_NULL); @@ -341,7 +322,7 @@ AllocMemory (BM_CONTEXT *pBMContext, (IMG_PVOID *)&pMapping, IMG_NULL, "Buffer Manager Mapping") != PVRSRV_OK) { - PVR_DPF((PVR_DBG_ERROR, "AllocMemory: OSAllocMem(0x%x) FAILED", sizeof(*pMapping))); + PVR_DPF((PVR_DBG_ERROR, "AllocMemory: OSAllocMem(0x%" SIZE_T_FMT_LEN "x) FAILED", sizeof(*pMapping))); return IMG_FALSE; } @@ -354,7 +335,6 @@ AllocMemory (BM_CONTEXT *pBMContext, pMapping->CpuVAddr = IMG_NULL; pMapping->CpuPAddr.uiAddr = 0; pMapping->DevVAddr = pBuf->DevVAddr; - pMapping->ui32MappingCount = 1; pMapping->psSysAddr = IMG_NULL; pMapping->uSize = uSize; pMapping->hOSMemHandle = 0; @@ -362,7 +342,6 @@ AllocMemory (BM_CONTEXT *pBMContext, /* Record the arena pointer in the mapping. */ pMapping->pArena = pArena; - pMapping->ui32DevVAddrAlignment = uDevVAddrAlignment; /* record the heap */ pMapping->pBMHeap = psBMHeap; @@ -370,18 +349,18 @@ AllocMemory (BM_CONTEXT *pBMContext, /* output some stats */ PVR_DPF ((PVR_DBG_MESSAGE, - "AllocMemory: pMapping=%08x: DevV=%08X CpuV=%08x CpuP=%08X uSize=0x%x", - (IMG_UINTPTR_T)pMapping, + "AllocMemory: pMapping=%p: DevV=%08X CpuV=%p CpuP=" CPUPADDR_FMT " uSize=0x%" SIZE_T_FMT_LEN "x", + pMapping, pMapping->DevVAddr.uiAddr, - (IMG_UINTPTR_T)pMapping->CpuVAddr, + pMapping->CpuVAddr, pMapping->CpuPAddr.uiAddr, pMapping->uSize)); PVR_DPF ((PVR_DBG_MESSAGE, - "AllocMemory: pBuf=%08x: DevV=%08X CpuV=%08x CpuP=%08X uSize=0x%x", - (IMG_UINTPTR_T)pBuf, + "AllocMemory: pBuf=%p: DevV=%08X CpuV=%p CpuP=" CPUPADDR_FMT " uSize=0x%" SIZE_T_FMT_LEN "x", + pBuf, pBuf->DevVAddr.uiAddr, - (IMG_UINTPTR_T)pBuf->CpuVAddr, + pBuf->CpuVAddr, pBuf->CpuPAddr.uiAddr, uSize)); @@ -406,7 +385,7 @@ AllocMemory (BM_CONTEXT *pBMContext, @Input bPhysContig - Is the wrap physically contiguous. @Input psAddr - List of pages to wrap. @Input pvCPUVAddr - Optional CPU Kernel virtual address (page aligned) of memory to wrap - @Input uFlags - property flags for the buffer. + @Input ui32Flags - property flags for the buffer. @Output Buf - receives a pointer to a descriptor of the allocated buffer. @Return IMG_TRUE - Success @@ -416,27 +395,36 @@ AllocMemory (BM_CONTEXT *pBMContext, static IMG_BOOL WrapMemory (BM_HEAP *psBMHeap, IMG_SIZE_T uSize, - IMG_SIZE_T ui32BaseOffset, + IMG_SIZE_T uiBaseOffset, IMG_BOOL bPhysContig, IMG_SYS_PHYADDR *psAddr, IMG_VOID *pvCPUVAddr, - IMG_UINT32 uFlags, + IMG_UINT32 ui32Flags, BM_BUF *pBuf) { IMG_DEV_VIRTADDR DevVAddr = {0}; BM_MAPPING *pMapping; - IMG_INT32 bResult; - IMG_SIZE_T const ui32PageSize = HOST_PAGESIZE(); + IMG_BOOL bResult; + IMG_SIZE_T const uPageSize = HOST_PAGESIZE(); + /* We should not pass down R/W flags into the OS layers so create ui32Attribs */ + IMG_UINT32 ui32Attribs = ui32Flags & ~(PVRSRV_MEM_READ | PVRSRV_MEM_WRITE); PVR_DPF ((PVR_DBG_MESSAGE, - "WrapMemory(psBMHeap=%08X, size=0x%x, offset=0x%x, bPhysContig=0x%x, pvCPUVAddr = 0x%08x, flags=0x%x)", - (IMG_UINTPTR_T)psBMHeap, uSize, ui32BaseOffset, bPhysContig, (IMG_UINTPTR_T)pvCPUVAddr, uFlags)); - - PVR_ASSERT((psAddr->uiAddr & (ui32PageSize - 1)) == 0); + "WrapMemory(psBMHeap=%p, size=0x%" SIZE_T_FMT_LEN "x, offset=0x%" SIZE_T_FMT_LEN + "x, bPhysContig=0x%x, sysPAddr=0x" SYSPADDR_FMT ", pvCPUVAddr = 0x%p, flags=0x%x)", + psBMHeap, + uSize, + uiBaseOffset, + bPhysContig, + psAddr->uiAddr, + pvCPUVAddr, + ui32Flags)); + + PVR_ASSERT((psAddr->uiAddr & (uPageSize - 1)) == 0); /* Only need lower 12 bits of the cpu addr - don't care what size a void* is */ - PVR_ASSERT(((IMG_UINTPTR_T)pvCPUVAddr & (ui32PageSize - 1)) == 0); + PVR_ASSERT(((IMG_UINTPTR_T)pvCPUVAddr & (uPageSize - 1)) == 0); - uSize += ui32BaseOffset; + uSize += uiBaseOffset; uSize = HOST_PAGEALIGN (uSize); /* allocate a mocked-up mapping */ @@ -445,7 +433,7 @@ WrapMemory (BM_HEAP *psBMHeap, (IMG_PVOID *)&pMapping, IMG_NULL, "Mocked-up mapping") != PVRSRV_OK) { - PVR_DPF((PVR_DBG_ERROR, "WrapMemory: OSAllocMem(0x%x) FAILED",sizeof(*pMapping))); + PVR_DPF((PVR_DBG_ERROR, "WrapMemory: OSAllocMem(0x%" SIZE_T_FMT_LEN "x) FAILED", sizeof(*pMapping))); return IMG_FALSE; } @@ -467,10 +455,10 @@ WrapMemory (BM_HEAP *psBMHeap, if(OSRegisterMem(pMapping->CpuPAddr, pMapping->CpuVAddr, pMapping->uSize, - uFlags, + ui32Attribs, &pMapping->hOSMemHandle) != PVRSRV_OK) { - PVR_DPF((PVR_DBG_ERROR, "WrapMemory: OSRegisterMem Phys=0x%08X, Size=%d) failed", + PVR_DPF((PVR_DBG_ERROR, "WrapMemory: OSRegisterMem Phys=0x" CPUPADDR_FMT ", Size=%" SIZE_T_FMT_LEN "u) failed", pMapping->CpuPAddr.uiAddr, pMapping->uSize)); goto fail_cleanup; } @@ -483,10 +471,10 @@ WrapMemory (BM_HEAP *psBMHeap, if(OSRegisterDiscontigMem(pMapping->psSysAddr, pMapping->CpuVAddr, pMapping->uSize, - uFlags, + ui32Attribs, &pMapping->hOSMemHandle) != PVRSRV_OK) { - PVR_DPF((PVR_DBG_ERROR, "WrapMemory: OSRegisterDiscontigMem Size=%d) failed", + PVR_DPF((PVR_DBG_ERROR, "WrapMemory: OSRegisterDiscontigMem Size=0x%" SIZE_T_FMT_LEN "u) failed", pMapping->uSize)); goto fail_cleanup; } @@ -501,12 +489,12 @@ WrapMemory (BM_HEAP *psBMHeap, if(OSReservePhys(pMapping->CpuPAddr, pMapping->uSize, - uFlags, + ui32Attribs, IMG_NULL, &pMapping->CpuVAddr, &pMapping->hOSMemHandle) != PVRSRV_OK) { - PVR_DPF((PVR_DBG_ERROR, "WrapMemory: OSReservePhys Phys=0x%08X, Size=%d) failed", + PVR_DPF((PVR_DBG_ERROR, "WrapMemory: OSReservePhys Phys=0x" CPUPADDR_FMT ", Size=%" SIZE_T_FMT_LEN "u) failed", pMapping->CpuPAddr.uiAddr, pMapping->uSize)); goto fail_cleanup; } @@ -518,11 +506,11 @@ WrapMemory (BM_HEAP *psBMHeap, if(OSReserveDiscontigPhys(pMapping->psSysAddr, pMapping->uSize, - uFlags, + ui32Attribs, &pMapping->CpuVAddr, &pMapping->hOSMemHandle) != PVRSRV_OK) { - PVR_DPF((PVR_DBG_ERROR, "WrapMemory: OSReserveDiscontigPhys Size=%d) failed", + PVR_DPF((PVR_DBG_ERROR, "WrapMemory: OSReserveDiscontigPhys Size=%" SIZE_T_FMT_LEN "u) failed", pMapping->uSize)); goto fail_cleanup; } @@ -530,18 +518,18 @@ WrapMemory (BM_HEAP *psBMHeap, } /* - * Allocate device memory for this buffer. Map wrapped pages as read/write + * Allocate device memory for this buffer. */ bResult = DevMemoryAlloc(psBMHeap->pBMContext, pMapping, IMG_NULL, - uFlags | PVRSRV_MEM_READ | PVRSRV_MEM_WRITE, - IMG_CAST_TO_DEVVADDR_UINT(ui32PageSize), + ui32Flags, + IMG_CAST_TO_DEVVADDR_UINT(uPageSize), &DevVAddr); - if (bResult <= 0) + if (!bResult) { PVR_DPF((PVR_DBG_ERROR, - "WrapMemory: DevMemoryAlloc(0x%x) failed", + "WrapMemory: DevMemoryAlloc(0x%" SIZE_T_FMT_LEN "x) failed", pMapping->uSize)); goto fail_cleanup; } @@ -552,17 +540,17 @@ WrapMemory (BM_HEAP *psBMHeap, * addresses associated with this allocation are placed at the same * offset within the underlying chunk. */ - pBuf->CpuPAddr.uiAddr = pMapping->CpuPAddr.uiAddr + ui32BaseOffset; - if(!ui32BaseOffset) + pBuf->CpuPAddr.uiAddr = pMapping->CpuPAddr.uiAddr + uiBaseOffset; + if(!uiBaseOffset) { pBuf->hOSMemHandle = pMapping->hOSMemHandle; } else { if(OSGetSubMemHandle(pMapping->hOSMemHandle, - ui32BaseOffset, - (pMapping->uSize-ui32BaseOffset), - uFlags, + uiBaseOffset, + (pMapping->uSize - uiBaseOffset), + ui32Attribs, &pBuf->hOSMemHandle)!=PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "WrapMemory: OSGetSubMemHandle failed")); @@ -571,13 +559,13 @@ WrapMemory (BM_HEAP *psBMHeap, } if(pMapping->CpuVAddr) { - pBuf->CpuVAddr = (IMG_VOID*) ((IMG_UINTPTR_T)pMapping->CpuVAddr + ui32BaseOffset); + pBuf->CpuVAddr = (IMG_VOID*) ((IMG_UINTPTR_T)pMapping->CpuVAddr + uiBaseOffset); } - pBuf->DevVAddr.uiAddr = pMapping->DevVAddr.uiAddr + IMG_CAST_TO_DEVVADDR_UINT(ui32BaseOffset); + pBuf->DevVAddr.uiAddr = pMapping->DevVAddr.uiAddr + IMG_CAST_TO_DEVVADDR_UINT(uiBaseOffset); - if(uFlags & PVRSRV_MEM_ZERO) + if(ui32Flags & PVRSRV_MEM_ZERO) { - if(!ZeroBuf(pBuf, pMapping, uSize, uFlags)) + if(!ZeroBuf(pBuf, pMapping, uSize, ui32Flags)) { return IMG_FALSE; } @@ -585,19 +573,19 @@ WrapMemory (BM_HEAP *psBMHeap, PVR_DPF ((PVR_DBG_MESSAGE, "DevVaddr.uiAddr=%08X", DevVAddr.uiAddr)); PVR_DPF ((PVR_DBG_MESSAGE, - "WrapMemory: DevV=%08X CpuP=%08X uSize=0x%x", + "WrapMemory: DevV=%08X CpuP=" CPUPADDR_FMT " uSize=0x%" SIZE_T_FMT_LEN "x", pMapping->DevVAddr.uiAddr, pMapping->CpuPAddr.uiAddr, pMapping->uSize)); PVR_DPF ((PVR_DBG_MESSAGE, - "WrapMemory: DevV=%08X CpuP=%08X uSize=0x%x", + "WrapMemory: DevV=%08X CpuP=" CPUPADDR_FMT " uSize=0x%" SIZE_T_FMT_LEN "x", pBuf->DevVAddr.uiAddr, pBuf->CpuPAddr.uiAddr, uSize)); pBuf->pMapping = pMapping; return IMG_TRUE; fail_cleanup: - if(ui32BaseOffset && pBuf->hOSMemHandle) + if(uiBaseOffset && pBuf->hOSMemHandle) { - OSReleaseSubMemHandle(pBuf->hOSMemHandle, uFlags); + OSReleaseSubMemHandle(pBuf->hOSMemHandle, ui32Attribs); } if(pMapping && (pMapping->CpuVAddr || pMapping->hOSMemHandle)) @@ -605,16 +593,16 @@ fail_cleanup: switch(pMapping->eCpuMemoryOrigin) { case hm_wrapped: - OSUnReservePhys(pMapping->CpuVAddr, pMapping->uSize, uFlags, pMapping->hOSMemHandle); + OSUnReservePhys(pMapping->CpuVAddr, pMapping->uSize, ui32Attribs, pMapping->hOSMemHandle); break; case hm_wrapped_virtaddr: - OSUnRegisterMem(pMapping->CpuVAddr, pMapping->uSize, uFlags, pMapping->hOSMemHandle); + OSUnRegisterMem(pMapping->CpuVAddr, pMapping->uSize, ui32Attribs, pMapping->hOSMemHandle); break; case hm_wrapped_scatter: - OSUnReserveDiscontigPhys(pMapping->CpuVAddr, pMapping->uSize, uFlags, pMapping->hOSMemHandle); + OSUnReserveDiscontigPhys(pMapping->CpuVAddr, pMapping->uSize, ui32Attribs, pMapping->hOSMemHandle); break; case hm_wrapped_scatter_virtaddr: - OSUnRegisterDiscontigMem(pMapping->CpuVAddr, pMapping->uSize, uFlags, pMapping->hOSMemHandle); + OSUnRegisterDiscontigMem(pMapping->CpuVAddr, pMapping->uSize, ui32Attribs, pMapping->hOSMemHandle); break; default: break; @@ -630,19 +618,19 @@ fail_cleanup: static IMG_BOOL -ZeroBuf(BM_BUF *pBuf, BM_MAPPING *pMapping, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui32Flags) +ZeroBuf(BM_BUF *pBuf, BM_MAPPING *pMapping, IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags) { IMG_VOID *pvCpuVAddr; if(pBuf->CpuVAddr) { - OSMemSet(pBuf->CpuVAddr, 0, ui32Bytes); + OSMemSet(pBuf->CpuVAddr, 0, uBytes); } else if(pMapping->eCpuMemoryOrigin == hm_contiguous || pMapping->eCpuMemoryOrigin == hm_wrapped) { pvCpuVAddr = OSMapPhysToLin(pBuf->CpuPAddr, - ui32Bytes, + uBytes, PVRSRV_HAP_KERNEL_ONLY | (ui32Flags & PVRSRV_HAP_CACHETYPE_MASK), IMG_NULL); @@ -651,17 +639,17 @@ ZeroBuf(BM_BUF *pBuf, BM_MAPPING *pMapping, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui3 PVR_DPF((PVR_DBG_ERROR, "ZeroBuf: OSMapPhysToLin for contiguous buffer failed")); return IMG_FALSE; } - OSMemSet(pvCpuVAddr, 0, ui32Bytes); + OSMemSet(pvCpuVAddr, 0, uBytes); OSUnMapPhysToLin(pvCpuVAddr, - ui32Bytes, + uBytes, PVRSRV_HAP_KERNEL_ONLY | (ui32Flags & PVRSRV_HAP_CACHETYPE_MASK), IMG_NULL); } else { - IMG_SIZE_T ui32BytesRemaining = ui32Bytes; - IMG_SIZE_T ui32CurrentOffset = 0; + IMG_SIZE_T uBytesRemaining = uBytes; + IMG_SIZE_T uCurrentOffset = 0; IMG_CPU_PHYADDR CpuPAddr; /* Walk through the pBuf one page at a time and use @@ -669,21 +657,21 @@ ZeroBuf(BM_BUF *pBuf, BM_MAPPING *pMapping, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui3 PVR_ASSERT(pBuf->hOSMemHandle); - while(ui32BytesRemaining > 0) + while(uBytesRemaining > 0) { - IMG_SIZE_T ui32BlockBytes = MIN(ui32BytesRemaining, HOST_PAGESIZE()); - CpuPAddr = OSMemHandleToCpuPAddr(pBuf->hOSMemHandle, ui32CurrentOffset); + IMG_SIZE_T uBlockBytes = MIN(uBytesRemaining, HOST_PAGESIZE()); + CpuPAddr = OSMemHandleToCpuPAddr(pBuf->hOSMemHandle, uCurrentOffset); /* If the CpuPAddr isn't page aligned then start by writing up to the next page - * boundary (or ui32BytesRemaining if less), so that subsequent iterations can + * boundary (or uBytesRemaining if less), so that subsequent iterations can * copy full physical pages. */ if(CpuPAddr.uiAddr & (HOST_PAGESIZE() -1)) { - ui32BlockBytes = - MIN(ui32BytesRemaining, (IMG_UINT32)(HOST_PAGEALIGN(CpuPAddr.uiAddr) - CpuPAddr.uiAddr)); + uBlockBytes = + MIN(uBytesRemaining, (IMG_UINT32)(HOST_PAGEALIGN(CpuPAddr.uiAddr) - CpuPAddr.uiAddr)); } pvCpuVAddr = OSMapPhysToLin(CpuPAddr, - ui32BlockBytes, + uBlockBytes, PVRSRV_HAP_KERNEL_ONLY | (ui32Flags & PVRSRV_HAP_CACHETYPE_MASK), IMG_NULL); @@ -692,15 +680,15 @@ ZeroBuf(BM_BUF *pBuf, BM_MAPPING *pMapping, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui3 PVR_DPF((PVR_DBG_ERROR, "ZeroBuf: OSMapPhysToLin while zeroing non-contiguous memory FAILED")); return IMG_FALSE; } - OSMemSet(pvCpuVAddr, 0, ui32BlockBytes); + OSMemSet(pvCpuVAddr, 0, uBlockBytes); OSUnMapPhysToLin(pvCpuVAddr, - ui32BlockBytes, + uBlockBytes, PVRSRV_HAP_KERNEL_ONLY | (ui32Flags & PVRSRV_HAP_CACHETYPE_MASK), IMG_NULL); - ui32BytesRemaining -= ui32BlockBytes; - ui32CurrentOffset += ui32BlockBytes; + uBytesRemaining -= uBlockBytes; + uCurrentOffset += uBlockBytes; } } @@ -734,9 +722,9 @@ FreeBuf (BM_BUF *pBuf, IMG_UINT32 ui32Flags, IMG_BOOL bFromAllocator) PVRSRV_DEVICE_NODE *psDeviceNode; PVR_DPF ((PVR_DBG_MESSAGE, - "FreeBuf: pBuf=0x%x: DevVAddr=%08X CpuVAddr=0x%x CpuPAddr=%08X", - (IMG_UINTPTR_T)pBuf, pBuf->DevVAddr.uiAddr, - (IMG_UINTPTR_T)pBuf->CpuVAddr, pBuf->CpuPAddr.uiAddr)); + "FreeBuf: pBuf=0x%p: DevVAddr=%08X CpuVAddr=0x%p CpuPAddr=" CPUPADDR_FMT, + pBuf, pBuf->DevVAddr.uiAddr, + pBuf->CpuVAddr, pBuf->CpuPAddr.uiAddr)); /* record mapping */ pMapping = pBuf->pMapping; @@ -777,11 +765,9 @@ FreeBuf (BM_BUF *pBuf, IMG_UINT32 ui32Flags, IMG_BOOL bFromAllocator) OSReleaseSubMemHandle(pBuf->hOSMemHandle, ui32Flags); } } - if(ui32Flags & PVRSRV_MEM_RAM_BACKED_ALLOCATION) { /* Submemhandle is required by exported mappings */ - if ((pBuf->ui32ExportCount == 0) && (pBuf->ui32RefCount == 0)) { /* @@ -789,27 +775,17 @@ FreeBuf (BM_BUF *pBuf, IMG_UINT32 ui32Flags, IMG_BOOL bFromAllocator) Note: currently no need to distinguish between hm_env and hm_contiguous */ PVR_ASSERT(pBuf->ui32ExportCount == 0); - if (pBuf->pMapping->ui32Flags & (PVRSRV_MEM_SPARSE | PVRSRV_HAP_GPU_PAGEABLE)) + if (pBuf->pMapping->ui32Flags & PVRSRV_MEM_SPARSE) { - IMG_UINT32 ui32FreeSize = 0; - IMG_PVOID pvFreePtr = IMG_NULL; - - if(pBuf->pMapping->ui32Flags & PVRSRV_MEM_SPARSE) - { - ui32FreeSize = sizeof(IMG_BOOL) * pBuf->pMapping->ui32NumVirtChunks; - pvFreePtr = pBuf->pMapping->pabMapChunk; - } - - /* With sparse and page-able allocations we don't go through the sub-alloc RA */ + IMG_UINT32 ui32FreeSize = sizeof(IMG_BOOL) * pBuf->pMapping->ui32NumVirtChunks; + IMG_PVOID pvFreePtr = pBuf->pMapping->pabMapChunk; + + /* With sparse allocations we don't go through the sub-alloc RA */ BM_FreeMemory(pBuf->pMapping->pBMHeap, pBuf->DevVAddr.uiAddr, pBuf->pMapping); - - if(pvFreePtr) - { - OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, + OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, ui32FreeSize, pvFreePtr, IMG_NULL); - } } else { @@ -1559,7 +1535,7 @@ BM_Alloc ( IMG_HANDLE hDevMemHeap, BM_CONTEXT *pBMContext; BM_HEAP *psBMHeap; SYS_DATA *psSysData; - IMG_UINT32 uFlags; + IMG_UINT32 ui32Flags; if (pui32Flags == IMG_NULL) { @@ -1568,11 +1544,11 @@ BM_Alloc ( IMG_HANDLE hDevMemHeap, return IMG_FALSE; } - uFlags = *pui32Flags; + ui32Flags = *pui32Flags; PVR_DPF ((PVR_DBG_MESSAGE, - "BM_Alloc (uSize=0x%x, uFlags=0x%x, uDevVAddrAlignment=0x%x)", - uSize, uFlags, uDevVAddrAlignment)); + "BM_Alloc (uSize=0x%" SIZE_T_FMT_LEN "x, ui32Flags=0x%x, uDevVAddrAlignment=0x%x)", + uSize, ui32Flags, uDevVAddrAlignment)); SysAcquireData(&psSysData); @@ -1604,7 +1580,7 @@ BM_Alloc ( IMG_HANDLE hDevMemHeap, psBMHeap, psDevVAddr, uSize, - uFlags, + ui32Flags, uDevVAddrAlignment, pvPrivData, ui32PrivDataLength, @@ -1621,24 +1597,24 @@ BM_Alloc ( IMG_HANDLE hDevMemHeap, } PVR_DPF ((PVR_DBG_MESSAGE, - "BM_Alloc (uSize=0x%x, uFlags=0x%x)", - uSize, uFlags)); + "BM_Alloc (uSize=0x%" SIZE_T_FMT_LEN "x, ui32Flags=0x%x)", + uSize, ui32Flags)); /* * Assign the handle and return. */ pBuf->ui32RefCount = 1; *phBuf = (BM_HANDLE)pBuf; - *pui32Flags = uFlags | psBMHeap->ui32Attribs; + *pui32Flags = ui32Flags | psBMHeap->ui32Attribs; /* * If the user has specified heap CACHETYPE flags themselves, * override any CACHETYPE flags inherited from the heap. */ - if(uFlags & PVRSRV_HAP_CACHETYPE_MASK) + if(ui32Flags & PVRSRV_HAP_CACHETYPE_MASK) { *pui32Flags &= ~PVRSRV_HAP_CACHETYPE_MASK; - *pui32Flags |= (uFlags & PVRSRV_HAP_CACHETYPE_MASK); + *pui32Flags |= (ui32Flags & PVRSRV_HAP_CACHETYPE_MASK); } return IMG_TRUE; @@ -1657,13 +1633,13 @@ BM_Alloc ( IMG_HANDLE hDevMemHeap, @Input psDeviceNode @Input psSysPAddr - system address array - @Input ui32PageSize - size of address array + @Input uPageSize - size of address array @Return IMG_BOOL *****************************************************************************/ static IMG_BOOL -ValidSysPAddrArrayForDev(PVRSRV_DEVICE_NODE *psDeviceNode, IMG_SYS_PHYADDR *psSysPAddr, IMG_UINT32 ui32PageCount, IMG_SIZE_T ui32PageSize) +ValidSysPAddrArrayForDev(PVRSRV_DEVICE_NODE *psDeviceNode, IMG_SYS_PHYADDR *psSysPAddr, IMG_UINT32 ui32PageCount, IMG_SIZE_T uPageSize) { IMG_UINT32 i; @@ -1677,7 +1653,7 @@ ValidSysPAddrArrayForDev(PVRSRV_DEVICE_NODE *psDeviceNode, IMG_SYS_PHYADDR *psSy return IMG_FALSE; } - sEndSysPAddr.uiAddr = sStartSysPAddr.uiAddr + ui32PageSize; + sEndSysPAddr.uiAddr = sStartSysPAddr.uiAddr + uPageSize; if (!SysVerifySysPAddrToDevPAddr(psDeviceNode->sDevId.eDeviceType, sEndSysPAddr)) { @@ -1704,7 +1680,7 @@ ValidSysPAddrArrayForDev(PVRSRV_DEVICE_NODE *psDeviceNode, IMG_SYS_PHYADDR *psSy *****************************************************************************/ static IMG_BOOL -ValidSysPAddrRangeForDev(PVRSRV_DEVICE_NODE *psDeviceNode, IMG_SYS_PHYADDR sStartSysPAddr, IMG_SIZE_T ui32Range) +ValidSysPAddrRangeForDev(PVRSRV_DEVICE_NODE *psDeviceNode, IMG_SYS_PHYADDR sStartSysPAddr, IMG_SIZE_T uRange) { IMG_SYS_PHYADDR sEndSysPAddr; @@ -1713,7 +1689,7 @@ ValidSysPAddrRangeForDev(PVRSRV_DEVICE_NODE *psDeviceNode, IMG_SYS_PHYADDR sStar return IMG_FALSE; } - sEndSysPAddr.uiAddr = sStartSysPAddr.uiAddr + ui32Range; + sEndSysPAddr.uiAddr = sStartSysPAddr.uiAddr + uRange; if (!SysVerifySysPAddrToDevPAddr(psDeviceNode->sDevId.eDeviceType, sEndSysPAddr)) { @@ -1723,9 +1699,9 @@ ValidSysPAddrRangeForDev(PVRSRV_DEVICE_NODE *psDeviceNode, IMG_SYS_PHYADDR sStar return IMG_TRUE; } -#define WRAP_MAPPING_SIZE(ui32ByteSize, ui32PageOffset) HOST_PAGEALIGN((ui32ByteSize) + (ui32PageOffset)) +#define WRAP_MAPPING_SIZE(uByteSize, uPageOffset) HOST_PAGEALIGN((uByteSize) + (uPageOffset)) -#define WRAP_PAGE_COUNT(ui32ByteSize, ui32PageOffset, ui32HostPageSize) (WRAP_MAPPING_SIZE(ui32ByteSize, ui32PageOffset) / (ui32HostPageSize)) +#define WRAP_PAGE_COUNT(uByteSize, uPageOffset, uHostPageSize) (WRAP_MAPPING_SIZE(uByteSize, uPageOffset) / (uHostPageSize)) #endif @@ -1740,12 +1716,12 @@ ValidSysPAddrRangeForDev(PVRSRV_DEVICE_NODE *psDeviceNode, IMG_SYS_PHYADDR sStar The wrapped memory must be page aligned. BM_Wrap will roundup the size to a multiple of cpu pages. - @Input ui32Size - size of memory to wrap. + @Input uSize - size of memory to wrap. @Input ui32Offset - Offset into page of memory to wrap. @Input bPhysContig - Is the wrap physically contiguous. @Input psSysAddr - list of system physical page addresses of memory to wrap. @Input pvCPUVAddr - optional CPU kernel virtual address (Page aligned) of memory to wrap. - @Input uFlags - bit mask of buffer property flags. + @Input ui32Flags - bit mask of buffer property flags. @output phBuf - receives the buffer handle. @Return IMG_TRUE - Success. @@ -1754,8 +1730,8 @@ ValidSysPAddrRangeForDev(PVRSRV_DEVICE_NODE *psDeviceNode, IMG_SYS_PHYADDR sStar *****************************************************************************/ IMG_BOOL BM_Wrap ( IMG_HANDLE hDevMemHeap, - IMG_SIZE_T ui32Size, - IMG_SIZE_T ui32Offset, + IMG_SIZE_T uSize, + IMG_SIZE_T uOffset, IMG_BOOL bPhysContig, IMG_SYS_PHYADDR *psSysAddr, IMG_VOID *pvCPUVAddr, @@ -1767,29 +1743,41 @@ BM_Wrap ( IMG_HANDLE hDevMemHeap, BM_HEAP *psBMHeap; SYS_DATA *psSysData; IMG_SYS_PHYADDR sHashAddress; - IMG_UINT32 uFlags; + IMG_UINT32 ui32Flags; psBMHeap = (BM_HEAP*)hDevMemHeap; psBMContext = psBMHeap->pBMContext; - uFlags = psBMHeap->ui32Attribs & (PVRSRV_HAP_CACHETYPE_MASK | PVRSRV_HAP_MAPTYPE_MASK | PVRSRV_HAP_MAPPING_CTRL_MASK); + ui32Flags = psBMHeap->ui32Attribs & (PVRSRV_HAP_CACHETYPE_MASK | PVRSRV_HAP_MAPTYPE_MASK); if ((pui32Flags != IMG_NULL) && ((*pui32Flags & PVRSRV_HAP_CACHETYPE_MASK) != 0)) { - uFlags &= ~PVRSRV_HAP_CACHETYPE_MASK; - uFlags |= *pui32Flags & PVRSRV_HAP_CACHETYPE_MASK; + ui32Flags &= ~PVRSRV_HAP_CACHETYPE_MASK; + ui32Flags |= *pui32Flags & PVRSRV_HAP_CACHETYPE_MASK; + } + + if ((pui32Flags != IMG_NULL) && ((*pui32Flags & (PVRSRV_MEM_READ | PVRSRV_MEM_WRITE)) != 0)) + { + ui32Flags &= ~(PVRSRV_MEM_READ | PVRSRV_MEM_WRITE); + ui32Flags |= *pui32Flags & (PVRSRV_MEM_READ | PVRSRV_MEM_WRITE); } PVR_DPF ((PVR_DBG_MESSAGE, - "BM_Wrap (uSize=0x%x, uOffset=0x%x, bPhysContig=0x%x, pvCPUVAddr=0x%x, uFlags=0x%x)", - ui32Size, ui32Offset, bPhysContig, (IMG_UINTPTR_T)pvCPUVAddr, uFlags)); + "BM_Wrap (uSize=0x%" SIZE_T_FMT_LEN "x, uOffset=0x%" SIZE_T_FMT_LEN + "x, bPhysContig=0x%x, syspAddr=0x" SYSPADDR_FMT ", pvCPUVAddr=0x%p, ui32Flags=0x%x)", + uSize, + uOffset, + bPhysContig, + psSysAddr->uiAddr, + pvCPUVAddr, + ui32Flags)); SysAcquireData(&psSysData); #if defined(PVR_LMA) if (bPhysContig) { - if (!ValidSysPAddrRangeForDev(psBMContext->psDeviceNode, *psSysAddr, WRAP_MAPPING_SIZE(ui32Size, ui32Offset))) + if (!ValidSysPAddrRangeForDev(psBMContext->psDeviceNode, *psSysAddr, WRAP_MAPPING_SIZE(uSize, uOffset))) { PVR_DPF((PVR_DBG_ERROR, "BM_Wrap: System address range invalid for device")); return IMG_FALSE; @@ -1797,9 +1785,9 @@ BM_Wrap ( IMG_HANDLE hDevMemHeap, } else { - IMG_SIZE_T ui32HostPageSize = HOST_PAGESIZE(); + IMG_SIZE_T uHostPageSize = HOST_PAGESIZE(); - if (!ValidSysPAddrArrayForDev(psBMContext->psDeviceNode, psSysAddr, WRAP_PAGE_COUNT(ui32Size, ui32Offset, ui32HostPageSize), ui32HostPageSize)) + if (!ValidSysPAddrArrayForDev(psBMContext->psDeviceNode, psSysAddr, WRAP_PAGE_COUNT(uSize, uOffset, uHostPageSize), uHostPageSize)) { PVR_DPF((PVR_DBG_ERROR, "BM_Wrap: Array of system addresses invalid for device")); return IMG_FALSE; @@ -1813,27 +1801,29 @@ BM_Wrap ( IMG_HANDLE hDevMemHeap, sHashAddress = psSysAddr[0]; /* Add the in-page offset to ensure a unique hash */ - sHashAddress.uiAddr += ui32Offset; + sHashAddress.uiAddr += uOffset; - /* See if this address has already been wrapped */ - pBuf = (BM_BUF *)HASH_Retrieve(psBMContext->pBufferHash, sHashAddress.uiAddr); + /* See if this address has already been wrapped, note that the cast is ok as this is only local mem */ + pBuf = (BM_BUF *)HASH_Retrieve(psBMContext->pBufferHash, (IMG_UINTPTR_T)sHashAddress.uiAddr); if(pBuf) { - IMG_SIZE_T ui32MappingSize = HOST_PAGEALIGN (ui32Size + ui32Offset); + IMG_SIZE_T uMappingSize = HOST_PAGEALIGN (uSize + uOffset); /* Check base address, size and contiguity type match */ - if(pBuf->pMapping->uSize == ui32MappingSize && (pBuf->pMapping->eCpuMemoryOrigin == hm_wrapped || + if(pBuf->pMapping->uSize == uMappingSize && (pBuf->pMapping->eCpuMemoryOrigin == hm_wrapped || pBuf->pMapping->eCpuMemoryOrigin == hm_wrapped_virtaddr)) { PVR_DPF((PVR_DBG_MESSAGE, - "BM_Wrap (Matched previous Wrap! uSize=0x%x, uOffset=0x%x, SysAddr=%08X)", - ui32Size, ui32Offset, sHashAddress.uiAddr)); + "BM_Wrap (Matched previous Wrap! uSize=0x%" SIZE_T_FMT_LEN "x, uOffset=0x%" SIZE_T_FMT_LEN "x, SysAddr=" SYSPADDR_FMT ")", + uSize, + uOffset, + sHashAddress.uiAddr)); PVRSRVBMBufIncRef(pBuf); *phBuf = (BM_HANDLE)pBuf; if(pui32Flags) - *pui32Flags = uFlags; + *pui32Flags = ui32Flags; return IMG_TRUE; } @@ -1861,7 +1851,7 @@ BM_Wrap ( IMG_HANDLE hDevMemHeap, /* * Actually perform the memory wrap. */ - if (WrapMemory (psBMHeap, ui32Size, ui32Offset, bPhysContig, psSysAddr, pvCPUVAddr, uFlags, pBuf) != IMG_TRUE) + if (WrapMemory (psBMHeap, uSize, uOffset, bPhysContig, psSysAddr, pvCPUVAddr, ui32Flags, pBuf) != IMG_TRUE) { PVR_DPF((PVR_DBG_ERROR, "BM_Wrap: WrapMemory FAILED")); OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof (BM_BUF), pBuf, IMG_NULL); @@ -1877,17 +1867,17 @@ BM_Wrap ( IMG_HANDLE hDevMemHeap, /* Have we calculated the right Hash key ? */ PVR_ASSERT(SysSysPAddrToCpuPAddr(sHashAddress).uiAddr == pBuf->CpuPAddr.uiAddr); - if (!HASH_Insert (psBMContext->pBufferHash, sHashAddress.uiAddr, (IMG_UINTPTR_T)pBuf)) + if (!HASH_Insert (psBMContext->pBufferHash, (IMG_UINTPTR_T)sHashAddress.uiAddr, (IMG_UINTPTR_T)pBuf)) { - FreeBuf (pBuf, uFlags, IMG_TRUE); + FreeBuf (pBuf, ui32Flags, IMG_TRUE); PVR_DPF((PVR_DBG_ERROR, "BM_Wrap: HASH_Insert FAILED")); return IMG_FALSE; } } PVR_DPF ((PVR_DBG_MESSAGE, - "BM_Wrap (uSize=0x%x, uFlags=0x%x, devVAddr=%08X)", - ui32Size, uFlags, pBuf->DevVAddr.uiAddr)); + "BM_Wrap (uSize=0x%" SIZE_T_FMT_LEN "x, ui32Flags=0x%x, devVAddr=%08X)", + uSize, ui32Flags, pBuf->DevVAddr.uiAddr)); /* * Assign the handle and return. @@ -1897,7 +1887,7 @@ BM_Wrap ( IMG_HANDLE hDevMemHeap, if(pui32Flags) { /* need to override the heap attributes SINGLE PROC to MULT_PROC. */ - *pui32Flags = (uFlags & ~PVRSRV_HAP_MAPTYPE_MASK) | PVRSRV_HAP_MULTI_PROCESS; + *pui32Flags = (ui32Flags & ~PVRSRV_HAP_MAPTYPE_MASK) | PVRSRV_HAP_MULTI_PROCESS; } return IMG_TRUE; @@ -1964,7 +1954,7 @@ BM_Free (BM_HANDLE hBuf, SYS_DATA *psSysData; IMG_SYS_PHYADDR sHashAddr; - PVR_DPF ((PVR_DBG_MESSAGE, "BM_Free (h=0x%x)", (IMG_UINTPTR_T)hBuf)); + PVR_DPF ((PVR_DBG_MESSAGE, "BM_Free (h=0x%p)", hBuf)); PVR_ASSERT (pBuf!=IMG_NULL); if (pBuf == IMG_NULL) @@ -2014,8 +2004,8 @@ BM_HandleToCpuVaddr (BM_HANDLE hBuf) } PVR_DPF ((PVR_DBG_MESSAGE, - "BM_HandleToCpuVaddr(h=0x%x)=0x%x", - (IMG_UINTPTR_T)hBuf, (IMG_UINTPTR_T)pBuf->CpuVAddr)); + "BM_HandleToCpuVaddr(h=0x%p)=0x%p", + hBuf, pBuf->CpuVAddr)); return pBuf->CpuVAddr; } @@ -2045,7 +2035,7 @@ BM_HandleToDevVaddr (BM_HANDLE hBuf) return DevVAddr; } - PVR_DPF ((PVR_DBG_MESSAGE, "BM_HandleToDevVaddr(h=0x%x)=%08X", (IMG_UINTPTR_T)hBuf, pBuf->DevVAddr.uiAddr)); + PVR_DPF ((PVR_DBG_MESSAGE, "BM_HandleToDevVaddr(h=0x%p)=%08X", hBuf, pBuf->DevVAddr.uiAddr)); return pBuf->DevVAddr; } @@ -2076,7 +2066,7 @@ BM_HandleToSysPaddr (BM_HANDLE hBuf) return PhysAddr; } - PVR_DPF ((PVR_DBG_MESSAGE, "BM_HandleToSysPaddr(h=0x%x)=%08X", (IMG_UINTPTR_T)hBuf, pBuf->CpuPAddr.uiAddr)); + PVR_DPF ((PVR_DBG_MESSAGE, "BM_HandleToSysPaddr(h=0lx%p)=" CPUPADDR_FMT, hBuf, pBuf->CpuPAddr.uiAddr)); return SysCpuPAddrToSysPAddr (pBuf->CpuPAddr); } @@ -2106,106 +2096,11 @@ BM_HandleToOSMemHandle(BM_HANDLE hBuf) } PVR_DPF ((PVR_DBG_MESSAGE, - "BM_HandleToOSMemHandle(h=0x%x)=0x%x", - (IMG_UINTPTR_T)hBuf, (IMG_UINTPTR_T)pBuf->hOSMemHandle)); + "BM_HandleToOSMemHandle(h=0x%p)=0x%p", + hBuf, pBuf->hOSMemHandle)); return pBuf->hOSMemHandle; } -/*---------------------------------------------------------------------------- -<function> - FUNCTION: BM_UnmapFromDev - - PURPOSE: Unmaps a buffer from GPU virtual address space, but otherwise - leaves buffer intact (ie. not changing any CPU virtual space - mappings, etc). This in conjunction with BM_RemapToDev() can - be used to migrate buffers in and out of GPU virtual address - space to deal with fragmentation and/or limited size of GPU - MMU. - - PARAMETERS: In: hBuf - buffer handle. - RETURNS: IMG_TRUE - Success - IMG_FALSE - Failure -</function> ------------------------------------------------------------------------------*/ -IMG_INT32 -BM_UnmapFromDev(BM_HANDLE hBuf) -{ - BM_BUF *pBuf = (BM_BUF *)hBuf; - BM_MAPPING *pMapping; - IMG_INT32 result; - - PVR_ASSERT (pBuf != IMG_NULL); - - if (pBuf == IMG_NULL) - { - PVR_DPF((PVR_DBG_ERROR, "BM_UnmapFromDev: invalid parameter")); - return -(PVRSRV_ERROR_INVALID_PARAMS); - } - - pMapping = pBuf->pMapping; - - if ((pMapping->ui32Flags & PVRSRV_HAP_GPU_PAGEABLE) == 0) - { - PVR_DPF((PVR_DBG_ERROR, "BM_UnmapFromDev: cannot unmap non-pageable buffer")); - return -(PVRSRV_ERROR_STILL_MAPPED); - } - - result = DevMemoryFree(pMapping); - - if(result == 0) - pBuf->DevVAddr.uiAddr = PVRSRV_BAD_DEVICE_ADDRESS; - - return result; -} - -/*---------------------------------------------------------------------------- -<function> - FUNCTION: BM_RemapToDev - - PURPOSE: Maps a buffer back into GPU virtual address space, after it - has been BM_UnmapFromDev()'d. After this operation, the GPU - virtual address may have changed, so BM_HandleToDevVaddr() - should be called to get the new address. - - PARAMETERS: In: hBuf - buffer handle. - RETURNS: IMG_TRUE - Success - IMG_FALSE - Failure -</function> ------------------------------------------------------------------------------*/ -IMG_INT32 -BM_RemapToDev(BM_HANDLE hBuf) -{ - BM_BUF *pBuf = (BM_BUF *)hBuf; - BM_MAPPING *pMapping; - IMG_INT32 mapCount; - - PVR_ASSERT (pBuf != IMG_NULL); - - if (pBuf == IMG_NULL) - { - PVR_DPF((PVR_DBG_ERROR, "BM_RemapToDev: invalid parameter")); - return -PVRSRV_ERROR_INVALID_PARAMS; - } - - pMapping = pBuf->pMapping; - - if ((pMapping->ui32Flags & PVRSRV_HAP_GPU_PAGEABLE) == 0) - { - PVR_DPF((PVR_DBG_ERROR, "BM_RemapToDev: cannot remap non-pageable buffer")); - return -PVRSRV_ERROR_BAD_MAPPING; - } - - mapCount = DevMemoryAlloc(pMapping->pBMHeap->pBMContext, pMapping, IMG_NULL, - pMapping->ui32Flags, pMapping->ui32DevVAddrAlignment, &pBuf->DevVAddr); - - if(mapCount <= 0) - { - PVR_DPF((PVR_DBG_WARNING, "BM_RemapToDev: failed to allocate device memory")); - } - - return mapCount; -} - /*! ****************************************************************************** @@ -2224,52 +2119,48 @@ BM_RemapToDev(BM_HANDLE hBuf) allocation. @Output pActualSize - the actual size of the block allocated in bytes. - @Input uFlags - allocation flags + @Input ui32Flags - allocation flags @Input dev_vaddr_alignment - required device virtual address alignment, or 0. @Output pDevVAddr - receives the device virtual base address of the allocated block. - @Return IMG_INT32 - Reference count - -1 - Failed. + @Return IMG_TRUE - Success + IMG_FALSE - Failed. *****************************************************************************/ -static IMG_INT32 +static IMG_BOOL DevMemoryAlloc (BM_CONTEXT *pBMContext, BM_MAPPING *pMapping, IMG_SIZE_T *pActualSize, - IMG_UINT32 uFlags, + IMG_UINT32 ui32Flags, IMG_UINT32 dev_vaddr_alignment, IMG_DEV_VIRTADDR *pDevVAddr) { PVRSRV_DEVICE_NODE *psDeviceNode; #ifdef PDUMP IMG_UINT32 ui32PDumpSize = (IMG_UINT32)pMapping->uSize; + IMG_UINT32 ui32PDumpFlags; #endif - if(pMapping->ui32MappingCount > 0) - { - pMapping->ui32MappingCount++; - *pDevVAddr = pMapping->DevVAddr; - return pMapping->ui32MappingCount; - } - psDeviceNode = pBMContext->psDeviceNode; - pMapping->ui32DevVAddrAlignment = dev_vaddr_alignment; +#ifdef PDUMP +#if defined(SUPPORT_PDUMP_MULTI_PROCESS) + ui32PDumpFlags = psDeviceNode->pfnMMUIsHeapShared(pMapping->pBMHeap->pMMUHeap) + ? PDUMP_FLAGS_PERSISTENT : PDUMP_FLAGS_CONTINUOUS; +#else + ui32PDumpFlags = PDUMP_FLAGS_CONTINUOUS; +#endif +#endif - if(uFlags & PVRSRV_MEM_INTERLEAVED) + if(ui32Flags & PVRSRV_MEM_INTERLEAVED) { /* double the size */ - /* don't continue to alter the size each time a buffer is remapped.. - * we only want to do this the first time - */ - /* TODO: FIXME: There is something wrong with this logic */ - if (pMapping->ui32MappingCount == 0) - pMapping->uSize *= 2; + pMapping->uSize *= 2; } #ifdef PDUMP - if(uFlags & PVRSRV_MEM_DUMMY) + if(ui32Flags & PVRSRV_MEM_DUMMY) { /* only one page behind a dummy allocation */ ui32PDumpSize = pMapping->pBMHeap->sDevArena.ui32DataPageSize; @@ -2287,8 +2178,7 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, &(pMapping->DevVAddr))) { PVR_DPF((PVR_DBG_ERROR, "DevMemoryAlloc ERROR MMU_Alloc")); - pDevVAddr->uiAddr = PVRSRV_BAD_DEVICE_ADDRESS; - return -(PVRSRV_ERROR_FAILED_TO_ALLOC_VIRT_MEMORY); + return IMG_FALSE; } #ifdef SUPPORT_SGX_MMU_BYPASS @@ -2303,12 +2193,8 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, pMapping->hOSMemHandle, ui32PDumpSize, pMapping->pBMHeap->sDevArena.ui32DataPageSize, -#if defined(SUPPORT_PDUMP_MULTI_PROCESS) - psDeviceNode->pfnMMUIsHeapShared(pMapping->pBMHeap->pMMUHeap), -#else - IMG_FALSE, // unused -#endif /* SUPPORT_PDUMP_MULTI_PROCESS */ - (IMG_HANDLE)pMapping); + (IMG_HANDLE)pMapping, + ui32PDumpFlags); #endif switch (pMapping->eCpuMemoryOrigin) @@ -2317,7 +2203,7 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, case hm_wrapped_virtaddr: case hm_contiguous: { - if (uFlags & PVRSRV_MEM_SPARSE) + if (ui32Flags & PVRSRV_MEM_SPARSE) { /* Check if this device supports sparse mappings */ PVR_ASSERT(psDeviceNode->pfnMMUMapPagesSparse != IMG_NULL); @@ -2328,7 +2214,7 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, pMapping->ui32NumVirtChunks, pMapping->ui32NumPhysChunks, pMapping->pabMapChunk, - uFlags, + ui32Flags, (IMG_HANDLE)pMapping); } else @@ -2337,7 +2223,7 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, pMapping->DevVAddr, SysCpuPAddrToSysPAddr (pMapping->CpuPAddr), pMapping->uSize, - uFlags, + ui32Flags, (IMG_HANDLE)pMapping); } *pDevVAddr = pMapping->DevVAddr; @@ -2345,7 +2231,7 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, } case hm_env: { - if (uFlags & PVRSRV_MEM_SPARSE) + if (ui32Flags & PVRSRV_MEM_SPARSE) { /* Check if this device supports sparse mappings */ PVR_ASSERT(psDeviceNode->pfnMMUMapShadowSparse != IMG_NULL); @@ -2358,7 +2244,7 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, pMapping->CpuVAddr, pMapping->hOSMemHandle, pDevVAddr, - uFlags, + ui32Flags, (IMG_HANDLE)pMapping); } else @@ -2369,7 +2255,7 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, pMapping->CpuVAddr, pMapping->hOSMemHandle, pDevVAddr, - uFlags, + ui32Flags, (IMG_HANDLE)pMapping); } break; @@ -2381,7 +2267,7 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, pMapping->DevVAddr, pMapping->psSysAddr, pMapping->uSize, - uFlags, + ui32Flags, (IMG_HANDLE)pMapping); *pDevVAddr = pMapping->DevVAddr; @@ -2391,47 +2277,38 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, PVR_DPF((PVR_DBG_ERROR, "Illegal value %d for pMapping->eCpuMemoryOrigin", pMapping->eCpuMemoryOrigin)); - return -(PVRSRV_ERROR_FAILED_TO_MAP_PAGE_TABLE); + return IMG_FALSE; } #ifdef SUPPORT_SGX_MMU_BYPASS DisableHostAccess(pBMContext->psMMUContext); #endif - pMapping->ui32MappingCount = 1; - - return pMapping->ui32MappingCount; + return IMG_TRUE; } -static IMG_INT32 +static IMG_VOID DevMemoryFree (BM_MAPPING *pMapping) { PVRSRV_DEVICE_NODE *psDeviceNode; IMG_DEV_PHYADDR sDevPAddr; #ifdef PDUMP IMG_UINT32 ui32PSize; + IMG_UINT32 ui32PDumpFlags; #endif - if(pMapping->ui32MappingCount > 1) - { - pMapping->ui32MappingCount--; - - /* Nothing else to do for now */ - return pMapping->ui32MappingCount; - } - - if (pMapping->ui32MappingCount == 0) - { - /* already unmapped from GPU.. bail */ - return -(PVRSRV_ERROR_MAPPING_NOT_FOUND); - } - - /* Then pMapping->ui32MappingCount is 1 - * ready to release GPU mapping */ - psDeviceNode = pMapping->pBMHeap->pBMContext->psDeviceNode; sDevPAddr = psDeviceNode->pfnMMUGetPhysPageAddr(pMapping->pBMHeap->pMMUHeap, pMapping->DevVAddr); +#ifdef PDUMP +#if defined(SUPPORT_PDUMP_MULTI_PROCESS) + ui32PDumpFlags = psDeviceNode->pfnMMUIsHeapShared(pMapping->pBMHeap->pMMUHeap) + ? PDUMP_FLAGS_PERSISTENT : PDUMP_FLAGS_CONTINUOUS; +#else + ui32PDumpFlags = PDUMP_FLAGS_CONTINUOUS; +#endif +#endif + if (sDevPAddr.uiAddr != 0) { #ifdef PDUMP @@ -2452,20 +2329,17 @@ DevMemoryFree (BM_MAPPING *pMapping) pMapping->pBMHeap->sDevArena.ui32DataPageSize, (IMG_HANDLE)pMapping, (pMapping->ui32Flags & PVRSRV_MEM_INTERLEAVED) ? IMG_TRUE : IMG_FALSE, - (pMapping->ui32Flags & PVRSRV_MEM_SPARSE) ? IMG_TRUE : IMG_FALSE); + (pMapping->ui32Flags & PVRSRV_MEM_SPARSE) ? IMG_TRUE : IMG_FALSE, + ui32PDumpFlags); #endif } PVR_ASSERT(pMapping->uSizeVM != 0); psDeviceNode->pfnMMUFree (pMapping->pBMHeap->pMMUHeap, pMapping->DevVAddr, IMG_CAST_TO_DEVVADDR_UINT(pMapping->uSizeVM)); - - pMapping->ui32MappingCount = 0; - - return pMapping->ui32MappingCount; } /* If this array grows larger, it might be preferable to use a hashtable rather than an array. */ #ifndef XPROC_WORKAROUND_NUM_SHAREABLES -#define XPROC_WORKAROUND_NUM_SHAREABLES 500 +#define XPROC_WORKAROUND_NUM_SHAREABLES 200 #endif #define XPROC_WORKAROUND_BAD_SHAREINDEX 0773407734 @@ -2480,14 +2354,6 @@ static IMG_UINT32 gXProcWorkaroundState = XPROC_WORKAROUND_UNKNOWN; /* PRQA S 0686 10 */ /* force compiler to init structure */ XPROC_DATA gXProcWorkaroundShareData[XPROC_WORKAROUND_NUM_SHAREABLES] = {{0}}; -IMG_INT32 BM_XProcGetShareDataRefCount(IMG_UINT32 ui32Index) -{ - if(ui32Index >= XPROC_WORKAROUND_NUM_SHAREABLES) - return -1; - - return gXProcWorkaroundShareData[ui32Index].ui32RefCount; -} - PVRSRV_ERROR BM_XProcWorkaroundSetShareIndex(IMG_UINT32 ui32Index) { /* if you fail this assertion - did you acquire the mutex? @@ -2581,8 +2447,7 @@ XProcWorkaroundAllocShareable(RA_ARENA *psArena, if (ui32AllocFlags != gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32AllocFlags) { PVR_DPF((PVR_DBG_ERROR, - "%s ERROR: Flags don't match (Shared 0x%08x, Requested 0x%08x)!", - __FUNCTION__, + "Can't! Flags don't match! (I had 0x%08x, you gave 0x%08x)", gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32AllocFlags, ui32AllocFlags)); return PVRSRV_ERROR_INVALID_PARAMS; @@ -2591,24 +2456,14 @@ XProcWorkaroundAllocShareable(RA_ARENA *psArena, if (ui32Size != gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32Size) { PVR_DPF((PVR_DBG_ERROR, - "%s ERROR: Size doesn't match (Shared %d, Requested %d) with flags 0x%08x - 0x%08x!", - __FUNCTION__, - gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32Size, - ui32Size, - gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32AllocFlags, - ui32AllocFlags)); + "Can't! Size doesn't match!")); return PVRSRV_ERROR_INVALID_PARAMS; } if (ui32PageSize != gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32PageSize) { PVR_DPF((PVR_DBG_ERROR, - "%s ERROR: Page Size doesn't match (Shared %d, Requested %d) with flags 0x%08x - 0x%08x!", - __FUNCTION__, - gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32PageSize, - ui32PageSize, - gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32AllocFlags, - ui32AllocFlags)); + "Can't! Page Size doesn't match!")); return PVRSRV_ERROR_INVALID_PARAMS; } @@ -2780,7 +2635,7 @@ IMG_VOID _BM_XProcIndexRelease(IMG_UINT32 ui32Index) } sSysPAddr = gXProcWorkaroundShareData[ui32Index].sSysPAddr; RA_Free (gXProcWorkaroundShareData[ui32Index].psArena, - sSysPAddr.uiAddr, + (IMG_UINTPTR_T)sSysPAddr.uiAddr, IMG_FALSE); } else @@ -2827,7 +2682,7 @@ static IMG_VOID XProcWorkaroundFreeShareable(IMG_HANDLE hOSMemHandle) which may be >= requested size @Output ppsMapping - receives the arbitrary user reference associated with the underlying storage. - @Input uFlags - bit mask of allocation flags + @Input ui32Flags - bit mask of allocation flags @Input pvPrivData - opaque private data passed through to allocator @Input ui32PrivDataLength - length of opaque private data @Output pBase - receives a pointer to the allocated storage. @@ -2841,7 +2696,7 @@ BM_ImportMemory (IMG_VOID *pH, IMG_SIZE_T uRequestSize, IMG_SIZE_T *pActualSize, BM_MAPPING **ppsMapping, - IMG_UINT32 uFlags, + IMG_UINT32 ui32Flags, IMG_PVOID pvPrivData, IMG_UINT32 ui32PrivDataLength, IMG_UINTPTR_T *pBase) @@ -2849,14 +2704,15 @@ BM_ImportMemory (IMG_VOID *pH, BM_MAPPING *pMapping; BM_HEAP *pBMHeap = pH; BM_CONTEXT *pBMContext = pBMHeap->pBMContext; - IMG_INT32 uResult; + IMG_BOOL bResult; IMG_SIZE_T uSize; IMG_SIZE_T uPSize; IMG_SIZE_T uDevVAddrAlignment = 0; /* ? */ PVR_DPF ((PVR_DBG_MESSAGE, - "BM_ImportMemory (pBMContext=0x%x, uRequestSize=0x%x, uFlags=0x%x, uAlign=0x%x)", - (IMG_UINTPTR_T)pBMContext, uRequestSize, uFlags, uDevVAddrAlignment)); + "BM_ImportMemory (pBMContext=0x%p, uRequestSize=0x%" SIZE_T_FMT_LEN + "x, ui32Flags=0x%x, uAlign=0x%" SIZE_T_FMT_LEN "x)", + pBMContext, uRequestSize, ui32Flags, uDevVAddrAlignment)); PVR_ASSERT (ppsMapping != IMG_NULL); PVR_ASSERT (pBMContext != IMG_NULL); @@ -2882,15 +2738,14 @@ BM_ImportMemory (IMG_VOID *pH, pMapping->hOSMemHandle = 0; pMapping->CpuVAddr = 0; pMapping->DevVAddr.uiAddr = 0; - pMapping->ui32MappingCount = 0; pMapping->CpuPAddr.uiAddr = 0; pMapping->uSize = uSize; - if ((uFlags & PVRSRV_MEM_SPARSE) == 0) + if ((ui32Flags & PVRSRV_MEM_SPARSE) == 0) { pMapping->uSizeVM = uSize; } pMapping->pBMHeap = pBMHeap; - pMapping->ui32Flags = uFlags; + pMapping->ui32Flags = ui32Flags; /* * If anyone want's to know, pass back the actual size of our allocation. @@ -2912,16 +2767,11 @@ BM_ImportMemory (IMG_VOID *pH, uPSize = pMapping->uSize; } - if (uFlags & PVRSRV_MEM_XPROC) + if (ui32Flags & PVRSRV_MEM_XPROC) { IMG_UINT32 ui32Attribs = pBMHeap->ui32Attribs | PVRSRV_MEM_XPROC; IMG_BOOL bBadBackingStoreType; - if(uFlags & PVRSRV_MEM_ION) - { - ui32Attribs |= PVRSRV_MEM_ION; - } - bBadBackingStoreType = IMG_TRUE; if ((ui32Attribs & PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG) != 0) @@ -2956,7 +2806,7 @@ BM_ImportMemory (IMG_VOID *pH, &pMapping->hOSMemHandle) != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, - "BM_ImportMemory: XProcWorkaroundAllocShareable(0x%x) failed", + "BM_ImportMemory: XProcWorkaroundAllocShareable(0x%" SIZE_T_FMT_LEN "x) failed", uPSize)); goto fail_mapping_alloc; } @@ -3000,7 +2850,7 @@ BM_ImportMemory (IMG_VOID *pH, &pMapping->hOSMemHandle) != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, - "BM_ImportMemory: XProcWorkaroundAllocShareable(0x%x) failed", + "BM_ImportMemory: XProcWorkaroundAllocShareable(0x%" SIZE_T_FMT_LEN "x) failed", uPSize)); goto fail_mapping_alloc; } @@ -3060,7 +2910,7 @@ BM_ImportMemory (IMG_VOID *pH, &pMapping->hOSMemHandle) != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, - "BM_ImportMemory: OSAllocPages(0x%x) failed", + "BM_ImportMemory: OSAllocPages(0x%" SIZE_T_FMT_LEN "x) failed", uPSize)); goto fail_mapping_alloc; } @@ -3102,7 +2952,7 @@ BM_ImportMemory (IMG_VOID *pH, ui32PrivDataLength, (IMG_UINTPTR_T *)&sSysPAddr.uiAddr)) { - PVR_DPF((PVR_DBG_ERROR, "BM_ImportMemory: RA_Alloc(0x%x) FAILED", uPSize)); + PVR_DPF((PVR_DBG_ERROR, "BM_ImportMemory: RA_Alloc(0x%" SIZE_T_FMT_LEN "x) FAILED", uPSize)); goto fail_mapping_alloc; } @@ -3128,42 +2978,21 @@ BM_ImportMemory (IMG_VOID *pH, goto fail_mapping_alloc; } - if(uFlags & PVRSRV_MEM_ION) - { - IMG_UINT32 ui32AddressOffsets[PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES]; - IMG_UINT32 ui32NumAddrOffsets = PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES; - - IMG_INT32 retSize = OSGetMemMultiPlaneInfo(pMapping->hOSMemHandle, - ui32AddressOffsets, &ui32NumAddrOffsets); - - if(retSize > 0 && pActualSize) - { - *pActualSize = pMapping->uSize = retSize; - } - } - /* * Allocate some device memory for what we just allocated. */ - /* - * Do not allocate GPU mapping if NO_GPU_VIRTUAL_ON_ALLOC is requested. - * In the case where CBI is enabled, this allows for late - * GPU mapping. This flag is, otherwise, used in cases where only - * the memory management feature of the driver is utilized, without - * a need for GPU rendering - */ - if ((uFlags & (PVRSRV_MEM_SPARSE | PVRSRV_HAP_NO_GPU_VIRTUAL_ON_ALLOC)) == 0) + if ((ui32Flags & PVRSRV_MEM_SPARSE) == 0) { - uResult = DevMemoryAlloc (pBMContext, + bResult = DevMemoryAlloc (pBMContext, pMapping, IMG_NULL, - uFlags, + ui32Flags, (IMG_UINT32)uDevVAddrAlignment, &pMapping->DevVAddr); - if (uResult <= 0) + if (!bResult) { PVR_DPF((PVR_DBG_ERROR, - "BM_ImportMemory: DevMemoryAlloc(0x%x) failed", + "BM_ImportMemory: DevMemoryAlloc(0x%" SIZE_T_FMT_LEN "x) failed", pMapping->uSize)); goto fail_dev_mem_alloc; } @@ -3172,10 +3001,9 @@ BM_ImportMemory (IMG_VOID *pH, /* PRQA S 3356,3358 1 */ PVR_ASSERT (uDevVAddrAlignment>1?(pMapping->DevVAddr.uiAddr%uDevVAddrAlignment)==0:1); PVR_ASSERT(pBase); + *pBase = pMapping->DevVAddr.uiAddr; } - if(pBase) - *pBase = pMapping->DevVAddr.uiAddr; *ppsMapping = pMapping; PVR_DPF ((PVR_DBG_MESSAGE, "BM_ImportMemory: IMG_TRUE")); @@ -3199,7 +3027,7 @@ fail_dev_mem_alloc: uPSize = pMapping->uSize; } - if (uFlags & PVRSRV_MEM_XPROC) + if (ui32Flags & PVRSRV_MEM_XPROC) { XProcWorkaroundFreeShareable(pMapping->hOSMemHandle); } @@ -3223,7 +3051,7 @@ fail_dev_mem_alloc: pMapping->hOSMemHandle); } sSysPAddr = SysCpuPAddrToSysPAddr(pMapping->CpuPAddr); - RA_Free (pBMHeap->pLocalDevMemArena, sSysPAddr.uiAddr, IMG_FALSE); + RA_Free (pBMHeap->pLocalDevMemArena, (IMG_UINTPTR_T)sSysPAddr.uiAddr, IMG_FALSE); } } fail_mapping_alloc: @@ -3259,8 +3087,8 @@ BM_FreeMemory (IMG_VOID *h, IMG_UINTPTR_T _base, BM_MAPPING *psMapping) PVR_UNREFERENCED_PARAMETER (_base); PVR_DPF ((PVR_DBG_MESSAGE, - "BM_FreeMemory (h=0x%x, base=0x%x, psMapping=0x%x)", - (IMG_UINTPTR_T)h, _base, (IMG_UINTPTR_T)psMapping)); + "BM_FreeMemory (h=0x%p, base=0x" UINTPTR_FMT ", psMapping=0x%p)", + h, _base, psMapping)); PVR_ASSERT (psMapping != IMG_NULL); @@ -3315,7 +3143,7 @@ BM_FreeMemory (IMG_VOID *h, IMG_UINTPTR_T _base, BM_MAPPING *psMapping) sSysPAddr = SysCpuPAddrToSysPAddr(psMapping->CpuPAddr); - RA_Free (pBMHeap->pLocalDevMemArena, sSysPAddr.uiAddr, IMG_FALSE); + RA_Free (pBMHeap->pLocalDevMemArena, (IMG_UINTPTR_T)sSysPAddr.uiAddr, IMG_FALSE); } else { @@ -3326,8 +3154,8 @@ BM_FreeMemory (IMG_VOID *h, IMG_UINTPTR_T _base, BM_MAPPING *psMapping) /*not nulling pointer, copy on stack*/ PVR_DPF((PVR_DBG_MESSAGE, - "..BM_FreeMemory (h=0x%x, base=0x%x)", - (IMG_UINTPTR_T)h, _base)); + "..BM_FreeMemory (h=0x%p, base=0x" UINTPTR_FMT ")", + h, _base)); } /*! diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/deviceclass.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/deviceclass.c index 4c54d1d..7a96e0e 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/deviceclass.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/deviceclass.c @@ -50,21 +50,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "deviceid.h" #include "lists.h" -#if defined(CONFIG_GCBV) -#include "gc_bvmapping.h" + +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) +#include "pvr_sync.h" #endif PVRSRV_ERROR AllocateDeviceID(SYS_DATA *psSysData, IMG_UINT32 *pui32DevID); PVRSRV_ERROR FreeDeviceID(SYS_DATA *psSysData, IMG_UINT32 ui32DevID); -#if defined(SUPPORT_MISR_IN_THREAD) -void OSVSyncMISR(IMG_HANDLE, IMG_BOOL); -#endif - -#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS) -IMG_VOID PVRSRVFreeCommandCompletePacketKM(IMG_HANDLE hCmdCookie, - IMG_BOOL bScheduleMISR); -#endif /*********************************************************************** Local Display Class Structures ************************************************************************/ @@ -1167,6 +1160,14 @@ static PVRSRV_ERROR DestroyDCSwapChain(PVRSRV_DC_SWAPCHAIN *psSwapChain) #if !defined(SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED) if (psSwapChain->ppsLastSyncInfos) { + for (i = 0; i < psSwapChain->ui32LastNumSyncInfos; i++) + { + if (psSwapChain->ppsLastSyncInfos[i]) + { + PVRSRVKernelSyncInfoDecRef(psSwapChain->ppsLastSyncInfos[i], IMG_NULL); + psSwapChain->ppsLastSyncInfos[i] = IMG_NULL; + } + } OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_KERNEL_SYNC_INFO *) * psSwapChain->ui32LastNumSyncInfos, psSwapChain->ppsLastSyncInfos, IMG_NULL); } @@ -1277,7 +1278,6 @@ PVRSRV_ERROR PVRSRVCreateDCSwapChainKM (PVRSRV_PER_PROCESS_DATA *psPerProc, IMG_UINT32 i; DISPLAY_INFO sDisplayInfo; - if(!hDeviceKM || !psDstSurfAttrib || !psSrcSurfAttrib @@ -1288,18 +1288,14 @@ PVRSRV_ERROR PVRSRVCreateDCSwapChainKM (PVRSRV_PER_PROCESS_DATA *psPerProc, return PVRSRV_ERROR_INVALID_PARAMS; } + OSMemSet (apsSyncData, 0, sizeof(PVRSRV_SYNC_DATA *) * PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS); + if (ui32BufferCount > PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Too many buffers")); return PVRSRV_ERROR_TOOMANYBUFFERS; } - if (ui32BufferCount < 2) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Too few buffers")); - return PVRSRV_ERROR_TOO_FEW_BUFFERS; - } - psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM); if( ui32Flags & PVRSRV_CREATE_SWAPCHAIN_QUERY ) @@ -1611,32 +1607,6 @@ PVRSRV_ERROR PVRSRVGetDCBuffersKM(IMG_HANDLE hDeviceKM, phBuffer[i] = (IMG_HANDLE)&psSwapChain->asBuffer[i]; } -#if defined(SUPPORT_GET_DC_BUFFERS_SYS_PHYADDRS) - for(i = 0; i < *pui32BufferCount; i++) - { - IMG_UINT32 ui32ByteSize, ui32TilingStride; - IMG_SYS_PHYADDR *pPhyAddr; - IMG_BOOL bIsContiguous; - IMG_HANDLE hOSMapInfo; - IMG_VOID *pvVAddr; - - eError = psDCInfo->psFuncTable->pfnGetBufferAddr(psDCInfo->hExtDevice, - ahExtBuffer[i], - &pPhyAddr, - &ui32ByteSize, - &pvVAddr, - &hOSMapInfo, - &bIsContiguous, - &ui32TilingStride); - if(eError != PVRSRV_OK) - { - break; - } - - psPhyAddr[i] = *pPhyAddr; - } -#endif /* defined(SUPPORT_GET_DC_BUFFERS_SYS_PHYADDRS) */ - return eError; } @@ -1680,21 +1650,6 @@ PVRSRV_ERROR PVRSRVSwapToDCBufferKM(IMG_HANDLE hDeviceKM, return PVRSRV_ERROR_INVALID_SWAPINTERVAL; } -#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS) - - if(psDCInfo->psFuncTable->pfnQuerySwapCommandID != IMG_NULL) - { - psDCInfo->psFuncTable->pfnQuerySwapCommandID(psDCInfo->hExtDevice, - psBuffer->psSwapChain->hExtSwapChain, - psBuffer->sDeviceClassBuffer.hExtBuffer, - hPrivateTag, - &ui16SwapCommandID, - &bAddReferenceToLast); - - } - -#endif - /* get the queue from the buffer structure */ psQueue = psBuffer->psSwapChain->psQueue; @@ -1718,6 +1673,7 @@ PVRSRV_ERROR PVRSRVSwapToDCBufferKM(IMG_HANDLE hDeviceKM, apsSrcSync, sizeof(DISPLAYCLASS_FLIP_COMMAND) + (sizeof(IMG_RECT) * ui32ClipRectCount), IMG_NULL, + IMG_NULL, IMG_NULL); if(eError != PVRSRV_OK) { @@ -1837,20 +1793,27 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, PVRSRV_KERNEL_SYNC_INFO **ppsSyncInfos, IMG_UINT32 ui32NumMemSyncInfos, IMG_PVOID pvPrivData, - IMG_UINT32 ui32PrivDataLength) + IMG_UINT32 ui32PrivDataLength, + IMG_HANDLE *phFence) { + IMG_UINT32 ui32NumSyncInfos = ui32NumMemSyncInfos; + IMG_UINT32 ui32NumMemInfos = ui32NumMemSyncInfos; PVRSRV_KERNEL_SYNC_INFO **ppsCompiledSyncInfos; IMG_UINT32 i, ui32NumCompiledSyncInfos; DISPLAYCLASS_FLIP_COMMAND2 *psFlipCmd; PVRSRV_DISPLAYCLASS_INFO *psDCInfo; PVRSRV_DC_SWAPCHAIN *psSwapChain; - PVRSRV_ERROR eError = PVRSRV_OK; CALLBACK_DATA *psCallbackData; PVRSRV_QUEUE_INFO *psQueue; PVRSRV_COMMAND *psCommand; IMG_PVOID *ppvMemInfos; + PVRSRV_ERROR eError; SYS_DATA *psSysData; +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + struct sync_fence *apsFence[SGX_MAX_SRC_SYNCS_TA] = {}; +#endif /* defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ + if(!hDeviceKM || !hSwapChain || !ppsMemInfos || !ppsSyncInfos || ui32NumMemSyncInfos < 1) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Invalid parameters")); @@ -1882,7 +1845,7 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, psCallbackData->ui32PrivDataLength = ui32PrivDataLength; if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, - sizeof(IMG_VOID *) * ui32NumMemSyncInfos, + sizeof(IMG_VOID *) * ui32NumMemInfos, (IMG_VOID **)&ppvMemInfos, IMG_NULL, "Swap Command Meminfos") != PVRSRV_OK) { @@ -1891,13 +1854,22 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, goto Exit; } - for(i = 0; i < ui32NumMemSyncInfos; i++) + for(i = 0; i < ui32NumMemInfos; i++) { ppvMemInfos[i] = ppsMemInfos[i]; } psCallbackData->ppvMemInfos = ppvMemInfos; - psCallbackData->ui32NumMemInfos = ui32NumMemSyncInfos; + psCallbackData->ui32NumMemInfos = ui32NumMemInfos; + +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + eError = PVRSyncFencesToSyncInfos(ppsSyncInfos, &ui32NumSyncInfos, apsFence); + if(eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: PVRSyncFencesToSyncInfos failed")); + goto Exit; + } +#endif /* defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ /* get the queue from the buffer structure */ psQueue = psSwapChain->psQueue; @@ -1906,21 +1878,35 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, if(psSwapChain->ppsLastSyncInfos) { IMG_UINT32 ui32NumUniqueSyncInfos = psSwapChain->ui32LastNumSyncInfos; + IMG_BOOL *abUnique; IMG_UINT32 j; + if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, + sizeof(IMG_BOOL) * psSwapChain->ui32LastNumSyncInfos, + (IMG_VOID **)&abUnique, IMG_NULL, + "Unique booleans") != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to allocate space for unique booleans")); + goto Exit; + } + for(j = 0; j < psSwapChain->ui32LastNumSyncInfos; j++) { - for(i = 0; i < ui32NumMemSyncInfos; i++) + abUnique[j] = IMG_TRUE; + for(i = 0; i < ui32NumSyncInfos; i++) { + PVR_ASSERT(psSwapChain->ppsLastSyncInfos[j]); + PVR_ASSERT(ppsSyncInfos[i]); if(psSwapChain->ppsLastSyncInfos[j] == ppsSyncInfos[i]) { - psSwapChain->ppsLastSyncInfos[j] = IMG_NULL; + abUnique[j] = IMG_FALSE; ui32NumUniqueSyncInfos--; + break; } } } - ui32NumCompiledSyncInfos = ui32NumMemSyncInfos + ui32NumUniqueSyncInfos; + ui32NumCompiledSyncInfos = ui32NumSyncInfos + ui32NumUniqueSyncInfos; if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_KERNEL_SYNC_INFO *) * ui32NumCompiledSyncInfos, @@ -1928,24 +1914,132 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, "Compiled syncinfos") != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to allocate space for meminfo list")); + OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, + sizeof(IMG_BOOL) * psSwapChain->ui32LastNumSyncInfos, + (IMG_VOID *)abUnique, IMG_NULL); +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + for(i = 0; i < SGX_MAX_SRC_SYNCS_TA && apsFence[i]; i++) + sync_fence_put(apsFence[i]); +#endif goto Exit; } - OSMemCopy(ppsCompiledSyncInfos, ppsSyncInfos, sizeof(PVRSRV_KERNEL_SYNC_INFO *) * ui32NumMemSyncInfos); - for(j = 0, i = ui32NumMemSyncInfos; j < psSwapChain->ui32LastNumSyncInfos; j++) + OSMemCopy(ppsCompiledSyncInfos, ppsSyncInfos, sizeof(PVRSRV_KERNEL_SYNC_INFO *) * ui32NumSyncInfos); + for(j = 0, i = ui32NumSyncInfos; j < psSwapChain->ui32LastNumSyncInfos; j++) { - if(psSwapChain->ppsLastSyncInfos[j]) + if(abUnique[j]) { ppsCompiledSyncInfos[i] = psSwapChain->ppsLastSyncInfos[j]; i++; } } + + OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, + sizeof(IMG_BOOL) * psSwapChain->ui32LastNumSyncInfos, + (IMG_VOID *)abUnique, IMG_NULL); } else #endif /* !defined(SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED) */ { - ppsCompiledSyncInfos = ppsSyncInfos; - ui32NumCompiledSyncInfos = ui32NumMemSyncInfos; + IMG_UINT32 j, ui32Missing = 0; + + /* Older synchronization schemes would just pass down the syncinfos + * hanging off of the meminfos. So we would expect identical lists. + * However, newer drivers may send down additional synchronization + * i.e. for TQ fence operations. In such a case we need to allocate + * more space for the compiled syncinfos to ensure everything is + * ROP2 synchronized. + */ + for(i = 0; i < ui32NumMemInfos; i++) + { + for(j = 0; j < ui32NumSyncInfos; j++) + { + if(ppsSyncInfos[j] == ppsMemInfos[i]->psKernelSyncInfo) + break; + } + + if(j == ui32NumSyncInfos) + ui32Missing++; + } + + if(ui32Missing) + { + IMG_UINT32 k; + + ui32NumCompiledSyncInfos = ui32NumSyncInfos + ui32Missing; + + if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, + sizeof(PVRSRV_KERNEL_SYNC_INFO *) * ui32NumCompiledSyncInfos, + (IMG_VOID **)&ppsCompiledSyncInfos, IMG_NULL, + "Compiled syncinfos") != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to allocate space for meminfo list")); +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + for(i = 0; i < SGX_MAX_SRC_SYNCS_TA && apsFence[i]; i++) + sync_fence_put(apsFence[i]); +#endif + goto Exit; + } + + for(i = 0; i < ui32NumSyncInfos; i++) + { + ppsCompiledSyncInfos[i] = ppsSyncInfos[i]; + } + + k = i; + for(i = 0; i < ui32NumMemInfos; i++) + { + for(j = 0; j < ui32NumSyncInfos; j++) + { + if(ppsSyncInfos[j] == ppsMemInfos[i]->psKernelSyncInfo) + break; + } + + if(j == ui32NumSyncInfos) + { + /* Insert the unique one */ + PVR_ASSERT(k < ui32NumCompiledSyncInfos); + ppsCompiledSyncInfos[k] = ppsMemInfos[i]->psKernelSyncInfo; + k++; + } + } + + PVR_ASSERT(k == ui32NumCompiledSyncInfos); + + /* As a further complication, if we have multiple displays, we + * might see the same layer/meminfo submitted twice. This is + * valid, as the layer might be needed by two separate pipes, + * but we should not use the meminfo's synchronization twice + * because this will deadlock the queue processor. + * + * For now, work over the meminfo end of the compiled syncs + * list and collapse any duplicates. We can assume the fence + * sync part of the array has already been de-duplicated. + */ + k = ui32NumSyncInfos; + for(i = ui32NumSyncInfos; i < ui32NumCompiledSyncInfos; i++) + { + /* Compare the i'th entry with all that follow */ + for(j = i + 1; j < ui32NumCompiledSyncInfos; j++) + { + if(ppsCompiledSyncInfos[i] == ppsCompiledSyncInfos[j]) + break; + } + + if(j == ui32NumCompiledSyncInfos) + { + /* No duplicate found. Use this entry */ + ppsCompiledSyncInfos[k] = ppsCompiledSyncInfos[i]; + k++; + } + } + ui32NumCompiledSyncInfos = k; + } + else + { + ppsCompiledSyncInfos = ppsSyncInfos; + ui32NumCompiledSyncInfos = ui32NumSyncInfos; + } } /* insert the command (header) */ @@ -1959,7 +2053,17 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, ppsCompiledSyncInfos, sizeof(DISPLAYCLASS_FLIP_COMMAND2), FreePrivateData, - psCallbackData); + psCallbackData, + phFence); + +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + /* InsertCommand bumped the refcount on the raw sync objects, so we + * can put the fences now. Even if the fences are deleted, the syncs + * will persist. + */ + for(i = 0; i < SGX_MAX_SRC_SYNCS_TA && apsFence[i]; i++) + sync_fence_put(apsFence[i]); +#endif if (ppsCompiledSyncInfos != ppsSyncInfos) { @@ -1991,7 +2095,7 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, psFlipCmd->ui32PrivDataLength = ui32PrivDataLength; psFlipCmd->ppsMemInfos = (PDC_MEM_INFO *)ppvMemInfos; - psFlipCmd->ui32NumMemInfos = ui32NumMemSyncInfos; + psFlipCmd->ui32NumMemInfos = ui32NumMemInfos; /* Even though this is "unused", we have to initialize it, * as the display controller might NULL-test it. @@ -2027,6 +2131,11 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to submit command")); +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + sync_fence_put(psCommand->pvCleanupFence); + sync_fence_put(*phFence); + *phFence = IMG_NULL; +#endif goto Exit; } @@ -2041,34 +2150,60 @@ PVRSRV_ERROR PVRSRVSwapToDCBuffer2KM(IMG_HANDLE hDeviceKM, if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to schedule MISR")); +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + sync_fence_put(*phFence); + *phFence = IMG_NULL; +#endif goto Exit; } #if !defined(SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED) /* Reallocate the syncinfo list if it was too small */ - if (psSwapChain->ui32LastNumSyncInfos < ui32NumMemSyncInfos) + if (psSwapChain->ui32LastNumSyncInfos < ui32NumSyncInfos) { if (psSwapChain->ppsLastSyncInfos) { + for (i = 0; i < psSwapChain->ui32LastNumSyncInfos; i++) + { + if (psSwapChain->ppsLastSyncInfos[i]) + { + PVRSRVKernelSyncInfoDecRef(psSwapChain->ppsLastSyncInfos[i], IMG_NULL); + psSwapChain->ppsLastSyncInfos[i] = IMG_NULL; + } + } OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_KERNEL_SYNC_INFO *) * psSwapChain->ui32LastNumSyncInfos, psSwapChain->ppsLastSyncInfos, IMG_NULL); } if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, - sizeof(PVRSRV_KERNEL_SYNC_INFO *) * ui32NumMemSyncInfos, + sizeof(PVRSRV_KERNEL_SYNC_INFO *) * ui32NumSyncInfos, (IMG_VOID **)&psSwapChain->ppsLastSyncInfos, IMG_NULL, "Last syncinfos") != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBuffer2KM: Failed to allocate space for meminfo list")); +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + sync_fence_put(*phFence); + *phFence = IMG_NULL; +#endif goto Exit; } } - psSwapChain->ui32LastNumSyncInfos = ui32NumMemSyncInfos; + for (i = 0; i < psSwapChain->ui32LastNumSyncInfos; i++) + { + if (psSwapChain->ppsLastSyncInfos[i]) + { + PVRSRVKernelSyncInfoDecRef(psSwapChain->ppsLastSyncInfos[i], IMG_NULL); + psSwapChain->ppsLastSyncInfos[i] = IMG_NULL; + } + } + + psSwapChain->ui32LastNumSyncInfos = ui32NumSyncInfos; - for(i = 0; i < ui32NumMemSyncInfos; i++) + for(i = 0; i < ui32NumSyncInfos; i++) { psSwapChain->ppsLastSyncInfos[i] = ppsSyncInfos[i]; + PVRSRVKernelSyncInfoIncRef(psSwapChain->ppsLastSyncInfos[i], IMG_NULL); } #endif /* !defined(SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED) */ @@ -2120,7 +2255,7 @@ PVRSRV_ERROR PVRSRVSwapToDCSystemKM(IMG_HANDLE hDeviceKM, psSwapChain = psSwapChainRef->psSwapChain; /* - If more then 1 reference to the swapchain exist then + If more than 1 reference to the swapchain exists then ignore any request to swap to the system buffer */ if (psSwapChain->ui32RefCount > 1) @@ -2131,21 +2266,6 @@ PVRSRV_ERROR PVRSRVSwapToDCSystemKM(IMG_HANDLE hDeviceKM, /* get the queue from the buffer structure */ psQueue = psSwapChain->psQueue; -#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS) - - if(psDCInfo->psFuncTable->pfnQuerySwapCommandID != IMG_NULL) - { - psDCInfo->psFuncTable->pfnQuerySwapCommandID(psDCInfo->hExtDevice, - psSwapChain->hExtSwapChain, - psDCInfo->sSystemBuffer.sDeviceClassBuffer.hExtBuffer, - 0, - &ui16SwapCommandID, - &bAddReferenceToLast); - - } - -#endif - /* specify the syncs */ apsSrcSync[0] = psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo; if(bAddReferenceToLast && psSwapChain->psLastFlipBuffer) @@ -2169,6 +2289,7 @@ PVRSRV_ERROR PVRSRVSwapToDCSystemKM(IMG_HANDLE hDeviceKM, apsSrcSync, sizeof(DISPLAYCLASS_FLIP_COMMAND), IMG_NULL, + IMG_NULL, IMG_NULL); if(eError != PVRSRV_OK) { @@ -2373,69 +2494,6 @@ PVRSRVDCMemInfoIsPhysContig(PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo) return OSMemHandleIsPhysContig(psKernelMemInfo->sMemBlk.hOSMemHandle); } -static PVRSRV_ERROR PVRSRVDCMemInfoGetBvHandle(PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo, IMG_VOID **handle) -{ -#if !defined(CONFIG_GCBV) - *handle = NULL; - return PVRSRV_ERROR_NOT_SUPPORTED; -#else - *handle = gc_meminfo_to_hndl(psKernelMemInfo); - return PVRSRV_OK; -#endif -} - -/*! -****************************************************************************** - - @Function PVRSRVDCMemInfoGetCpuMultiPlanePAddr - - @Description returns physical addresses of a multi-plane buffer - - - @Input psKernelMemInfo - Pointer to Kernel Memory Info structure - puPlaneByteOffsets - requested offset inside the plane. - If the array is a NULL pointer, 0 requested offsets - are assumed for all planes; - pui32NumAddrOffsets - specifying the size of the user array. - If the array is smaller than the number of the planes - for this buffer, the correct size will be set and an - error returned back; - -@Output pPlanePAddrs - array of plane physical addresses of the returned size - in pui32NumAddrOffsets; - pui32NumAddrOffsets - contains the real number of planes for the buffer; - -@Return IMG_INT32 : size of the entire buffer or negative number on ERROR - -******************************************************************************/ -static IMG_INT32 -PVRSRVDCMemInfoGetCpuMultiPlanePAddr(PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo, - IMG_SIZE_T* puPlaneByteOffsets, IMG_CPU_PHYADDR* pPlanePAddrs, - IMG_UINT32* pui32NumAddrOffsets) -{ - IMG_UINT32 aui32PlaneAddressOffsets[PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES]; - IMG_INT32 i32Ret; - IMG_UINT32 i; - - i32Ret = OSGetMemMultiPlaneInfo(psKernelMemInfo->sMemBlk.hOSMemHandle, - aui32PlaneAddressOffsets, - pui32NumAddrOffsets); - - if((i32Ret < 0) || (pPlanePAddrs == IMG_NULL)) - return i32Ret; - - for (i = 0; i < *pui32NumAddrOffsets; i++) - { - IMG_SIZE_T uiReqByteOffsets = puPlaneByteOffsets ? puPlaneByteOffsets[i] : 0; - - uiReqByteOffsets += aui32PlaneAddressOffsets[i]; - - pPlanePAddrs[i] = OSMemHandleToCpuPAddr(psKernelMemInfo->sMemBlk.hOSMemHandle, uiReqByteOffsets); - } - - return i32Ret; -} - /*! ****************************************************************************** @@ -2459,22 +2517,13 @@ IMG_BOOL PVRGetDisplayClassJTable(PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable) psJTable->pfnPVRSRVOEMFunction = &SysOEMFunction; psJTable->pfnPVRSRVRegisterCmdProcList = &PVRSRVRegisterCmdProcListKM; psJTable->pfnPVRSRVRemoveCmdProcList = &PVRSRVRemoveCmdProcListKM; -#if defined(SUPPORT_MISR_IN_THREAD) - psJTable->pfnPVRSRVCmdComplete = &OSVSyncMISR; -#else - psJTable->pfnPVRSRVCmdComplete = &PVRSRVCommandCompleteKM; -#endif + psJTable->pfnPVRSRVCmdComplete = &PVRSRVCommandCompleteKM; psJTable->pfnPVRSRVRegisterSystemISRHandler = &PVRSRVRegisterSystemISRHandler; psJTable->pfnPVRSRVRegisterPowerDevice = &PVRSRVRegisterPowerDevice; -#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS) - psJTable->pfnPVRSRVFreeCmdCompletePacket = &PVRSRVFreeCommandCompletePacketKM; -#endif psJTable->pfnPVRSRVDCMemInfoGetCpuVAddr = &PVRSRVDCMemInfoGetCpuVAddr; psJTable->pfnPVRSRVDCMemInfoGetCpuPAddr = &PVRSRVDCMemInfoGetCpuPAddr; psJTable->pfnPVRSRVDCMemInfoGetByteSize = &PVRSRVDCMemInfoGetByteSize; psJTable->pfnPVRSRVDCMemInfoIsPhysContig = &PVRSRVDCMemInfoIsPhysContig; - psJTable->pfnPVRSRVDCMemInfoGetBvHandle = &PVRSRVDCMemInfoGetBvHandle; - psJTable->pfnPVRSRVDCMemInfoGetCpuMultiPlanePAddr = PVRSRVDCMemInfoGetCpuMultiPlanePAddr; return IMG_TRUE; } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/devicemem.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/devicemem.c index 5496753..ac68bcf 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/devicemem.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/devicemem.c @@ -47,15 +47,20 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "pdump_km.h" #include "pvr_bridge_km.h" #include "osfunc.h" -#if defined(CONFIG_GCBV) -#include "gc_bvmapping.h" -#endif +#include "devicemem.h" #if defined(SUPPORT_ION) #include "ion.h" #include "env_perproc.h" +#include "ion_sync.h" + +/* Start size of the g_IonSyncHash hash table */ +#define ION_SYNC_HASH_SIZE 20 +HASH_TABLE *g_psIonSyncHash = IMG_NULL; #endif +#include "lists.h" + /* local function prototypes */ static PVRSRV_ERROR AllocDeviceMem(IMG_HANDLE hDevCookie, IMG_HANDLE hDevMemHeap, @@ -84,6 +89,8 @@ typedef struct _RESMAN_MAP_DEVICE_MEM_DATA_ PVRSRV_KERNEL_MEM_INFO *psSrcMemInfo; } RESMAN_MAP_DEVICE_MEM_DATA; +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) + /* map device class resman memory storage structure */ @@ -96,7 +103,103 @@ typedef struct _PVRSRV_DC_MAPINFO_ PVRSRV_DEVICECLASS_BUFFER *psDeviceClassBuffer; } PVRSRV_DC_MAPINFO; +#endif /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ + static IMG_UINT32 g_ui32SyncUID = 0; +#if defined (MEM_TRACK_INFO_DEBUG) +PVRSRV_MEM_TRACK_INFO *g_psMemTrackInfoHead = NULL; +PVRSRV_MEM_TRACK_INFO *g_psMemTrackInfoTail = NULL; +IMG_UINT32 g_ui32NumOfOpsRecorded = 0; +#endif + +static PVRSRV_KERNEL_SYNC_INFO *g_psSyncInfoList = IMG_NULL; + +#if defined (MEM_TRACK_INFO_DEBUG) +/*! +****************************************************************************** + + @Function PVRSRVAddMemTrackInfo + + @Description + + Adds the current psMemTrackInfo instance to the head of list represented by gMemTrackInfo + + @Input psMemTrackInfo : + @Output + + @Return + +******************************************************************************/ +IMG_EXPORT +IMG_VOID IMG_CALLCONV PVRSRVAddMemTrackInfo(PVRSRV_MEM_TRACK_INFO *psMemTrackInfo) +{ + g_ui32NumOfOpsRecorded++; + psMemTrackInfo->next = g_psMemTrackInfoHead; + psMemTrackInfo->prev = IMG_NULL; + if(g_psMemTrackInfoHead) + { + g_psMemTrackInfoHead->prev = psMemTrackInfo; + } + else + g_psMemTrackInfoTail = psMemTrackInfo; + g_psMemTrackInfoHead = psMemTrackInfo; + if(g_ui32NumOfOpsRecorded > MAX_MEM_TRACK_OPS) + { + PVRSRV_MEM_TRACK_INFO *psFreePtr; + psFreePtr = g_psMemTrackInfoTail; + g_psMemTrackInfoTail = g_psMemTrackInfoTail->prev; + g_psMemTrackInfoTail->next = IMG_NULL; + OSFreeMem(PVRSRV_PAGEABLE_SELECT, + sizeof(PVRSRV_MEM_TRACK_INFO), + psFreePtr, IMG_NULL); + g_ui32NumOfOpsRecorded--; + } +} + +/*! +****************************************************************************** + + @Function PVRSRVPrintMemTrackInfo + + @Description + + Dumps the mem tracking info + + @Input ui32FaultAddr: + @Output + + @Return + +******************************************************************************/ +IMG_EXPORT +IMG_VOID IMG_CALLCONV PVRSRVPrintMemTrackInfo(IMG_UINT32 ui32FaultAddr) +{ + PVRSRV_MEM_TRACK_INFO *psMemTrackInfo; + const IMG_CHAR *apszMemOpNames[] = {"UNKNOWN", "DEVICE", "DEVICECLASS", "WRAPPED", "MAPPED", "ION", "ALLOC", "FREE"}; + psMemTrackInfo = g_psMemTrackInfoHead; + + PVR_DPF((PVR_DBG_MESSAGE,"PVRSRVMemTrackInfo: Dumping mem tracking info\n")); + PVR_DPF((PVR_DBG_MESSAGE,"DevVAddr | Size | Memory Op | Process ID | Ref Count | Task Name | Heap ID | Time Stamp(uSec)\n")); + while(psMemTrackInfo) + { + if((ui32FaultAddr >= psMemTrackInfo->sDevVAddr.uiAddr) && + (ui32FaultAddr < (psMemTrackInfo->sDevVAddr.uiAddr + psMemTrackInfo->uSize))) + { + PVR_DPF((PVR_DBG_MESSAGE,"***************************\n")); + } + PVR_DPF((PVR_DBG_MESSAGE,"0x%-8x | 0x%-8zx | %-13s | %-11d | %-6u | %-15s | %10s | %-15u ", + psMemTrackInfo->sDevVAddr.uiAddr, + psMemTrackInfo->uSize, + apszMemOpNames[psMemTrackInfo->eOp], + psMemTrackInfo->ui32Pid, + psMemTrackInfo->ui32RefCount, + psMemTrackInfo->asTaskName, + psMemTrackInfo->heapId, + psMemTrackInfo->ui32TimeStampUSecs)); + psMemTrackInfo = psMemTrackInfo->next; + } +} +#endif /*! ****************************************************************************** @@ -116,11 +219,7 @@ static IMG_UINT32 g_ui32SyncUID = 0; ******************************************************************************/ IMG_EXPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDeviceMemHeapsKM(IMG_HANDLE hDevCookie, -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_HEAP_INFO_KM *psHeapInfo) -#else PVRSRV_HEAP_INFO *psHeapInfo) -#endif { PVRSRV_DEVICE_NODE *psDeviceNode; IMG_UINT32 ui32HeapCount; @@ -188,11 +287,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateDeviceMemContextKM(IMG_HANDLE hDevCook PVRSRV_PER_PROCESS_DATA *psPerProc, IMG_HANDLE *phDevMemContext, IMG_UINT32 *pui32ClientHeapCount, -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_HEAP_INFO_KM *psHeapInfo, -#else PVRSRV_HEAP_INFO *psHeapInfo, -#endif IMG_BOOL *pbCreated, IMG_BOOL *pbShared) { @@ -204,7 +299,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateDeviceMemContextKM(IMG_HANDLE hDevCook IMG_DEV_PHYADDR sPDDevPAddr; IMG_UINT32 i; -#if !defined(PVR_SECURE_HANDLES) && !defined (SUPPORT_SID_INTERFACE) +#if !defined(PVR_SECURE_HANDLES) PVR_UNREFERENCED_PARAMETER(pbShared); #endif @@ -260,7 +355,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateDeviceMemContextKM(IMG_HANDLE hDevCook psHeapInfo[ui32ClientHeapCount].ui32XTileStride = 0; #endif -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) pbShared[ui32ClientHeapCount] = IMG_TRUE; #endif ui32ClientHeapCount++; @@ -294,7 +389,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateDeviceMemContextKM(IMG_HANDLE hDevCook #else psHeapInfo[ui32ClientHeapCount].ui32XTileStride = 0; #endif -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) pbShared[ui32ClientHeapCount] = IMG_FALSE; #endif @@ -345,11 +440,7 @@ IMG_EXPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDeviceMemHeapInfoKM(IMG_HANDLE hDevCookie, IMG_HANDLE hDevMemContext, IMG_UINT32 *pui32ClientHeapCount, -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_HEAP_INFO_KM *psHeapInfo, -#else PVRSRV_HEAP_INFO *psHeapInfo, -#endif IMG_BOOL *pbShared) { PVRSRV_DEVICE_NODE *psDeviceNode; @@ -358,7 +449,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDeviceMemHeapInfoKM(IMG_HANDLE hDevCookie IMG_HANDLE hDevMemHeap; IMG_UINT32 i; -#if !defined(PVR_SECURE_HANDLES) && !defined (SUPPORT_SID_INTERFACE) +#if !defined(PVR_SECURE_HANDLES) PVR_UNREFERENCED_PARAMETER(pbShared); #endif @@ -396,7 +487,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDeviceMemHeapInfoKM(IMG_HANDLE hDevCookie psHeapInfo[ui32ClientHeapCount].ui32HeapByteSize = psDeviceMemoryHeap[i].ui32HeapSize; psHeapInfo[ui32ClientHeapCount].ui32Attribs = psDeviceMemoryHeap[i].ui32Attribs; psHeapInfo[ui32ClientHeapCount].ui32XTileStride = psDeviceMemoryHeap[i].ui32XTileStride; -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) pbShared[ui32ClientHeapCount] = IMG_TRUE; #endif ui32ClientHeapCount++; @@ -426,7 +517,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDeviceMemHeapInfoKM(IMG_HANDLE hDevCookie psHeapInfo[ui32ClientHeapCount].ui32HeapByteSize = psDeviceMemoryHeap[i].ui32HeapSize; psHeapInfo[ui32ClientHeapCount].ui32Attribs = psDeviceMemoryHeap[i].ui32Attribs; psHeapInfo[ui32ClientHeapCount].ui32XTileStride = psDeviceMemoryHeap[i].ui32XTileStride; -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) pbShared[ui32ClientHeapCount] = IMG_FALSE; #endif @@ -442,34 +533,6 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetDeviceMemHeapInfoKM(IMG_HANDLE hDevCookie return PVRSRV_OK; } -static PVRSRV_ERROR UpdateDeviceMemoryPlaneOffsets(PVRSRV_KERNEL_MEM_INFO *psMemInfo) -{ - if(psMemInfo->ui32Flags & PVRSRV_MEM_ION) - { - - PVRSRV_MEMBLK *psMemBlock = &(psMemInfo->sMemBlk); - IMG_UINT32 ui32AddressOffsets[PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES]; - IMG_UINT32 ui32NumAddrOffsets = PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES; - - IMG_INT32 retSize = OSGetMemMultiPlaneInfo(psMemBlock->hOSMemHandle, - ui32AddressOffsets, &ui32NumAddrOffsets); - - if((retSize > 0) && ui32NumAddrOffsets) - { - int i; - for(i = 0; i < PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES; i++) - { - if(i < ui32NumAddrOffsets) - psMemInfo->planeOffsets[i] = ui32AddressOffsets[i]; - else - psMemInfo->planeOffsets[i] = (IMG_INT32)-1; - } - } - } - - return PVRSRV_OK; - -} /*! ****************************************************************************** @@ -535,15 +598,6 @@ static PVRSRV_ERROR AllocDeviceMem(IMG_HANDLE hDevCookie, psMemBlock = &(psMemInfo->sMemBlk); - /* ION and DYNAMIC re-mapping - * require the PAGEABLE FLAG set - */ - if (ui32Flags & (PVRSRV_MEM_ION | - PVRSRV_HAP_NO_GPU_VIRTUAL_ON_ALLOC)) - { - ui32Flags |= PVRSRV_HAP_GPU_PAGEABLE; - } - /* BM supplied Device Virtual Address with physical backing RAM */ psMemInfo->ui32Flags = ui32Flags | PVRSRV_MEM_RAM_BACKED_ALLOCATION; @@ -593,9 +647,6 @@ static PVRSRV_ERROR AllocDeviceMem(IMG_HANDLE hDevCookie, /* Clear the Backup buffer pointer as we do not have one at this point. We only allocate this as we are going up/down */ psMemInfo->pvSysBackupBuffer = IMG_NULL; - /* Update the Multimedia plane offsets */ - UpdateDeviceMemoryPlaneOffsets(psMemInfo); - /* * Setup the output. */ @@ -756,13 +807,41 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVAllocSyncInfoKM(IMG_HANDLE hDevCookie, psSyncData->ui32LastReadOpDumpVal = 0; psSyncData->ui64LastWrite = 0; +#if defined(SUPPORT_PER_SYNC_DEBUG) + psKernelSyncInfo->ui32OperationMask = 0; + memset(psKernelSyncInfo->aui32OpInfo, 0, sizeof(psKernelSyncInfo->aui32OpInfo)); + memset(psKernelSyncInfo->aui32ReadOpSample, 0, sizeof(psKernelSyncInfo->aui32ReadOpSample)); + memset(psKernelSyncInfo->aui32WriteOpSample, 0, sizeof(psKernelSyncInfo->aui32WriteOpSample)); + memset(psKernelSyncInfo->aui32ReadOp2Sample, 0, sizeof(psKernelSyncInfo->aui32ReadOp2Sample)); + psKernelSyncInfo->ui32HistoryIndex = 0; +#endif + + /* + Note: + PDumping here means that we PDump syncs that we might not + need to know about for the multi-process but this + unavoidable as there is no point where we can PDump + that guarantees it will be initialised before we us it + (e.g. kick time is too late as the client might have + issued a POL on it before that point) + */ #if defined(PDUMP) - PDUMPCOMMENT("Allocating kernel sync object"); + PDUMPCOMMENTWITHFLAGS( +#if defined(SUPPORT_PDUMP_MULTI_PROCESS) + PDUMP_FLAGS_PERSISTENT, +#else + PDUMP_FLAGS_CONTINUOUS, +#endif + "Allocating kernel sync object"); PDUMPMEM(psKernelSyncInfo->psSyncDataMemInfoKM->pvLinAddrKM, psKernelSyncInfo->psSyncDataMemInfoKM, 0, (IMG_UINT32)psKernelSyncInfo->psSyncDataMemInfoKM->uAllocSize, +#if defined(SUPPORT_PDUMP_MULTI_PROCESS) + PDUMP_FLAGS_PERSISTENT, +#else PDUMP_FLAGS_CONTINUOUS, +#endif MAKEUNIQUETAG(psKernelSyncInfo->psSyncDataMemInfoKM)); #endif @@ -776,6 +855,9 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVAllocSyncInfoKM(IMG_HANDLE hDevCookie, OSAtomicInc(psKernelSyncInfo->pvRefCount); + /* Add the SyncInfo to a global list */ + List_PVRSRV_KERNEL_SYNC_INFO_Insert(&g_psSyncInfoList, psKernelSyncInfo); + /* return result */ *ppsKernelSyncInfo = psKernelSyncInfo; @@ -805,8 +887,32 @@ IMG_VOID IMG_CALLCONV PVRSRVReleaseSyncInfoKM(PVRSRV_KERNEL_SYNC_INFO *psKernelS { if (OSAtomicDecAndTest(psKernelSyncInfo->pvRefCount)) { + /* Remove the SyncInfo to a global list */ + List_PVRSRV_KERNEL_SYNC_INFO_Remove(psKernelSyncInfo); + + #if defined(PDUMP) + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_CONTINUOUS, "Wait for write ops to flush to PDump value (%d)", + psKernelSyncInfo->psSyncData->ui32LastOpDumpVal); + PDUMPMEMPOL(psKernelSyncInfo->psSyncDataMemInfoKM, + offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete), + psKernelSyncInfo->psSyncData->ui32LastOpDumpVal, + 0xffffffff, + PDUMP_POLL_OPERATOR_EQUAL, + PDUMP_FLAGS_CONTINUOUS, + MAKEUNIQUETAG(psKernelSyncInfo->psSyncDataMemInfoKM)); + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_CONTINUOUS, "Wait for read ops to flush to PDump value (%d)", + psKernelSyncInfo->psSyncData->ui32LastReadOpDumpVal); + PDUMPMEMPOL(psKernelSyncInfo->psSyncDataMemInfoKM, + offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete), + psKernelSyncInfo->psSyncData->ui32LastReadOpDumpVal, + 0xffffffff, + PDUMP_POLL_OPERATOR_EQUAL, + PDUMP_FLAGS_CONTINUOUS, + MAKEUNIQUETAG(psKernelSyncInfo->psSyncDataMemInfoKM)); + #endif + FreeDeviceMem(psKernelSyncInfo->psSyncDataMemInfoKM); - + /* Catch anyone who is trying to access the freed structure */ psKernelSyncInfo->psSyncDataMemInfoKM = IMG_NULL; psKernelSyncInfo->psSyncData = IMG_NULL; @@ -883,22 +989,40 @@ PVRSRV_ERROR FreeMemCallBackCommon(PVRSRV_KERNEL_MEM_INFO *psMemInfo, PVRSRV_FREE_CALLBACK_ORIGIN eCallbackOrigin) { PVRSRV_ERROR eError = PVRSRV_OK; - +#if defined (MEM_TRACK_INFO_DEBUG) + PVRSRV_MEM_TRACK_INFO *psMemTrackInfo; +#endif PVR_UNREFERENCED_PARAMETER(ui32Param); /* decrement the refcount */ PVRSRVKernelMemInfoDecRef(psMemInfo); +#if defined (MEM_TRACK_INFO_DEBUG) + eError = OSAllocMem(PVRSRV_PAGEABLE_SELECT, + sizeof(PVRSRV_MEM_TRACK_INFO), + (IMG_VOID **)&psMemTrackInfo, IMG_NULL, + "Mem tracking info"); + if (eError != PVRSRV_OK) + return eError; + psMemTrackInfo->sDevVAddr = psMemInfo->sDevVAddr; + psMemTrackInfo->uSize = psMemInfo->uAllocSize; + psMemTrackInfo->ui32Pid = OSGetCurrentProcessIDKM(); + psMemTrackInfo->ui32RefCount = psMemInfo->ui32RefCount; + psMemTrackInfo->eOp = PVRSRV_MEMTYPE_FREE; + psMemTrackInfo->ui32TimeStampUSecs = OSGetCurrentTimeInUSecsKM(); + + OSGetCurrentProcessNameKM(psMemTrackInfo->asTaskName, 128); + + OSStringCopy(psMemTrackInfo->heapId, psMemInfo->heapId); + PVRSRVAddMemTrackInfo(psMemTrackInfo); +#endif + /* check no other processes has this meminfo mapped */ if (psMemInfo->ui32RefCount == 0) { if((psMemInfo->ui32Flags & PVRSRV_MEM_EXPORTED) != 0) { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hMemInfo = 0; -#else IMG_HANDLE hMemInfo = IMG_NULL; -#endif /* find the handle */ eError = PVRSRVFindHandle(KERNEL_HANDLE_BASE, @@ -930,9 +1054,22 @@ PVRSRV_ERROR FreeMemCallBackCommon(PVRSRV_KERNEL_MEM_INFO *psMemInfo, freeExternal(psMemInfo); case PVRSRV_MEMTYPE_DEVICE: case PVRSRV_MEMTYPE_DEVICECLASS: - if (psMemInfo->psKernelSyncInfo) +#if defined(SUPPORT_ION) + if (psMemInfo->hIonSyncInfo) + { + /* + For syncs attached to Ion imported buffers we handle + things a little differently + */ + PVRSRVIonBufferSyncInfoDecRef(psMemInfo->hIonSyncInfo, psMemInfo); + } + else +#endif { - PVRSRVKernelSyncInfoDecRef(psMemInfo->psKernelSyncInfo, psMemInfo); + if (psMemInfo->psKernelSyncInfo) + { + PVRSRVKernelSyncInfoDecRef(psMemInfo->psKernelSyncInfo, psMemInfo); + } } break; default: @@ -941,11 +1078,6 @@ PVRSRV_ERROR FreeMemCallBackCommon(PVRSRV_KERNEL_MEM_INFO *psMemInfo, } } -#if defined(CONFIG_GCBV) - if (psMemInfo->ui32Flags & PVRSRV_MAP_GC_MMU) - gc_bvunmap_meminfo(psMemInfo); -#endif - /* * FreeDeviceMem2 will do the right thing, freeing * the virtual memory info when the allocator calls @@ -1033,103 +1165,6 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVFreeDeviceMemKM(IMG_HANDLE hDevCookie, /*! ****************************************************************************** - @Function PVRSRVRemapToDevKM - - @Description - - Remaps buffer to GPU virtual address space - - @Input psMemInfo - - @Return PVRSRV_ERROR : 0 means the memory is still unmapped - ERROR, - * bigger than 0 (mapping reference count) - success mapping - * smaller than 0 - PVRSRV error -******************************************************************************/ -IMG_EXPORT -IMG_INT32 IMG_CALLCONV PVRSRVRemapToDevKM(IMG_HANDLE hDevCookie, - PVRSRV_KERNEL_MEM_INFO *psMemInfo, IMG_DEV_VIRTADDR *psDevVAddr) -{ - PVRSRV_MEMBLK *psMemBlock; - IMG_INT32 result; - - PVR_UNREFERENCED_PARAMETER(hDevCookie); - - if (!psMemInfo) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemapToDevKM: invalid parameters")); - return PVRSRV_ERROR_INVALID_PARAMS; - } - - psMemBlock = &(psMemInfo->sMemBlk); - - result = BM_RemapToDev(psMemBlock->hBuffer); - - if(result <= 0) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemapToDevKM: could not remap")); - } - - *psDevVAddr = psMemInfo->sDevVAddr = - psMemBlock->sDevVirtAddr = BM_HandleToDevVaddr(psMemBlock->hBuffer); - - UpdateDeviceMemoryPlaneOffsets(psMemInfo); - - return result; -} - - -/*! -****************************************************************************** - - @Function PVRSRVUnmapFromDevKM - - @Description - - Unmaps buffer from GPU virtual address space - - @Input psMemInfo - - @Return PVRSRV_ERROR : 0 means the memory is unmapped, - * bigger than 0 (mapping reference count) still mapped - * smaller than 0 - PVRSRV error -******************************************************************************/ -IMG_EXPORT -IMG_INT32 IMG_CALLCONV PVRSRVUnmapFromDevKM(IMG_HANDLE hDevCookie, - PVRSRV_KERNEL_MEM_INFO *psMemInfo) -{ - PVRSRV_MEMBLK *psMemBlock; - IMG_INT32 result; - - PVR_UNREFERENCED_PARAMETER(hDevCookie); - - if (!psMemInfo) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVUnmapFromDevKM: invalid parameters")); - return PVRSRV_ERROR_INVALID_PARAMS; - } - - psMemBlock = &(psMemInfo->sMemBlk); - - result = BM_UnmapFromDev(psMemBlock->hBuffer); - /* 0 means the memory is unmapped, - * bigger than 0 (mapping ref count) still mapped - * smaller than 0 PVRSRV error - */ - if(result < 0) - { - PVR_DPF((PVR_DBG_ERROR,"PVRSRVUnmapFromDevKM: could not unmap")); - } - - psMemInfo->sDevVAddr = - psMemBlock->sDevVirtAddr = BM_HandleToDevVaddr(psMemBlock->hBuffer); - - return result; -} - - -/*! -****************************************************************************** - @Function PVRSRVAllocDeviceMemKM @Description @@ -1166,6 +1201,13 @@ PVRSRV_ERROR IMG_CALLCONV _PVRSRVAllocDeviceMemKM(IMG_HANDLE hDevCookie, PVRSRV_ERROR eError; BM_HEAP *psBMHeap; IMG_HANDLE hDevMemContext; +#if defined (MEM_TRACK_INFO_DEBUG) + PVRSRV_MEM_TRACK_INFO *psMemTrackInfo; + IMG_UINT32 i; + IMG_CHAR *pszName = "Heap not found"; + DEVICE_MEMORY_INFO *psDevMemoryInfo; + DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; +#endif if (!hDevMemHeap || ((ui32Size == 0) && ((ui32Flags & PVRSRV_MEM_SPARSE) == 0)) || @@ -1233,11 +1275,6 @@ PVRSRV_ERROR IMG_CALLCONV _PVRSRVAllocDeviceMemKM(IMG_HANDLE hDevCookie, return eError; } -#if defined(CONFIG_GCBV) - if (ui32Flags & PVRSRV_MAP_GC_MMU) - gc_bvmap_meminfo(psMemInfo); -#endif - if (ui32Flags & PVRSRV_MEM_NO_SYNCOBJ) { psMemInfo->psKernelSyncInfo = IMG_NULL; @@ -1258,7 +1295,23 @@ PVRSRV_ERROR IMG_CALLCONV _PVRSRVAllocDeviceMemKM(IMG_HANDLE hDevCookie, goto free_mainalloc; } } +#if defined (MEM_TRACK_INFO_DEBUG) + psBMHeap = (BM_HEAP*)hDevMemHeap; + hDevMemContext = (IMG_HANDLE)psBMHeap->pBMContext; + psDevMemoryInfo = &((BM_CONTEXT*)hDevMemContext)->psDeviceNode->sDevMemoryInfo; + psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap; + for(i=0; i<PVRSRV_MAX_CLIENT_HEAPS; i++) + { + if(HEAP_IDX(psDeviceMemoryHeap[i].ui32HeapID) == psDevMemoryInfo->ui32MappingHeapID) + { + pszName = psDeviceMemoryHeap[i].pszName; + break; + } + } + + OSStringCopy(psMemInfo->heapId, pszName); +#endif /* * Setup the output. */ @@ -1288,6 +1341,26 @@ PVRSRV_ERROR IMG_CALLCONV _PVRSRVAllocDeviceMemKM(IMG_HANDLE hDevCookie, psMemInfo->memType = PVRSRV_MEMTYPE_DEVICE; +#if defined (MEM_TRACK_INFO_DEBUG) + eError = OSAllocMem(PVRSRV_PAGEABLE_SELECT, + sizeof(PVRSRV_MEM_TRACK_INFO), + (IMG_VOID **)&psMemTrackInfo, IMG_NULL, + "Mem tracking info"); + if (eError != PVRSRV_OK) + return eError; + psMemTrackInfo->sDevVAddr = psMemInfo->sDevVAddr; + psMemTrackInfo->uSize = psMemInfo->uAllocSize; + psMemTrackInfo->ui32Pid = OSGetCurrentProcessIDKM(); + psMemTrackInfo->ui32RefCount = psMemInfo->ui32RefCount; + psMemTrackInfo->eOp = PVRSRV_MEMTYPE_ALLOC; + psMemTrackInfo->ui32TimeStampUSecs = OSGetCurrentTimeInUSecsKM(); + + OSGetCurrentProcessNameKM(psMemTrackInfo->asTaskName, 128); + + OSStringCopy(psMemTrackInfo->heapId, psMemInfo->heapId); + + PVRSRVAddMemTrackInfo(psMemTrackInfo); +#endif /* * And I think we're done for now.... */ @@ -1315,6 +1388,90 @@ static PVRSRV_ERROR IonUnmapCallback(IMG_PVOID pvParam, return FreeMemCallBackCommon(psMemInfo, ui32Param, PVRSRV_FREE_CALLBACK_ORIGIN_ALLOCATOR); } +PVRSRV_ERROR PVRSRVIonBufferSyncAcquire(IMG_HANDLE hUnique, + IMG_HANDLE hDevCookie, + IMG_HANDLE hDevMemContext, + PVRSRV_ION_SYNC_INFO **ppsIonSyncInfo) +{ + PVRSRV_ION_SYNC_INFO *psIonSyncInfo; + PVRSRV_ERROR eError; + IMG_BOOL bRet; + + /* Check the hash to see if we already have a sync for this buffer */ + psIonSyncInfo = (PVRSRV_ION_SYNC_INFO *) HASH_Retrieve(g_psIonSyncHash, (IMG_UINTPTR_T) hUnique); + if (psIonSyncInfo == 0) + { + /* This buffer is new to us, create the syncinfo for it */ + eError = OSAllocMem(PVRSRV_PAGEABLE_SELECT, + sizeof(PVRSRV_ION_SYNC_INFO), + (IMG_VOID **)&psIonSyncInfo, IMG_NULL, + "Ion Synchronization Info"); + if (eError != PVRSRV_OK) + { + return eError; + } + + eError = PVRSRVAllocSyncInfoKM(hDevCookie, + hDevMemContext, + &psIonSyncInfo->psSyncInfo); + if (eError != PVRSRV_OK) + { + OSFreeMem(PVRSRV_PAGEABLE_SELECT, + sizeof(PVRSRV_ION_SYNC_INFO), + psIonSyncInfo, + IMG_NULL); + + return eError; + } +#if defined(SUPPORT_MEMINFO_IDS) + psIonSyncInfo->ui64Stamp = ++g_ui64MemInfoID; +#else + psIonSyncInfo->ui64Stamp = 0; +#endif + bRet = HASH_Insert(g_psIonSyncHash, (IMG_UINTPTR_T) hUnique, (IMG_UINTPTR_T) psIonSyncInfo); + if (!bRet) + { + eError = PVRSRV_ERROR_OUT_OF_MEMORY; + + PVRSRVKernelSyncInfoDecRef(psIonSyncInfo->psSyncInfo, IMG_NULL); + OSFreeMem(PVRSRV_PAGEABLE_SELECT, + sizeof(PVRSRV_ION_SYNC_INFO), + psIonSyncInfo, + IMG_NULL); + + return eError; + } + + psIonSyncInfo->ui32RefCount = 0; + psIonSyncInfo->hUnique = hUnique; + } + + psIonSyncInfo->ui32RefCount++; + *ppsIonSyncInfo = psIonSyncInfo; + return PVRSRV_OK; +} + +IMG_VOID PVRSRVIonBufferSyncRelease(PVRSRV_ION_SYNC_INFO *psIonSyncInfo) +{ + psIonSyncInfo->ui32RefCount--; + + if (psIonSyncInfo->ui32RefCount == 0) + { + PVRSRV_ION_SYNC_INFO *psLookup; + /* + If we're holding the last reference to the syncinfo + then free it + */ + psLookup = (PVRSRV_ION_SYNC_INFO *) HASH_Remove(g_psIonSyncHash, (IMG_UINTPTR_T) psIonSyncInfo->hUnique); + PVR_ASSERT(psLookup == psIonSyncInfo); + PVRSRVKernelSyncInfoDecRef(psIonSyncInfo->psSyncInfo, IMG_NULL); + OSFreeMem(PVRSRV_PAGEABLE_SELECT, + sizeof(PVRSRV_ION_SYNC_INFO), + psIonSyncInfo, + IMG_NULL); + } +} + /*! ****************************************************************************** @@ -1326,10 +1483,19 @@ static PVRSRV_ERROR IonUnmapCallback(IMG_PVOID pvParam, @Input psPerProc : PerProcess data @Input hDevCookie : Device node cookie - @Input hDevMemContext : Device memory context cookie - @Input hIon : Handle to ION buffer + @Input hDevMemHeap : Heap ion handles are mapped into + @Input ui32NumBuffers : Number of ion handles to map. (If one handle is being + mapped, this should be 1, not 0.) + @Input phIon : Array of ui32NumBuffers ion handles (fds) @Input ui32Flags : Mapping flags - @Input ui32Size : Mapping size + @Input ui32ChunkCount : If ui32NumBuffers is 1, this is the number of + "chunks" specified to be mapped into device-virtual + address space. If ui32NumBuffers > 1, it is ignored. + @Input pauiOffset : Array of offsets in device-virtual address space to map + "chunks" of physical from the ion allocation. + @Input pauiSize : Array of sizes in bytes of device-virtual address space to + map "chunks" of physical from the ion allocation. + @Input puiIonBufferSize : Size in bytes of resulting device-virtual mapping. @Output ppsKernelMemInfo: Output kernel meminfo if successful @Return PVRSRV_ERROR : @@ -1338,35 +1504,56 @@ static PVRSRV_ERROR IonUnmapCallback(IMG_PVOID pvParam, IMG_EXPORT PVRSRV_ERROR PVRSRVMapIonHandleKM(PVRSRV_PER_PROCESS_DATA *psPerProc, IMG_HANDLE hDevCookie, - IMG_HANDLE hDevMemContext, - IMG_HANDLE hIon, + IMG_HANDLE hDevMemHeap, + IMG_UINT32 ui32NumFDs, + IMG_INT32 *pi32BufferFDs, IMG_UINT32 ui32Flags, - IMG_UINT32 ui32Size, - PVRSRV_KERNEL_MEM_INFO **ppsKernelMemInfo) + IMG_UINT32 ui32ChunkCount, + IMG_SIZE_T *pauiOffset, + IMG_SIZE_T *pauiSize, + IMG_SIZE_T *puiIonBufferSize, + PVRSRV_KERNEL_MEM_INFO **ppsKernelMemInfo, + IMG_UINT64 *pui64Stamp) { PVRSRV_ENV_PER_PROCESS_DATA *psPerProcEnv = PVRSRVProcessPrivateData(psPerProc); PVRSRV_DEVICE_NODE *psDeviceNode; PVRSRV_KERNEL_MEM_INFO *psNewKernelMemInfo; - DEVICE_MEMORY_INFO *psDevMemoryInfo; - DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; IMG_SYS_PHYADDR *pasSysPhysAddr; + IMG_SYS_PHYADDR *pasAdjustedSysPhysAddr; PVRSRV_MEMBLK *psMemBlock; PVRSRV_ERROR eError; - IMG_HANDLE hDevMemHeap = IMG_NULL; IMG_HANDLE hPriv; + IMG_HANDLE hUnique; BM_HANDLE hBuffer; - IMG_UINT32 ui32HeapCount; + IMG_SIZE_T uiMapSize = 0; + IMG_SIZE_T uiAdjustOffset = 0; IMG_UINT32 ui32PageCount; IMG_UINT32 i; IMG_BOOL bAllocSync = (ui32Flags & PVRSRV_MEM_NO_SYNCOBJ)?IMG_FALSE:IMG_TRUE; - if ((hDevCookie == IMG_NULL) || (ui32Size == 0) - || (hDevMemContext == IMG_NULL) || (ppsKernelMemInfo == IMG_NULL)) + if ((hDevCookie == IMG_NULL) || (ui32ChunkCount == 0) + || (hDevMemHeap == IMG_NULL) || (ppsKernelMemInfo == IMG_NULL)) { PVR_DPF((PVR_DBG_ERROR, "%s: Invalid params", __FUNCTION__)); return PVRSRV_ERROR_INVALID_PARAMS; } + for (i=0;i<ui32ChunkCount;i++) + { + if ((pauiOffset[i] & HOST_PAGEMASK) != 0) + { + PVR_DPF((PVR_DBG_ERROR,"%s: Chunk offset is not page aligned", __FUNCTION__)); + return PVRSRV_ERROR_INVALID_PARAMS; + } + + if ((pauiSize[i] & HOST_PAGEMASK) != 0) + { + PVR_DPF((PVR_DBG_ERROR,"%s: Chunk size is not page aligned", __FUNCTION__)); + return PVRSRV_ERROR_INVALID_PARAMS; + } + uiMapSize += pauiSize[i]; + } + psDeviceNode = (PVRSRV_DEVICE_NODE *)hDevCookie; if(OSAllocMem(PVRSRV_PAGEABLE_SELECT, @@ -1379,59 +1566,63 @@ PVRSRV_ERROR PVRSRVMapIonHandleKM(PVRSRV_PER_PROCESS_DATA *psPerProc, } OSMemSet(psNewKernelMemInfo, 0, sizeof(PVRSRV_KERNEL_MEM_INFO)); - /* Choose the heap to map to */ - ui32HeapCount = psDeviceNode->sDevMemoryInfo.ui32HeapCount; - psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo; - psDeviceMemoryHeap = psDeviceNode->sDevMemoryInfo.psDeviceMemoryHeap; - for(i=0; i<PVRSRV_MAX_CLIENT_HEAPS; i++) + /* Import the ION buffer into our ion_client and DMA map it */ + eError = IonImportBufferAndAcquirePhysAddr(psPerProcEnv->psIONClient, + ui32NumFDs, + pi32BufferFDs, + &ui32PageCount, + &pasSysPhysAddr, + &psNewKernelMemInfo->pvLinAddrKM, + &hPriv, + &hUnique); + if (eError != PVRSRV_OK) { - if(HEAP_IDX(psDeviceMemoryHeap[i].ui32HeapID) == psDevMemoryInfo->ui32IonHeapID) - { - if(psDeviceMemoryHeap[i].DevMemHeapType == DEVICE_MEMORY_HEAP_PERCONTEXT) - { - if (psDeviceMemoryHeap[i].ui32HeapSize > 0) - { - hDevMemHeap = BM_CreateHeap(hDevMemContext, &psDeviceMemoryHeap[i]); - } - else - { - hDevMemHeap = IMG_NULL; - } - } - else - { - hDevMemHeap = psDevMemoryInfo->psDeviceMemoryHeap[i].hDevMemHeap; - } - break; - } + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to get ion buffer/buffer phys addr", __FUNCTION__)); + goto exitFailedImport; } - - if (hDevMemHeap == IMG_NULL) + + /* + Make sure the number of pages detected by the ion import are at least + the size of the total chunked region + */ + if(ui32PageCount * PAGE_SIZE < uiMapSize) { - PVR_DPF((PVR_DBG_ERROR, "%s: Failed to get ION heap", __FUNCTION__)); - eError = PVRSRV_ERROR_FAILED_TO_RETRIEVE_HEAPINFO; - goto exitFailedHeap; + PVR_DPF((PVR_DBG_ERROR, "%s: ion allocator returned fewer page addresses " + "than specified chunk size(s)", __FUNCTION__)); + eError = PVRSRV_ERROR_INVALID_PARAMS; + goto exitFailedAdjustedAlloc; } - /* Import the ION buffer into our ion_client and DMA map it */ - eError = IonImportBufferAndAquirePhysAddr(psPerProcEnv->psIONClient, - hIon, - &ui32PageCount, - &pasSysPhysAddr, - &psNewKernelMemInfo->pvLinAddrKM, - &hPriv); - if (eError != PVRSRV_OK) + /* + An Ion buffer might have a number of "chunks" in it which need to be + mapped virtually continuous so we need to create a new array of + addresses based on this chunk data for the actual wrap + */ + if(OSAllocMem(PVRSRV_PAGEABLE_SELECT, + sizeof(IMG_SYS_PHYADDR) * (uiMapSize/HOST_PAGESIZE()), + (IMG_VOID **)&pasAdjustedSysPhysAddr, IMG_NULL, + "Ion adjusted system address array") != PVRSRV_OK) { - PVR_DPF((PVR_DBG_ERROR, "%s: Failed to get ion buffer/buffer phys addr", __FUNCTION__)); - goto exitFailedHeap; + PVR_DPF((PVR_DBG_ERROR,"%s: Failed to alloc memory for adjusted array", __FUNCTION__)); + goto exitFailedAdjustedAlloc; + } + OSMemSet(pasAdjustedSysPhysAddr, 0, sizeof(IMG_SYS_PHYADDR) * (uiMapSize/HOST_PAGESIZE())); + + for (i=0;i<ui32ChunkCount;i++) + { + OSMemCopy(&pasAdjustedSysPhysAddr[uiAdjustOffset], + &pasSysPhysAddr[pauiOffset[i]/HOST_PAGESIZE()], + (pauiSize[i]/HOST_PAGESIZE()) * sizeof(IMG_SYS_PHYADDR)); + + uiAdjustOffset += pauiSize[i]/HOST_PAGESIZE(); } /* Wrap the returned addresses into our memory context */ if (!BM_Wrap(hDevMemHeap, - ui32Size, + uiMapSize, 0, IMG_FALSE, - pasSysPhysAddr, + pasAdjustedSysPhysAddr, IMG_NULL, &ui32Flags, /* This function clobbers our bits in ui32Flags */ &hBuffer)) @@ -1447,11 +1638,11 @@ PVRSRV_ERROR PVRSRVMapIonHandleKM(PVRSRV_PER_PROCESS_DATA *psPerProc, psMemBlock->hOSMemHandle = BM_HandleToOSMemHandle(hBuffer); psMemBlock->hBuffer = (IMG_HANDLE) hBuffer; psMemBlock->hOSWrapMem = hPriv; /* Saves creating a new element as we know hOSWrapMem will not be used */ - psMemBlock->psIntSysPAddr = pasSysPhysAddr; + psMemBlock->psIntSysPAddr = pasAdjustedSysPhysAddr; psNewKernelMemInfo->ui32Flags = ui32Flags; psNewKernelMemInfo->sDevVAddr = psMemBlock->sDevVirtAddr; - psNewKernelMemInfo->uAllocSize = ui32Size; + psNewKernelMemInfo->uAllocSize = uiMapSize; psNewKernelMemInfo->memType = PVRSRV_MEMTYPE_ION; PVRSRVKernelMemInfoIncRef(psNewKernelMemInfo); @@ -1464,13 +1655,25 @@ PVRSRV_ERROR PVRSRVMapIonHandleKM(PVRSRV_PER_PROCESS_DATA *psPerProc, } else { - eError = PVRSRVAllocSyncInfoKM(hDevCookie, - hDevMemContext, - &psNewKernelMemInfo->psKernelSyncInfo); + PVRSRV_ION_SYNC_INFO *psIonSyncInfo; + BM_HEAP *psBMHeap; + IMG_HANDLE hDevMemContext; + + psBMHeap = (BM_HEAP*)hDevMemHeap; + hDevMemContext = (IMG_HANDLE)psBMHeap->pBMContext; + + eError = PVRSRVIonBufferSyncInfoIncRef(hUnique, + hDevCookie, + hDevMemContext, + &psIonSyncInfo, + psNewKernelMemInfo); if(eError != PVRSRV_OK) { goto exitFailedSync; } + psNewKernelMemInfo->hIonSyncInfo = psIonSyncInfo; + psNewKernelMemInfo->psKernelSyncInfo = IonBufferSyncGetKernelSyncInfo(psIonSyncInfo); + *pui64Stamp = IonBufferSyncGetStamp(psIonSyncInfo); } /* register with the resman */ @@ -1487,23 +1690,29 @@ PVRSRV_ERROR PVRSRVMapIonHandleKM(PVRSRV_PER_PROCESS_DATA *psPerProc, psNewKernelMemInfo->memType = PVRSRV_MEMTYPE_ION; + /* + As the user doesn't tell us the size, just the "chunk" information + return actual size of the Ion buffer so we can mmap it. + */ + *puiIonBufferSize = ui32PageCount * HOST_PAGESIZE(); *ppsKernelMemInfo = psNewKernelMemInfo; return PVRSRV_OK; exitFailedResman: if (psNewKernelMemInfo->psKernelSyncInfo) { - PVRSRVKernelSyncInfoDecRef(psNewKernelMemInfo->psKernelSyncInfo, psNewKernelMemInfo); + PVRSRVIonBufferSyncInfoDecRef(psNewKernelMemInfo->hIonSyncInfo, psNewKernelMemInfo); } exitFailedSync: BM_Free(hBuffer, ui32Flags); exitFailedWrap: - IonUnimportBufferAndReleasePhysAddr(hPriv); OSFreeMem(PVRSRV_PAGEABLE_SELECT, - sizeof(IMG_SYS_PHYADDR) * ui32PageCount, - pasSysPhysAddr, + sizeof(IMG_SYS_PHYADDR) * uiAdjustOffset, + pasAdjustedSysPhysAddr, IMG_NULL); -exitFailedHeap: +exitFailedAdjustedAlloc: + IonUnimportBufferAndReleasePhysAddr(hPriv); +exitFailedImport: OSFreeMem(PVRSRV_PAGEABLE_SELECT, sizeof(PVRSRV_KERNEL_MEM_INFO), psNewKernelMemInfo, @@ -1707,10 +1916,23 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVWrapExtMemoryKM(IMG_HANDLE hDevCookie, IMG_VOID *pvPageAlignedCPUVAddr; IMG_SYS_PHYADDR *psIntSysPAddr = IMG_NULL; IMG_HANDLE hOSWrapMem = IMG_NULL; - DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; - IMG_UINT32 i; + DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap;IMG_UINT32 i; +#if defined (MEM_TRACK_INFO_DEBUG) + PVRSRV_MEM_TRACK_INFO *psMemTrackInfo; + IMG_CHAR *pszName="Heap not found"; +#endif IMG_SIZE_T uPageCount = 0; + PVR_DPF ((PVR_DBG_MESSAGE, + "PVRSRVWrapExtMemoryKM (uSize=0x%" SIZE_T_FMT_LEN "x, uPageOffset=0x%" + SIZE_T_FMT_LEN "x, bPhysContig=%d, extSysPAddr=" SYSPADDR_FMT + ", pvLinAddr=%p, ui32Flags=%u)", + uByteSize, + uPageOffset, + bPhysContig, + psExtSysPAddr?psExtSysPAddr->uiAddr:0x0, + pvLinAddr, + ui32Flags)); psDeviceNode = (PVRSRV_DEVICE_NODE*)hDevCookie; PVR_ASSERT(psDeviceNode != IMG_NULL); @@ -1759,6 +1981,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVWrapExtMemoryKM(IMG_HANDLE hDevCookie, */ bPhysContig = IMG_FALSE; } +#if !defined(__QNXNTO__) else { if (psExtSysPAddr) @@ -1771,6 +1994,8 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVWrapExtMemoryKM(IMG_HANDLE hDevCookie, } return PVRSRV_ERROR_INVALID_PARAMS; } +#endif + /* Choose the heap to map to */ psDevMemoryInfo = &((BM_CONTEXT*)hDevMemContext)->psDeviceNode->sDevMemoryInfo; @@ -1784,6 +2009,9 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVWrapExtMemoryKM(IMG_HANDLE hDevCookie, if (psDeviceMemoryHeap[i].ui32HeapSize > 0) { hDevMemHeap = BM_CreateHeap(hDevMemContext, &psDeviceMemoryHeap[i]); + #if defined (MEM_TRACK_INFO_DEBUG) + pszName = psDeviceMemoryHeap[i].pszName; + #endif } else { @@ -1793,6 +2021,9 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVWrapExtMemoryKM(IMG_HANDLE hDevCookie, else { hDevMemHeap = psDevMemoryInfo->psDeviceMemoryHeap[i].hDevMemHeap; + #if defined (MEM_TRACK_INFO_DEBUG) + pszName = psDeviceMemoryHeap[i].pszName; + #endif } break; } @@ -1816,7 +2047,11 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVWrapExtMemoryKM(IMG_HANDLE hDevCookie, } OSMemSet(psMemInfo, 0, sizeof(*psMemInfo)); - psMemInfo->ui32Flags = ui32Flags; + /* + Force the memory to be read/write. This used to be done in the BM, but + ion imports don't want this behaviour + */ + psMemInfo->ui32Flags = ui32Flags | PVRSRV_MEM_READ | PVRSRV_MEM_WRITE; psMemBlock = &(psMemInfo->sMemBlk); @@ -1879,10 +2114,32 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVWrapExtMemoryKM(IMG_HANDLE hDevCookie, psMemInfo, 0, &UnwrapExtMemoryCallBack); - +#if defined (MEM_TRACK_INFO_DEBUG) + OSStringCopy(psMemInfo->heapId, pszName); +#endif /* return the meminfo */ *ppsMemInfo = psMemInfo; +#if defined (MEM_TRACK_INFO_DEBUG) + eError = OSAllocMem(PVRSRV_PAGEABLE_SELECT, + sizeof(PVRSRV_MEM_TRACK_INFO), + (IMG_VOID **)&psMemTrackInfo, IMG_NULL, + "Mem tracking info"); + if (eError != PVRSRV_OK) + return eError; + psMemTrackInfo->sDevVAddr = psMemInfo->sDevVAddr; + psMemTrackInfo->uSize = psMemInfo->uAllocSize; + psMemTrackInfo->ui32Pid = OSGetCurrentProcessIDKM(); + psMemTrackInfo->ui32RefCount = psMemInfo->ui32RefCount; + psMemTrackInfo->eOp = PVRSRV_MEMTYPE_WRAPPED; + psMemTrackInfo->ui32TimeStampUSecs = OSGetCurrentTimeInUSecsKM(); + + OSGetCurrentProcessNameKM(psMemTrackInfo->asTaskName, 128); + + OSStringCopy(psMemTrackInfo->heapId, psMemInfo->heapId); + PVRSRVAddMemTrackInfo(psMemTrackInfo); +#endif + return PVRSRV_OK; /* error handling: */ @@ -2035,6 +2292,13 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceMemoryKM(PVRSRV_PER_PROCESS_DATA *psPer PVRSRV_DEVICE_NODE *psDeviceNode; IMG_VOID *pvPageAlignedCPUVAddr; RESMAN_MAP_DEVICE_MEM_DATA *psMapData = IMG_NULL; +#if defined (MEM_TRACK_INFO_DEBUG) + PVRSRV_MEM_TRACK_INFO *psMemTrackInfo; + DEVICE_MEMORY_INFO *psDevMemoryInfo; + DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; + BM_HEAP *psBMHeap; + IMG_HANDLE hDevMemContext; +#endif /* check params */ if(!psSrcMemInfo || !hDstDevMemHeap || !ppsDstMemInfo) @@ -2102,7 +2366,12 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceMemoryKM(PVRSRV_PER_PROCESS_DATA *psPer } OSMemSet(psMemInfo, 0, sizeof(*psMemInfo)); - psMemInfo->ui32Flags = psSrcMemInfo->ui32Flags; + + /* + Force the memory to be read/write. This used to be done in the BM, but + ion imports don't want this behaviour + */ + psMemInfo->ui32Flags = psSrcMemInfo->ui32Flags | PVRSRV_MEM_READ | PVRSRV_MEM_WRITE; psMemBlock = &(psMemInfo->sMemBlk); @@ -2172,9 +2441,49 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceMemoryKM(PVRSRV_PER_PROCESS_DATA *psPer psMapData, 0, &UnmapDeviceMemoryCallBack); +#if defined (MEM_TRACK_INFO_DEBUG) + psBMHeap = (BM_HEAP*)hDstDevMemHeap; + hDevMemContext = (IMG_HANDLE)psBMHeap->pBMContext; + psDevMemoryInfo = &((BM_CONTEXT*)hDevMemContext)->psDeviceNode->sDevMemoryInfo; + psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap; + + for(i=0; i<PVRSRV_MAX_CLIENT_HEAPS; i++) + { + if(HEAP_IDX(psDeviceMemoryHeap[i].ui32HeapID) == psDevMemoryInfo->ui32MappingHeapID) + break; + } + + if(i == PVRSRV_MAX_CLIENT_HEAPS) + { + PVR_DPF((PVR_DBG_ERROR,"PVRSRVMapDeviceMemoryKM: unable to find mapping heap")); + eError = PVRSRV_ERROR_UNABLE_TO_FIND_MAPPING_HEAP; + OSStringCopy(psMemInfo->heapId, "Heap not found"); + } + else + OSStringCopy(psMemInfo->heapId, psDeviceMemoryHeap[i].pszName); +#endif *ppsDstMemInfo = psMemInfo; +#if defined (MEM_TRACK_INFO_DEBUG) + eError = OSAllocMem(PVRSRV_PAGEABLE_SELECT, + sizeof(PVRSRV_MEM_TRACK_INFO), + (IMG_VOID **)&psMemTrackInfo, IMG_NULL, + "Mem tracking info"); + if (eError != PVRSRV_OK) + return eError; + psMemTrackInfo->sDevVAddr = psMemInfo->sDevVAddr; + psMemTrackInfo->uSize = psMemInfo->uAllocSize; + psMemTrackInfo->ui32Pid = OSGetCurrentProcessIDKM(); + psMemTrackInfo->ui32RefCount = psMemInfo->ui32RefCount; + psMemTrackInfo->eOp = PVRSRV_MEMTYPE_MAPPED; + psMemTrackInfo->ui32TimeStampUSecs = OSGetCurrentTimeInUSecsKM(); + + OSGetCurrentProcessNameKM(psMemTrackInfo->asTaskName, 128); + OSStringCopy(psMemTrackInfo->heapId, psMemInfo->heapId); + + PVRSRVAddMemTrackInfo(psMemTrackInfo); +#endif return PVRSRV_OK; /* error handling: */ @@ -2205,6 +2514,7 @@ ErrorExit: return eError; } +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) /*! ****************************************************************************** @@ -2310,15 +2620,18 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA * DEVICE_MEMORY_INFO *psDevMemoryInfo; DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; IMG_HANDLE hDevMemHeap = IMG_NULL; - IMG_SIZE_T uByteSize; - IMG_SIZE_T ui32Offset; - IMG_SIZE_T ui32PageSize = HOST_PAGESIZE(); + IMG_UINT32 ui32ByteSize; + IMG_SIZE_T uOffset; + IMG_SIZE_T uPageSize = HOST_PAGESIZE(); BM_HANDLE hBuffer; PVRSRV_MEMBLK *psMemBlock; IMG_BOOL bBMError; IMG_UINT32 i; PVRSRV_DC_MAPINFO *psDCMapInfo = IMG_NULL; - +#if defined (MEM_TRACK_INFO_DEBUG) + PVRSRV_MEM_TRACK_INFO *psMemTrackInfo; + IMG_CHAR *pszName = "Heap not found"; +#endif if(!hDeviceClassBuffer || !ppsMemInfo || !phOSMapInfo || !hDevMemContext) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVMapDeviceClassMemoryKM: invalid parameters")); @@ -2361,7 +2674,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA * eError = psDeviceClassBuffer->pfnGetBufferAddr(psDeviceClassBuffer->hExtDevice, psDeviceClassBuffer->hExtBuffer, &psSysPAddr, - &uByteSize, + &ui32ByteSize, &pvCPUVAddr, phOSMapInfo, &bPhysContig, @@ -2386,6 +2699,9 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA * if (psDeviceMemoryHeap[i].ui32HeapSize > 0) { hDevMemHeap = BM_CreateHeap(hDevMemContext, &psDeviceMemoryHeap[i]); + #if defined (MEM_TRACK_INFO_DEBUG) + pszName = psDeviceMemoryHeap[i].pszName; + #endif } else { @@ -2395,6 +2711,9 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA * else { hDevMemHeap = psDevMemoryInfo->psDeviceMemoryHeap[i].hDevMemHeap; + #if defined (MEM_TRACK_INFO_DEBUG) + pszName = psDeviceMemoryHeap[i].pszName; + #endif } break; } @@ -2408,8 +2727,8 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA * } /* Only need lower 12 bits of the cpu addr - don't care what size a void* is */ - ui32Offset = ((IMG_UINTPTR_T)pvCPUVAddr) & (ui32PageSize - 1); - pvPageAlignedCPUVAddr = (IMG_VOID *)((IMG_UINTPTR_T)pvCPUVAddr - ui32Offset); + uOffset = ((IMG_UINTPTR_T)pvCPUVAddr) & (uPageSize - 1); + pvPageAlignedCPUVAddr = (IMG_VOID *)((IMG_UINTPTR_T)pvCPUVAddr - uOffset); eError = OSAllocMem(PVRSRV_PAGEABLE_SELECT, sizeof(PVRSRV_KERNEL_MEM_INFO), @@ -2423,11 +2742,17 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA * OSMemSet(psMemInfo, 0, sizeof(*psMemInfo)); + /* + Force the memory to be read/write. This used to be done in the BM, but + ion imports don't want this behaviour + */ + psMemInfo->ui32Flags |= PVRSRV_MEM_READ | PVRSRV_MEM_WRITE; + psMemBlock = &(psMemInfo->sMemBlk); bBMError = BM_Wrap(hDevMemHeap, - uByteSize, - ui32Offset, + ui32ByteSize, + uOffset, bPhysContig, psSysPAddr, pvPageAlignedCPUVAddr, @@ -2456,7 +2781,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA * /* Fill in the public fields of the MEM_INFO structure */ psMemInfo->sDevVAddr = psMemBlock->sDevVirtAddr; - psMemInfo->uAllocSize = uByteSize; + psMemInfo->uAllocSize = ui32ByteSize; psMemInfo->psKernelSyncInfo = psDeviceClassBuffer->psKernelSyncInfo; PVR_ASSERT(psMemInfo->psKernelSyncInfo != IMG_NULL); @@ -2503,9 +2828,31 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA * PVRSRVKernelMemInfoIncRef(psMemInfo); psMemInfo->memType = PVRSRV_MEMTYPE_DEVICECLASS; +#if defined (MEM_TRACK_INFO_DEBUG) + OSStringCopy(psMemInfo->heapId, pszName); +#endif /* return the meminfo */ *ppsMemInfo = psMemInfo; +#if defined (MEM_TRACK_INFO_DEBUG) + eError = OSAllocMem(PVRSRV_PAGEABLE_SELECT, + sizeof(PVRSRV_MEM_TRACK_INFO), + (IMG_VOID **)&psMemTrackInfo, IMG_NULL, + "Mem tracking info"); + if (eError != PVRSRV_OK) + return eError; + psMemTrackInfo->sDevVAddr = psMemInfo->sDevVAddr; + psMemTrackInfo->uSize = psMemInfo->uAllocSize; + psMemTrackInfo->ui32Pid = OSGetCurrentProcessIDKM(); + psMemTrackInfo->ui32RefCount = psMemInfo->ui32RefCount; + psMemTrackInfo->eOp = PVRSRV_MEMTYPE_DEVICECLASS; + psMemTrackInfo->ui32TimeStampUSecs = OSGetCurrentTimeInUSecsKM(); + + OSGetCurrentProcessNameKM(psMemTrackInfo->asTaskName, 128); + + OSStringCopy(psMemTrackInfo->heapId, psMemInfo->heapId); + PVRSRVAddMemTrackInfo(psMemTrackInfo); +#endif #if defined(SUPPORT_PDUMP_MULTI_PROCESS) /* If the 3PDD supplies a kernel virtual address, we can PDUMP it */ @@ -2522,7 +2869,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVMapDeviceClassMemoryKM(PVRSRV_PER_PROCESS_DATA * * behaviour. */ PDUMPCOMMENT("Dump display surface"); - PDUMPMEM(IMG_NULL, psMemInfo, ui32Offset, psMemInfo->uAllocSize, PDUMP_FLAGS_CONTINUOUS, ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping); + PDUMPMEM(IMG_NULL, psMemInfo, uOffset, psMemInfo->uAllocSize, PDUMP_FLAGS_CONTINUOUS, ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping); } #endif return PVRSRV_OK; @@ -2560,6 +2907,7 @@ ErrorExitPhase1: return eError; } +#endif /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ IMG_EXPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVChangeDeviceMemoryAttributesKM(IMG_HANDLE hKernelMemInfo, IMG_UINT32 ui32Attribs) @@ -2585,8 +2933,189 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVChangeDeviceMemoryAttributesKM(IMG_HANDLE hKerne return PVRSRV_OK; } +PVRSRV_ERROR IMG_CALLCONV PVRSRVInitDeviceMem(IMG_VOID) +{ + PVRSRV_ERROR eError = PVRSRV_OK; + +#if defined(SUPPORT_ION) + /* + For Ion buffers we need to store which ones we know about so + we don't give the same buffer a different sync + */ + g_psIonSyncHash = HASH_Create(ION_SYNC_HASH_SIZE); + if (g_psIonSyncHash == IMG_NULL) + { + eError = PVRSRV_ERROR_OUT_OF_MEMORY; + } +#endif + + return eError; +} + +IMG_VOID IMG_CALLCONV PVRSRVDeInitDeviceMem(IMG_VOID) +{ +#if defined(SUPPORT_ION) + HASH_Delete(g_psIonSyncHash); +#endif +} + +#if defined(MEM_TRACK_INFO_DEBUG) +/*! +****************************************************************************** + + @Function PVRSRVFreeMemOps + @Description + Frees the list of tracked mem ops represented by g_psMemTrackInfoHead + + @Input + @Output + + @Return + +******************************************************************************/ +IMG_VOID IMG_CALLCONV PVRSRVFreeMemOps(IMG_VOID) +{ + PVRSRV_MEM_TRACK_INFO *psFreePtr; + while(g_psMemTrackInfoHead) + { + psFreePtr = g_psMemTrackInfoHead; + g_psMemTrackInfoHead = g_psMemTrackInfoHead->next; + OSFreeMem(PVRSRV_PAGEABLE_SELECT, + sizeof(PVRSRV_MEM_TRACK_INFO), + psFreePtr, IMG_NULL); + } +} +#endif + +static PVRSRV_ERROR PVRSRVDumpSync(PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo) +{ + PVR_LOG(("\tSyncInfo %d:", psKernelSyncInfo->ui32UID)); + PVR_LOG(("\t\tWrite ops (0x%08x): P/C = %d/%d (0x%08x/0x%08x)", + psKernelSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psKernelSyncInfo->psSyncData->ui32WriteOpsPending, + psKernelSyncInfo->psSyncData->ui32WriteOpsComplete, + psKernelSyncInfo->psSyncData->ui32WriteOpsPending, + psKernelSyncInfo->psSyncData->ui32WriteOpsComplete)); + PVR_LOG(("\t\tRead ops (0x%08x): P/C = %d/%d (0x%08x/0x%08x)", + psKernelSyncInfo->sReadOpsCompleteDevVAddr.uiAddr, + psKernelSyncInfo->psSyncData->ui32ReadOpsPending, + psKernelSyncInfo->psSyncData->ui32ReadOpsComplete, + psKernelSyncInfo->psSyncData->ui32ReadOpsPending, + psKernelSyncInfo->psSyncData->ui32ReadOpsComplete)); + PVR_LOG(("\t\tRead ops 2 (0x%08x): P/C = %d/%d (0x%08x/0x%08x)", + psKernelSyncInfo->sReadOps2CompleteDevVAddr.uiAddr, + psKernelSyncInfo->psSyncData->ui32ReadOps2Pending, + psKernelSyncInfo->psSyncData->ui32ReadOps2Complete, + psKernelSyncInfo->psSyncData->ui32ReadOps2Pending, + psKernelSyncInfo->psSyncData->ui32ReadOps2Complete)); + +#if defined(SUPPORT_PER_SYNC_DEBUG) + { + IMG_UINT32 i; + PVR_LOG(("\t\t --- Per sync debug ---")); + + PVR_LOG(("\t\tOperationMask = 0x%08x", psKernelSyncInfo->ui32OperationMask)); + + + for (i=0;i<PER_SYNC_HISTORY;i++) + { + IMG_UINT32 ui32Index = (i + psKernelSyncInfo->ui32HistoryIndex) % PER_SYNC_HISTORY; + IMG_UINT32 ui32OpInfo = psKernelSyncInfo->aui32OpInfo[ui32Index]; + + if (ui32OpInfo & SYNC_OP_HAS_DATA) + { + IMG_UINT32 ui32OpClass = (ui32OpInfo & SYNC_OP_CLASS_MASK) >> SYNC_OP_CLASS_SHIFT; + IMG_UINT32 ui32OpType = (ui32OpInfo & SYNC_OP_TYPE_MASK) >> SYNC_OP_TYPE_SHIFT; + IMG_CHAR *pzClass; + IMG_CHAR *pzType; + + PVR_LOG(("\t\tOperation last - %d\n", PER_SYNC_HISTORY - i)); + + switch(ui32OpClass) + { + case SYNC_OP_CLASS_MODOBJ: + pzClass = "MODOBJ"; + break; + case SYNC_OP_CLASS_QUEUE: + pzClass = "QUEUE"; + break; + case SYNC_OP_CLASS_KICKTA: + pzClass = "KICKTA"; + break; + case SYNC_OP_CLASS_TQ_3D: + pzClass = "TQ_3D"; + break; + case SYNC_OP_CLASS_TQ_2D: + pzClass = "TQ_2D"; + break; + default: + pzClass = "Unknown"; + } + switch(ui32OpType) + { + case SYNC_OP_TYPE_READOP: + pzType = "READOP"; + break; + case SYNC_OP_TYPE_WRITEOP: + pzType = "WRITEOP"; + break; + case SYNC_OP_TYPE_READOP2: + pzType = "READOP2"; + break; + default: + pzType = "Unknown"; + } + PVR_LOG(("\t\t\tui32OpType = 0x%08x", ui32OpInfo)); + PVR_LOG(("\t\t\t\t%s, %s, %s, %s", + pzClass, + pzType, + (ui32OpInfo & SYNC_OP_TAKE) ?"TAKE":"No TAKE", + (ui32OpInfo & SYNC_OP_ROLLBACK) ?"ROLLBACK":"No ROLLBACK")); + + PVR_LOG(("\t\t\ti32ReadOpSample = %d (0x%08x)", + psKernelSyncInfo->aui32ReadOpSample[ui32Index], + psKernelSyncInfo->aui32ReadOpSample[ui32Index])); + PVR_LOG(("\t\t\taui32WriteOpSample = %d (0x%08x)", + psKernelSyncInfo->aui32WriteOpSample[ui32Index], + psKernelSyncInfo->aui32WriteOpSample[ui32Index])); + PVR_LOG(("\t\t\taui32ReadOp2Sample = %d (0x%08x)", + psKernelSyncInfo->aui32ReadOp2Sample[ui32Index], + psKernelSyncInfo->aui32ReadOp2Sample[ui32Index])); + } + } + } +#endif + return PVRSRV_OK; +} + + +static PVRSRV_ERROR PVRSRVDumpActiveSync(PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo) +{ + if ((psKernelSyncInfo->psSyncData->ui32WriteOpsComplete != psKernelSyncInfo->psSyncData->ui32WriteOpsPending) || + (psKernelSyncInfo->psSyncData->ui32ReadOpsComplete != psKernelSyncInfo->psSyncData->ui32ReadOpsPending) || + (psKernelSyncInfo->psSyncData->ui32ReadOps2Complete != psKernelSyncInfo->psSyncData->ui32ReadOps2Pending)) + { + PVRSRVDumpSync(psKernelSyncInfo); + } + return PVRSRV_OK; +} + + +IMG_EXPORT +IMG_VOID IMG_CALLCONV PVRSRVDumpSyncs(IMG_BOOL bActiveOnly) +{ + if (bActiveOnly) + { + PVR_LOG(("Active syncs")); + List_PVRSRV_KERNEL_SYNC_INFO_PVRSRV_ERROR_Any(g_psSyncInfoList, PVRSRVDumpActiveSync); + } + else + { + PVR_LOG(("All syncs")); + List_PVRSRV_KERNEL_SYNC_INFO_PVRSRV_ERROR_Any(g_psSyncInfoList, PVRSRVDumpSync); + } +} /****************************************************************************** End of file (devicemem.c) ******************************************************************************/ - diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/handle.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/handle.c index 1e26047..b9facfd 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/handle.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/handle.c @@ -40,7 +40,7 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**************************************************************************/ -#if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) /* See handle.h for a description of the handle API. */ /* @@ -78,14 +78,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define INDEX_IS_VALID(psBase, i) ((i) < (psBase)->ui32TotalHandCount) /* Valid handles are never NULL, but handle array indices are based from 0 */ -#if defined (SUPPORT_SID_INTERFACE) -#define INDEX_TO_HANDLE(i) ((IMG_SID)((i) + 1)) -#define HANDLE_TO_INDEX(h) ((IMG_UINT32)(h) - 1) -#else #define INDEX_TO_HANDLE(i) ((IMG_HANDLE)((IMG_UINTPTR_T)(i) + 1)) #define HANDLE_TO_INDEX(h) ((IMG_UINT32)(IMG_UINTPTR_T)(h) - 1) -#endif #define INDEX_TO_BLOCK_INDEX(i) DIVIDE_BY_BLOCK_SIZE(i) #define BLOCK_INDEX_TO_INDEX(i) MULTIPLY_BY_BLOCK_SIZE(i) @@ -150,11 +145,7 @@ struct sHandleList { IMG_UINT32 ui32Prev; IMG_UINT32 ui32Next; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hParent; -#else IMG_HANDLE hParent; -#endif }; enum ePVRSRVInternalHandleFlag @@ -324,11 +315,7 @@ typedef IMG_UINTPTR_T HAND_KEY[HAND_KEY_LEN]; #pragma inline(HandleListInit) #endif static INLINE -#if defined (SUPPORT_SID_INTERFACE) -IMG_VOID HandleListInit(IMG_UINT32 ui32Index, struct sHandleList *psList, IMG_SID hParent) -#else IMG_VOID HandleListInit(IMG_UINT32 ui32Index, struct sHandleList *psList, IMG_HANDLE hParent) -#endif { psList->ui32Next = ui32Index; psList->ui32Prev = ui32Index; @@ -484,11 +471,7 @@ IMG_BOOL NoParent(struct sHandle *psHandle) #pragma inline(ParentHandle) #endif static INLINE -#if defined (SUPPORT_SID_INTERFACE) -IMG_SID ParentHandle(struct sHandle *psHandle) -#else IMG_HANDLE ParentHandle(struct sHandle *psHandle) -#endif { return psHandle->sSiblings.hParent; } @@ -721,11 +704,7 @@ PVRSRV_ERROR IterateOverChildren(PVRSRV_HANDLE_BASE *psBase, struct sHandle *psP #pragma inline(GetHandleStructure) #endif static INLINE -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR GetHandleStructure(PVRSRV_HANDLE_BASE *psBase, struct sHandle **ppsHandle, IMG_SID hHandle, PVRSRV_HANDLE_TYPE eType) -#else PVRSRV_ERROR GetHandleStructure(PVRSRV_HANDLE_BASE *psBase, struct sHandle **ppsHandle, IMG_HANDLE hHandle, PVRSRV_HANDLE_TYPE eType) -#endif { IMG_UINT32 ui32Index = HANDLE_TO_INDEX(hHandle); struct sHandle *psHandle; @@ -734,9 +713,6 @@ PVRSRV_ERROR GetHandleStructure(PVRSRV_HANDLE_BASE *psBase, struct sHandle **pps if (!INDEX_IS_VALID(psBase, ui32Index)) { PVR_DPF((PVR_DBG_ERROR, "GetHandleStructure: Handle index out of range (%u >= %u)", ui32Index, psBase->ui32TotalHandCount)); -#if defined (SUPPORT_SID_INTERFACE) - PVR_DBG_BREAK -#endif return PVRSRV_ERROR_HANDLE_INDEX_OUT_OF_RANGE; } @@ -744,9 +720,6 @@ PVRSRV_ERROR GetHandleStructure(PVRSRV_HANDLE_BASE *psBase, struct sHandle **pps if (psHandle->eType == PVRSRV_HANDLE_TYPE_NONE) { PVR_DPF((PVR_DBG_ERROR, "GetHandleStructure: Handle not allocated (index: %u)", ui32Index)); -#if defined (SUPPORT_SID_INTERFACE) - PVR_DBG_BREAK -#endif return PVRSRV_ERROR_HANDLE_NOT_ALLOCATED; } @@ -757,9 +730,6 @@ PVRSRV_ERROR GetHandleStructure(PVRSRV_HANDLE_BASE *psBase, struct sHandle **pps if (eType != PVRSRV_HANDLE_TYPE_NONE && eType != psHandle->eType) { PVR_DPF((PVR_DBG_ERROR, "GetHandleStructure: Handle type mismatch (%d != %d)", eType, psHandle->eType)); -#if defined (SUPPORT_SID_INTERFACE) - PVR_DBG_BREAK -#endif return PVRSRV_ERROR_HANDLE_TYPE_MISMATCH; } @@ -787,11 +757,7 @@ PVRSRV_ERROR GetHandleStructure(PVRSRV_HANDLE_BASE *psBase, struct sHandle **pps #pragma inline(ParentIfPrivate) #endif static INLINE -#if defined (SUPPORT_SID_INTERFACE) -IMG_SID ParentIfPrivate(struct sHandle *psHandle) -#else IMG_HANDLE ParentIfPrivate(struct sHandle *psHandle) -#endif { return TEST_ALLOC_FLAG(psHandle, PVRSRV_HANDLE_ALLOC_FLAG_PRIVATE) ? ParentHandle(psHandle) : IMG_NULL; @@ -814,11 +780,7 @@ IMG_HANDLE ParentIfPrivate(struct sHandle *psHandle) #pragma inline(InitKey) #endif static INLINE -#if defined (SUPPORT_SID_INTERFACE) -IMG_VOID InitKey(HAND_KEY aKey, PVRSRV_HANDLE_BASE *psBase, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, IMG_SID hParent) -#else IMG_VOID InitKey(HAND_KEY aKey, PVRSRV_HANDLE_BASE *psBase, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, IMG_HANDLE hParent) -#endif { PVR_UNREFERENCED_PARAMETER(psBase); @@ -1125,14 +1087,9 @@ static PVRSRV_ERROR FreeHandle(PVRSRV_HANDLE_BASE *psBase, struct sHandle *psHan if (!TEST_ALLOC_FLAG(psHandle, PVRSRV_HANDLE_ALLOC_FLAG_MULTI) && !BATCHED_HANDLE_PARTIALLY_FREE(psHandle)) { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hHandle; - hHandle = (IMG_SID) HASH_Remove_Extended(psBase->psHashTab, aKey); -#else IMG_HANDLE hHandle; hHandle = (IMG_HANDLE) HASH_Remove_Extended(psBase->psHashTab, aKey); -#endif PVR_ASSERT(hHandle != IMG_NULL); PVR_ASSERT(hHandle == INDEX_TO_HANDLE(ui32Index)); @@ -1339,11 +1296,7 @@ static PVRSRV_ERROR FreeHandleBase(PVRSRV_HANDLE_BASE *psBase) #pragma inline(FindHandle) #endif static INLINE -#if defined (SUPPORT_SID_INTERFACE) -IMG_SID FindHandle(PVRSRV_HANDLE_BASE *psBase, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, IMG_SID hParent) -#else IMG_HANDLE FindHandle(PVRSRV_HANDLE_BASE *psBase, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, IMG_HANDLE hParent) -#endif { HAND_KEY aKey; @@ -1351,11 +1304,7 @@ IMG_HANDLE FindHandle(PVRSRV_HANDLE_BASE *psBase, IMG_VOID *pvData, PVRSRV_HANDL InitKey(aKey, psBase, pvData, eType, hParent); -#if defined (SUPPORT_SID_INTERFACE) - return (IMG_SID) HASH_Retrieve_Extended(psBase->psHashTab, aKey); -#else return (IMG_HANDLE) HASH_Retrieve_Extended(psBase->psHashTab, aKey); -#endif } /*! @@ -1457,19 +1406,11 @@ static PVRSRV_ERROR EnsureFreeHandles(PVRSRV_HANDLE_BASE *psBase, IMG_UINT32 ui3 @Return Error code or PVRSRV_OK ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -static PVRSRV_ERROR AllocHandle(PVRSRV_HANDLE_BASE *psBase, IMG_SID *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, PVRSRV_HANDLE_ALLOC_FLAG eFlag, IMG_SID hParent) -#else static PVRSRV_ERROR AllocHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, PVRSRV_HANDLE_ALLOC_FLAG eFlag, IMG_HANDLE hParent) -#endif { IMG_UINT32 ui32NewIndex = DEFAULT_MAX_INDEX_PLUS_ONE; struct sHandle *psNewHandle = IMG_NULL; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hHandle; -#else IMG_HANDLE hHandle; -#endif HAND_KEY aKey; PVRSRV_ERROR eError; @@ -1662,24 +1603,12 @@ static PVRSRV_ERROR AllocHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHandle @Return Error code or PVRSRV_OK ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRSRVAllocHandle(PVRSRV_HANDLE_BASE *psBase, IMG_SID *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, PVRSRV_HANDLE_ALLOC_FLAG eFlag) -#else PVRSRV_ERROR PVRSRVAllocHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, PVRSRV_HANDLE_ALLOC_FLAG eFlag) -#endif { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hHandle; -#else IMG_HANDLE hHandle; -#endif PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - *phHandle = 0; -#else *phHandle = IMG_NULL; -#endif if (HANDLES_BATCHED(psBase)) { @@ -1697,11 +1626,7 @@ PVRSRV_ERROR PVRSRVAllocHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHandle, { /* See if there is already a handle for this data pointer */ hHandle = FindHandle(psBase, pvData, eType, IMG_NULL); -#if defined (SUPPORT_SID_INTERFACE) - if (hHandle != 0) -#else if (hHandle != IMG_NULL) -#endif { struct sHandle *psHandle; @@ -1724,9 +1649,6 @@ PVRSRV_ERROR PVRSRVAllocHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHandle, goto exit_ok; } -#if defined (SUPPORT_SID_INTERFACE) - PVR_DBG_BREAK -#endif return PVRSRV_ERROR_HANDLE_NOT_SHAREABLE; } } @@ -1759,26 +1681,15 @@ exit_ok: @Return Error code or PVRSRV_OK ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRSRVAllocSubHandle(PVRSRV_HANDLE_BASE *psBase, IMG_SID *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, PVRSRV_HANDLE_ALLOC_FLAG eFlag, IMG_SID hParent) -#else PVRSRV_ERROR PVRSRVAllocSubHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, PVRSRV_HANDLE_ALLOC_FLAG eFlag, IMG_HANDLE hParent) -#endif { struct sHandle *psPHand; struct sHandle *psCHand; PVRSRV_ERROR eError; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hParentKey; - IMG_SID hHandle; - - *phHandle = 0; -#else IMG_HANDLE hParentKey; IMG_HANDLE hHandle; *phHandle = IMG_NULL; -#endif if (HANDLES_BATCHED(psBase)) { @@ -1806,11 +1717,7 @@ PVRSRV_ERROR PVRSRVAllocSubHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHand { /* See if there is already a handle for this data pointer */ hHandle = FindHandle(psBase, pvData, eType, hParentKey); -#if defined (SUPPORT_SID_INTERFACE) - if (hHandle != 0) -#else if (hHandle != IMG_NULL) -#endif { struct sHandle *psCHandle; PVRSRV_ERROR eErr; @@ -1835,9 +1742,6 @@ PVRSRV_ERROR PVRSRVAllocSubHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHand *phHandle = hHandle; goto exit_ok; } -#if defined (SUPPORT_SID_INTERFACE) - PVR_DBG_BREAK -#endif return PVRSRV_ERROR_HANDLE_NOT_SHAREABLE; } } @@ -1886,26 +1790,14 @@ exit_ok: @Return Error code or PVRSRV_OK ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRSRVFindHandle(PVRSRV_HANDLE_BASE *psBase, IMG_SID *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType) -#else PVRSRV_ERROR PVRSRVFindHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType) -#endif { -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hHandle; -#else IMG_HANDLE hHandle; -#endif PVR_ASSERT(eType != PVRSRV_HANDLE_TYPE_NONE); /* See if there is a handle for this data pointer */ -#if defined (SUPPORT_SID_INTERFACE) - hHandle = (IMG_SID) FindHandle(psBase, pvData, eType, IMG_NULL); -#else hHandle = (IMG_HANDLE) FindHandle(psBase, pvData, eType, IMG_NULL); -#endif if (hHandle == IMG_NULL) { return PVRSRV_ERROR_HANDLE_NOT_FOUND; @@ -1933,11 +1825,7 @@ PVRSRV_ERROR PVRSRVFindHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHandle, @Return Error code or PVRSRV_OK ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRSRVLookupHandleAnyType(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, PVRSRV_HANDLE_TYPE *peType, IMG_SID hHandle) -#else PVRSRV_ERROR PVRSRVLookupHandleAnyType(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, PVRSRV_HANDLE_TYPE *peType, IMG_HANDLE hHandle) -#endif { struct sHandle *psHandle; PVRSRV_ERROR eError; @@ -1946,9 +1834,7 @@ PVRSRV_ERROR PVRSRVLookupHandleAnyType(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *pp if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVLookupHandleAnyType: Error looking up handle (%d)", eError)); -#if defined (SUPPORT_SID_INTERFACE) - PVR_DBG_BREAK -#endif + OSDumpStack(); return eError; } @@ -1974,27 +1860,18 @@ PVRSRV_ERROR PVRSRVLookupHandleAnyType(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *pp @Return Error code or PVRSRV_OK ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRSRVLookupHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, IMG_SID hHandle, PVRSRV_HANDLE_TYPE eType) -#else PVRSRV_ERROR PVRSRVLookupHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, IMG_HANDLE hHandle, PVRSRV_HANDLE_TYPE eType) -#endif { struct sHandle *psHandle; PVRSRV_ERROR eError; PVR_ASSERT(eType != PVRSRV_HANDLE_TYPE_NONE); -#if defined (SUPPORT_SID_INTERFACE) - PVR_ASSERT(hHandle != 0); -#endif eError = GetHandleStructure(psBase, &psHandle, hHandle, eType); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVLookupHandle: Error looking up handle (%d)", eError)); -#if defined (SUPPORT_SID_INTERFACE) - PVR_DBG_BREAK -#endif + OSDumpStack(); return eError; } @@ -2020,25 +1897,19 @@ PVRSRV_ERROR PVRSRVLookupHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, @Return Error code or PVRSRV_OK ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRSRVLookupSubHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, IMG_SID hHandle, PVRSRV_HANDLE_TYPE eType, IMG_SID hAncestor) -#else PVRSRV_ERROR PVRSRVLookupSubHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, IMG_HANDLE hHandle, PVRSRV_HANDLE_TYPE eType, IMG_HANDLE hAncestor) -#endif { struct sHandle *psPHand; struct sHandle *psCHand; PVRSRV_ERROR eError; PVR_ASSERT(eType != PVRSRV_HANDLE_TYPE_NONE); -#if defined (SUPPORT_SID_INTERFACE) - PVR_ASSERT(hHandle != 0); -#endif eError = GetHandleStructure(psBase, &psCHand, hHandle, eType); if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVLookupSubHandle: Error looking up subhandle (%d)", eError)); + OSDumpStack(); return eError; } @@ -2076,11 +1947,7 @@ PVRSRV_ERROR PVRSRVLookupSubHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvDat not regarded as an error. ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRSRVGetParentHandle(PVRSRV_HANDLE_BASE *psBase, IMG_SID *phParent, IMG_SID hHandle, PVRSRV_HANDLE_TYPE eType) -#else PVRSRV_ERROR PVRSRVGetParentHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *phParent, IMG_HANDLE hHandle, PVRSRV_HANDLE_TYPE eType) -#endif { struct sHandle *psHandle; PVRSRV_ERROR eError; @@ -2091,6 +1958,7 @@ PVRSRV_ERROR PVRSRVGetParentHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *phPare if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVGetParentHandle: Error looking up subhandle (%d)", eError)); + OSDumpStack(); return eError; } @@ -2116,11 +1984,7 @@ PVRSRV_ERROR PVRSRVGetParentHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *phPare @Return Error code or PVRSRV_OK ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRSRVLookupAndReleaseHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, IMG_SID hHandle, PVRSRV_HANDLE_TYPE eType) -#else PVRSRV_ERROR PVRSRVLookupAndReleaseHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, IMG_HANDLE hHandle, PVRSRV_HANDLE_TYPE eType) -#endif { struct sHandle *psHandle; PVRSRV_ERROR eError; @@ -2131,9 +1995,7 @@ PVRSRV_ERROR PVRSRVLookupAndReleaseHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVLookupAndReleaseHandle: Error looking up handle (%d)", eError)); -#if defined (SUPPORT_SID_INTERFACE) - PVR_DBG_BREAK -#endif + OSDumpStack(); return eError; } @@ -2157,11 +2019,7 @@ PVRSRV_ERROR PVRSRVLookupAndReleaseHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID @Return Error code or PVRSRV_OK ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRSRVReleaseHandle(PVRSRV_HANDLE_BASE *psBase, IMG_SID hHandle, PVRSRV_HANDLE_TYPE eType) -#else PVRSRV_ERROR PVRSRVReleaseHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE hHandle, PVRSRV_HANDLE_TYPE eType) -#endif { struct sHandle *psHandle; PVRSRV_ERROR eError; @@ -2172,6 +2030,7 @@ PVRSRV_ERROR PVRSRVReleaseHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE hHandle, if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVReleaseHandle: Error looking up handle (%d)", eError)); + OSDumpStack(); return eError; } @@ -2683,7 +2542,7 @@ PVRSRV_ERROR PVRSRVHandleDeInit(IMG_VOID) } #else /* disable warning about empty module */ -#endif /* #if defined(PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) */ +#endif /* #if defined(PVR_SECURE_HANDLES) */ /****************************************************************************** End of file (handle.c) ******************************************************************************/ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/hash.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/hash.c index 1569425..72432fd 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/hash.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/hash.c @@ -425,8 +425,8 @@ HASH_Insert_Extended (HASH_TABLE *pHash, IMG_VOID *pKey, IMG_UINTPTR_T v) BUCKET *pBucket; PVR_DPF ((PVR_DBG_MESSAGE, - "HASH_Insert_Extended: Hash=0x%08x, pKey=0x%08x, v=0x%x", - (IMG_UINTPTR_T)pHash, (IMG_UINTPTR_T)pKey, v)); + "HASH_Insert_Extended: Hash=0x%p, pKey=0x%p, v=0x" UINTPTR_FMT, + pHash, pKey, v)); PVR_ASSERT (pHash != IMG_NULL); @@ -488,8 +488,8 @@ IMG_BOOL HASH_Insert (HASH_TABLE *pHash, IMG_UINTPTR_T k, IMG_UINTPTR_T v) { PVR_DPF ((PVR_DBG_MESSAGE, - "HASH_Insert: Hash=0x%x, k=0x%x, v=0x%x", - (IMG_UINTPTR_T)pHash, k, v)); + "HASH_Insert: Hash=0x%p, k=0x" UINTPTR_FMT ", v=0x" UINTPTR_FMT, + pHash, k, v)); return HASH_Insert_Extended(pHash, &k, v); } @@ -513,8 +513,8 @@ HASH_Remove_Extended(HASH_TABLE *pHash, IMG_VOID *pKey) BUCKET **ppBucket; IMG_UINT32 uIndex; - PVR_DPF ((PVR_DBG_MESSAGE, "HASH_Remove_Extended: Hash=0x%x, pKey=0x%x", - (IMG_UINTPTR_T)pHash, (IMG_UINTPTR_T)pKey)); + PVR_DPF ((PVR_DBG_MESSAGE, "HASH_Remove_Extended: Hash=0x%p, pKey=0x%p", + pHash, pKey)); PVR_ASSERT (pHash != IMG_NULL); @@ -553,14 +553,14 @@ HASH_Remove_Extended(HASH_TABLE *pHash, IMG_VOID *pKey) } PVR_DPF ((PVR_DBG_MESSAGE, - "HASH_Remove_Extended: Hash=0x%x, pKey=0x%x = 0x%x", - (IMG_UINTPTR_T)pHash, (IMG_UINTPTR_T)pKey, v)); + "HASH_Remove_Extended: Hash=0x%p, pKey=0x%p = 0x" UINTPTR_FMT, + pHash, pKey, v)); return v; } } PVR_DPF ((PVR_DBG_MESSAGE, - "HASH_Remove_Extended: Hash=0x%x, pKey=0x%x = 0x0 !!!!", - (IMG_UINTPTR_T)pHash, (IMG_UINTPTR_T)pKey)); + "HASH_Remove_Extended: Hash=0x%p, pKey=0x%p = 0x0 !!!!", + pHash, pKey)); return 0; } @@ -580,8 +580,8 @@ HASH_Remove_Extended(HASH_TABLE *pHash, IMG_VOID *pKey) IMG_UINTPTR_T HASH_Remove (HASH_TABLE *pHash, IMG_UINTPTR_T k) { - PVR_DPF ((PVR_DBG_MESSAGE, "HASH_Remove: Hash=0x%x, k=0x%x", - (IMG_UINTPTR_T)pHash, k)); + PVR_DPF ((PVR_DBG_MESSAGE, "HASH_Remove: Hash=0x%p, k=0x" UINTPTR_FMT, + pHash, k)); return HASH_Remove_Extended(pHash, &k); } @@ -605,8 +605,8 @@ HASH_Retrieve_Extended (HASH_TABLE *pHash, IMG_VOID *pKey) BUCKET **ppBucket; IMG_UINT32 uIndex; - PVR_DPF ((PVR_DBG_MESSAGE, "HASH_Retrieve_Extended: Hash=0x%x, pKey=0x%x", - (IMG_UINTPTR_T)pHash, (IMG_UINTPTR_T)pKey)); + PVR_DPF ((PVR_DBG_MESSAGE, "HASH_Retrieve_Extended: Hash=0x%p, pKey=0x%p", + pHash, pKey)); PVR_ASSERT (pHash != IMG_NULL); @@ -627,14 +627,14 @@ HASH_Retrieve_Extended (HASH_TABLE *pHash, IMG_VOID *pKey) IMG_UINTPTR_T v = pBucket->v; PVR_DPF ((PVR_DBG_MESSAGE, - "HASH_Retrieve: Hash=0x%x, pKey=0x%x = 0x%x", - (IMG_UINTPTR_T)pHash, (IMG_UINTPTR_T)pKey, v)); + "HASH_Retrieve: Hash=0x%p, pKey=0x%p = 0x" UINTPTR_FMT, + pHash, pKey, v)); return v; } } PVR_DPF ((PVR_DBG_MESSAGE, - "HASH_Retrieve: Hash=0x%x, pKey=0x%x = 0x0 !!!!", - (IMG_UINTPTR_T)pHash, (IMG_UINTPTR_T)pKey)); + "HASH_Retrieve: Hash=0x%p, pKey=0x%p = 0x0 !!!!", + pHash, pKey)); return 0; } @@ -653,8 +653,8 @@ HASH_Retrieve_Extended (HASH_TABLE *pHash, IMG_VOID *pKey) IMG_UINTPTR_T HASH_Retrieve (HASH_TABLE *pHash, IMG_UINTPTR_T k) { - PVR_DPF ((PVR_DBG_MESSAGE, "HASH_Retrieve: Hash=0x%x, k=0x%x", - (IMG_UINTPTR_T)pHash, k)); + PVR_DPF ((PVR_DBG_MESSAGE, "HASH_Retrieve: Hash=0x%p, k=0x" UINTPTR_FMT, + pHash, k)); return HASH_Retrieve_Extended(pHash, &k); } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/lists.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/lists.c index c6e1ee8..4ffdb0d 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/lists.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/lists.c @@ -75,6 +75,9 @@ IMPLEMENT_LIST_ANY_VA_2(PVRSRV_POWER_DEV, PVRSRV_ERROR, PVRSRV_OK) IMPLEMENT_LIST_INSERT(PVRSRV_POWER_DEV) IMPLEMENT_LIST_REMOVE(PVRSRV_POWER_DEV) +IMPLEMENT_LIST_ANY_2(PVRSRV_KERNEL_SYNC_INFO, PVRSRV_ERROR, PVRSRV_OK); +IMPLEMENT_LIST_INSERT(PVRSRV_KERNEL_SYNC_INFO) +IMPLEMENT_LIST_REMOVE(PVRSRV_KERNEL_SYNC_INFO) /*=================================================================== BELOW ARE IMPLEMENTED SOME COMMON CALLBACKS USED IN DIFFERENT FILES diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/mem_debug.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/mem_debug.c index 04432b1..f79e7cb 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/mem_debug.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/mem_debug.c @@ -86,12 +86,12 @@ extern "C" */ IMG_VOID OSCheckMemDebug(IMG_PVOID pvCpuVAddr, IMG_SIZE_T uSize, const IMG_CHAR *pszFileName, const IMG_UINT32 uLine) { - OSMEM_DEBUG_INFO const *psInfo = (OSMEM_DEBUG_INFO *)((IMG_UINT32)pvCpuVAddr - TEST_BUFFER_PADDING_STATUS); + OSMEM_DEBUG_INFO const *psInfo = (OSMEM_DEBUG_INFO *)((IMG_UINTPTR_T)pvCpuVAddr - TEST_BUFFER_PADDING_STATUS); /* invalid pointer */ if (pvCpuVAddr == IMG_NULL) { - PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%X : null pointer" + PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%p : null pointer" " - referenced %s:%d - allocated %s:%d", pvCpuVAddr, pszFileName, uLine, @@ -102,7 +102,7 @@ extern "C" /* align */ if (((IMG_UINT32)pvCpuVAddr&3) != 0) { - PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%X : invalid alignment" + PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%p : invalid alignment" " - referenced %s:%d - allocated %s:%d", pvCpuVAddr, pszFileName, uLine, @@ -113,7 +113,7 @@ extern "C" /*check guard region before*/ if (!MemCheck((IMG_PVOID)psInfo->sGuardRegionBefore, 0xB1, sizeof(psInfo->sGuardRegionBefore))) { - PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%X : guard region before overwritten" + PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%p : guard region before overwritten" " - referenced %s:%d - allocated %s:%d", pvCpuVAddr, pszFileName, uLine, @@ -124,7 +124,9 @@ extern "C" /*check size*/ if (uSize != psInfo->uSize) { - PVR_DPF((PVR_DBG_WARNING, "Pointer 0x%X : supplied size was different to stored size (0x%X != 0x%X)" + PVR_DPF((PVR_DBG_WARNING, + "Pointer 0x%p : supplied size was different to stored size (0x%" + SIZE_T_FMT_LEN "X != 0x%" SIZE_T_FMT_LEN "X)" " - referenced %s:%d - allocated %s:%d", pvCpuVAddr, uSize, psInfo->uSize, pszFileName, uLine, @@ -135,7 +137,9 @@ extern "C" /*check size parity*/ if ((0x01234567 ^ psInfo->uSizeParityCheck) != psInfo->uSize) { - PVR_DPF((PVR_DBG_WARNING, "Pointer 0x%X : stored size parity error (0x%X != 0x%X)" + PVR_DPF((PVR_DBG_WARNING, + "Pointer 0x%p : stored size parity error (0x%" + SIZE_T_FMT_LEN "X != 0x%" SIZE_T_FMT_LEN "X)" " - referenced %s:%d - allocated %s:%d", pvCpuVAddr, psInfo->uSize, 0x01234567 ^ psInfo->uSizeParityCheck, pszFileName, uLine, @@ -151,9 +155,9 @@ extern "C" /*check padding after*/ if (uSize) { - if (!MemCheck((IMG_VOID*)((IMG_UINT32)pvCpuVAddr + uSize), 0xB2, TEST_BUFFER_PADDING_AFTER)) + if (!MemCheck((IMG_VOID*)((IMG_UINTPTR_T)pvCpuVAddr + uSize), 0xB2, TEST_BUFFER_PADDING_AFTER)) { - PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%X : guard region after overwritten" + PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%p : guard region after overwritten" " - referenced from %s:%d - allocated from %s:%d", pvCpuVAddr, pszFileName, uLine, @@ -164,7 +168,7 @@ extern "C" /* allocated... */ if (psInfo->eValid != isAllocated) { - PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%X : not allocated (freed? %d)" + PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%p : not allocated (freed? %d)" " - referenced %s:%d - freed %s:%d", pvCpuVAddr, psInfo->eValid == isFree, pszFileName, uLine, @@ -223,12 +227,12 @@ extern "C" psInfo->uSizeParityCheck = 0x01234567 ^ ui32Size; /*point to the user data section*/ - *ppvCpuVAddr = (IMG_PVOID) ((IMG_UINT32)*ppvCpuVAddr)+TEST_BUFFER_PADDING_STATUS; + *ppvCpuVAddr = (IMG_PVOID) ((IMG_UINTPTR_T)*ppvCpuVAddr)+TEST_BUFFER_PADDING_STATUS; #ifdef PVRSRV_LOG_MEMORY_ALLOCS /*this is here to simplify the surounding logging macro, that is a expression maybe the macro should be an expression */ - PVR_TRACE(("Allocated pointer (after debug info): 0x%X from %s:%d", *ppvCpuVAddr, pszFilename, ui32Line)); + PVR_TRACE(("Allocated pointer (after debug info): 0x%p from %s:%d", *ppvCpuVAddr, pszFilename, ui32Line)); #endif return PVRSRV_OK; @@ -250,7 +254,7 @@ extern "C" OSMemSet(pvCpuVAddr, 0xBF, ui32Size + TEST_BUFFER_PADDING_AFTER); /*point to the starting address of the total allocated memory*/ - psInfo = (OSMEM_DEBUG_INFO *)((IMG_UINT32) pvCpuVAddr - TEST_BUFFER_PADDING_STATUS); + psInfo = (OSMEM_DEBUG_INFO *)((IMG_UINTPTR_T) pvCpuVAddr - TEST_BUFFER_PADDING_STATUS); /*update dbg info struct*/ psInfo->uSize = 0; diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/pdump_common.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/pdump_common.c index 2d96dc3..efedb61 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/pdump_common.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/pdump_common.c @@ -75,26 +75,9 @@ static IMG_UINT16 gui16MMUContextUsage = 0; IMG_UINT32 g_ui32EveryLineCounter = 1U; #endif -#ifdef INLINE_IS_PRAGMA -#pragma inline(_PDumpIsPersistent) -#endif -static INLINE -IMG_BOOL _PDumpIsPersistent(IMG_VOID) -{ - PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData(); - - if(psPerProc == IMG_NULL) - { - /* only occurs early in driver init, and init phase is already persistent */ - return IMG_FALSE; - } - return psPerProc->bPDumpPersistent; -} - #if defined(SUPPORT_PDUMP_MULTI_PROCESS) -static INLINE IMG_BOOL _PDumpIsProcessActive(IMG_VOID) { PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData(); @@ -226,6 +209,36 @@ PVRSRV_ERROR PDumpSetFrameKM(IMG_UINT32 ui32Frame) #endif } +static IMG_BOOL _PDumpWillCapture(IMG_UINT32 ui32Flags) +{ + /* + FIXME: + We really need to know if the PDump client is connected so we can + check if the continuous data will be saved or not. + */ + if ((ui32Flags & PDUMP_FLAGS_PERSISTENT) || (ui32Flags & PDUMP_FLAGS_CONTINUOUS)) + { + return IMG_TRUE; + } + else + { + return PDumpIsCaptureFrameKM(); + } +} + +IMG_BOOL PDumpWillCapture(IMG_UINT32 ui32Flags) +{ +#if defined(SUPPORT_PDUMP_MULTI_PROCESS) + if( _PDumpIsProcessActive() ) + { + return _PDumpWillCapture(ui32Flags); + } + return PVRSRV_OK; +#else + return _PDumpWillCapture(ui32Flags); +#endif +} + /************************************************************************** * Function Name : PDumpRegWithFlagsKM * Inputs : pszPDumpDevName, Register offset, and value to write @@ -240,16 +253,20 @@ PVRSRV_ERROR PDumpRegWithFlagsKM(IMG_CHAR *pszPDumpRegName, { PVRSRV_ERROR eErr; PDUMP_GET_SCRIPT_STRING() + + PDUMP_LOCK(); PDUMP_DBG(("PDumpRegWithFlagsKM")); eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "WRW :%s:0x%08X 0x%08X\r\n", pszPDumpRegName, ui32Reg, ui32Data); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -293,14 +310,10 @@ PVRSRV_ERROR PDumpRegPolWithFlagsKM(IMG_CHAR *pszPDumpRegName, PVRSRV_ERROR eErr; IMG_UINT32 ui32PollCount; - PDUMP_GET_SCRIPT_STRING(); + + PDUMP_LOCK(); PDUMP_DBG(("PDumpRegPolWithFlagsKM")); - if ( _PDumpIsPersistent() ) - { - /* Don't pdump-poll if the process is persistent */ - return PVRSRV_OK; - } ui32PollCount = POLL_COUNT_LONG; @@ -309,10 +322,12 @@ PVRSRV_ERROR PDumpRegPolWithFlagsKM(IMG_CHAR *pszPDumpRegName, ui32Mask, eOperator, ui32PollCount, POLL_DELAY); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -355,8 +370,8 @@ PVRSRV_ERROR PDumpMallocPages (PVRSRV_DEVICE_IDENTIFIER *psDevID, IMG_HANDLE hOSMemHandle, IMG_UINT32 ui32NumBytes, IMG_UINT32 ui32PageSize, - IMG_BOOL bShared, - IMG_HANDLE hUniqueTag) + IMG_HANDLE hUniqueTag, + IMG_UINT32 ui32Flags) { PVRSRV_ERROR eErr; IMG_PUINT8 pui8LinAddr; @@ -364,16 +379,11 @@ PVRSRV_ERROR PDumpMallocPages (PVRSRV_DEVICE_IDENTIFIER *psDevID, IMG_UINT32 ui32NumPages; IMG_DEV_PHYADDR sDevPAddr; IMG_UINT32 ui32Page; - IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS; - + IMG_UINT32 ui32PageSizeShift = 0; + IMG_UINT32 ui32PageSizeTmp; PDUMP_GET_SCRIPT_STRING(); -#if defined(SUPPORT_PDUMP_MULTI_PROCESS) - /* Always dump physical pages backing a shared allocation */ - ui32Flags |= ( _PDumpIsPersistent() || bShared ) ? PDUMP_FLAGS_PERSISTENT : 0; -#else - PVR_UNREFERENCED_PARAMETER(bShared); - ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0; -#endif + + PDUMP_LOCK(); /* However, lin addr is only required in non-linux OSes */ #if !defined(LINUX) @@ -384,12 +394,22 @@ PVRSRV_ERROR PDumpMallocPages (PVRSRV_DEVICE_IDENTIFIER *psDevID, PVR_ASSERT(((IMG_UINT32) ui32NumBytes & HOST_PAGEMASK) == 0); /* + Compute the amount to right-shift in order to divide by the page-size. + Required for 32-bit PAE kernels (thus phys addresses are 64-bits) where + 64-bit division is unsupported. + */ + ui32PageSizeTmp = ui32PageSize; + while (ui32PageSizeTmp >>= 1) + ui32PageSizeShift++; + + /* Write a comment to the PDump2 script streams indicating the memory allocation */ - eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "-- MALLOC :%s:VA_%08X 0x%08X %u\r\n", - psDevID->pszPDumpDevName, ui32DevVAddr, ui32NumBytes, ui32PageSize); + eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "-- MALLOC :%s:VA_%08X 0x%08X %u (%d pages)\r\n", + psDevID->pszPDumpDevName, ui32DevVAddr, ui32NumBytes, ui32PageSize, ui32NumBytes / ui32PageSize); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); @@ -399,7 +419,7 @@ PVRSRV_ERROR PDumpMallocPages (PVRSRV_DEVICE_IDENTIFIER *psDevID, */ pui8LinAddr = (IMG_PUINT8) pvLinAddr; ui32Offset = 0; - ui32NumPages = ui32NumBytes / ui32PageSize; + ui32NumPages = ui32NumBytes >> ui32PageSizeShift; while (ui32NumPages) { ui32NumPages--; @@ -415,24 +435,29 @@ PVRSRV_ERROR PDumpMallocPages (PVRSRV_DEVICE_IDENTIFIER *psDevID, pui8LinAddr, ui32PageSize, &sDevPAddr); - ui32Page = (IMG_UINT32)(sDevPAddr.uiAddr / ui32PageSize); + ui32Page = (IMG_UINT32)(sDevPAddr.uiAddr >> ui32PageSizeShift); /* increment kernel virtual address */ pui8LinAddr += ui32PageSize; ui32Offset += ui32PageSize; - eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "MALLOC :%s:PA_%08X%08X %u %u 0x%08X\r\n", + sDevPAddr.uiAddr = ui32Page * ui32PageSize; + + eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "MALLOC :%s:PA_" UINTPTR_FMT DEVPADDR_FMT " %u %u 0x" DEVPADDR_FMT "\r\n", psDevID->pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, - ui32Page * ui32PageSize, + (IMG_UINTPTR_T)hUniqueTag, + sDevPAddr.uiAddr, ui32PageSize, ui32PageSize, - ui32Page * ui32PageSize); + sDevPAddr.uiAddr); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); } + + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -454,13 +479,13 @@ PVRSRV_ERROR PDumpMallocPageTable (PVRSRV_DEVICE_IDENTIFIER *psDevId, { PVRSRV_ERROR eErr; IMG_DEV_PHYADDR sDevPAddr; - PDUMP_GET_SCRIPT_STRING(); + PDUMP_LOCK(); PVR_ASSERT(((IMG_UINTPTR_T)pvLinAddr & (ui32PTSize - 1)) == 0); + ui32Flags |= PDUMP_FLAGS_CONTINUOUS; - ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0; - + /* Write a comment to the PDump2 script streams indicating the memory allocation */ @@ -472,6 +497,7 @@ PVRSRV_ERROR PDumpMallocPageTable (PVRSRV_DEVICE_IDENTIFIER *psDevId, ui32PTSize); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); @@ -491,19 +517,22 @@ PVRSRV_ERROR PDumpMallocPageTable (PVRSRV_DEVICE_IDENTIFIER *psDevId, ui32PTSize, &sDevPAddr); - eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "MALLOC :%s:PA_%08X%08X 0x%X %u 0x%08X\r\n", + eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "MALLOC :%s:PA_" UINTPTR_FMT DEVPADDR_FMT + " 0x%X %u 0x" DEVPADDR_FMT "\r\n", psDevId->pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, + (IMG_UINTPTR_T)hUniqueTag, sDevPAddr.uiAddr, ui32PTSize,//size ui32PTSize,//alignment sDevPAddr.uiAddr); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -521,21 +550,20 @@ PVRSRV_ERROR PDumpFreePages (BM_HEAP *psBMHeap, IMG_UINT32 ui32PageSize, IMG_HANDLE hUniqueTag, IMG_BOOL bInterleaved, - IMG_BOOL bSparse) + IMG_BOOL bSparse, + IMG_UINT32 ui32Flags) { PVRSRV_ERROR eErr; IMG_UINT32 ui32NumPages, ui32PageCounter; IMG_DEV_PHYADDR sDevPAddr; - IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS; PVRSRV_DEVICE_NODE *psDeviceNode; - PDUMP_GET_SCRIPT_STRING(); + PDUMP_LOCK(); PVR_ASSERT(((IMG_UINT32) sDevVAddr.uiAddr & (ui32PageSize - 1)) == 0); PVR_ASSERT(((IMG_UINT32) ui32NumBytes & (ui32PageSize - 1)) == 0); psDeviceNode = psBMHeap->pBMContext->psDeviceNode; - ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0; /* Write a comment to the PDUMP2 script streams indicating the memory free @@ -544,22 +572,10 @@ PVRSRV_ERROR PDumpFreePages (BM_HEAP *psBMHeap, psDeviceNode->sDevId.pszPDumpDevName, sDevVAddr.uiAddr); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } -#if defined(SUPPORT_PDUMP_MULTI_PROCESS) - /* if we're dumping a shared heap, need to ensure phys allocation - * is freed even if this app isn't the one marked for pdumping - */ - { - PVRSRV_DEVICE_NODE *psDeviceNode = psBMHeap->pBMContext->psDeviceNode; - - if( psDeviceNode->pfnMMUIsHeapShared(psBMHeap->pMMUHeap) ) - { - ui32Flags |= PDUMP_FLAGS_PERSISTENT; - } - } -#endif PDumpOSWriteString2(hScript, ui32Flags); /* @@ -580,10 +596,13 @@ PVRSRV_ERROR PDumpFreePages (BM_HEAP *psBMHeap, PVR_ASSERT(sDevPAddr.uiAddr != 0); - eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "FREE :%s:PA_%08X%08X\r\n", - psDeviceNode->sDevId.pszPDumpDevName, (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, sDevPAddr.uiAddr); + eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "FREE :%s:PA_" UINTPTR_FMT DEVPADDR_FMT "\r\n", + psDeviceNode->sDevId.pszPDumpDevName, + (IMG_UINTPTR_T)hUniqueTag, + sDevPAddr.uiAddr); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); @@ -595,6 +614,8 @@ PVRSRV_ERROR PDumpFreePages (BM_HEAP *psBMHeap, sDevVAddr.uiAddr += ui32PageSize; } + + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -614,12 +635,10 @@ PVRSRV_ERROR PDumpFreePageTable (PVRSRV_DEVICE_IDENTIFIER *psDevID, { PVRSRV_ERROR eErr; IMG_DEV_PHYADDR sDevPAddr; - PDUMP_GET_SCRIPT_STRING(); - PVR_UNREFERENCED_PARAMETER(ui32PTSize); - ui32Flags |= PDUMP_FLAGS_CONTINUOUS; - ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0; + + PDUMP_LOCK(); /* override QAC warning about wrap around */ PVR_ASSERT(((IMG_UINTPTR_T)pvLinAddr & (ui32PTSize-1UL)) == 0); /* PRQA S 3382 */ @@ -630,6 +649,7 @@ PVRSRV_ERROR PDumpFreePageTable (PVRSRV_DEVICE_IDENTIFIER *psDevID, eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "-- FREE :%s:PAGE_TABLE\r\n", psDevID->pszPDumpDevName); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); @@ -650,17 +670,19 @@ PVRSRV_ERROR PDumpFreePageTable (PVRSRV_DEVICE_IDENTIFIER *psDevID, &sDevPAddr); { - eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "FREE :%s:PA_%08X%08X\r\n", + eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "FREE :%s:PA_" UINTPTR_FMT DEVPADDR_FMT "\r\n", psDevID->pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, + (IMG_UINTPTR_T)hUniqueTag, sDevPAddr.uiAddr); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); } + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -684,8 +706,11 @@ PVRSRV_ERROR PDumpPDRegWithFlags(PDUMP_MMU_ATTRIB *psMMUAttrib, { PVRSRV_ERROR eErr; IMG_CHAR *pszRegString; + IMG_DEV_PHYADDR sDevPAddr; + PDUMP_GET_SCRIPT_STRING() - + + PDUMP_LOCK(); if(psMMUAttrib->pszPDRegRegion != IMG_NULL) { pszRegString = psMMUAttrib->pszPDRegRegion; @@ -699,14 +724,18 @@ PVRSRV_ERROR PDumpPDRegWithFlags(PDUMP_MMU_ATTRIB *psMMUAttrib, Write to the MMU script stream indicating the physical page directory */ #if defined(SGX_FEATURE_36BIT_MMU) + sDevPAddr.uiAddr = ((ui32Data & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PDEAlignShift); + eErr = PDumpOSBufprintf(hScript, ui32MaxLen, - "WRW :%s:$1 :%s:PA_%08X%08X:0x0\r\n", + "WRW :%s:$1 :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X\r\n", psMMUAttrib->sDevId.pszPDumpDevName, psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)hUniqueTag, - (ui32Data & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PDEAlignShift); + (IMG_UINTPTR_T)hUniqueTag, + sDevPAddr.uiAddr, + ui32Data & ~psMMUAttrib->ui32PDEMask); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); @@ -715,6 +744,7 @@ PVRSRV_ERROR PDumpPDRegWithFlags(PDUMP_MMU_ATTRIB *psMMUAttrib, psMMUAttrib->sDevId.pszPDumpDevName); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); @@ -725,25 +755,31 @@ PVRSRV_ERROR PDumpPDRegWithFlags(PDUMP_MMU_ATTRIB *psMMUAttrib, psMMUAttrib->sDevId.pszPDumpDevName); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); #else + sDevPAddr.uiAddr = ((ui32Data & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PDEAlignShift); + eErr = PDumpOSBufprintf(hScript, ui32MaxLen, - "WRW :%s:0x%08X :%s:PA_%08X%08X:0x%08X\r\n", + "WRW :%s:0x%08X :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X\r\n", pszRegString, ui32Reg, psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, - (ui32Data & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PDEAlignShift, + (IMG_UINTPTR_T)hUniqueTag, + sDevPAddr.uiAddr, ui32Data & ~psMMUAttrib->ui32PDEMask); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); #endif + + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -800,14 +836,10 @@ PVRSRV_ERROR PDumpMemPolKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo, PDUMP_GET_SCRIPT_STRING(); + PDUMP_LOCK(); if (PDumpOSIsSuspended()) { - return PVRSRV_OK; - } - - if ( _PDumpIsPersistent() ) - { - /* Don't pdump-poll if the process is persistent */ + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -831,6 +863,7 @@ PVRSRV_ERROR PDumpMemPolKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo, MEMPOLL_DELAY); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); @@ -864,11 +897,11 @@ PVRSRV_ERROR PDumpMemPolKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo, eErr = PDumpOSBufprintf(hScript, ui32MaxLen, - "POL :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %d %d %d\r\n", + "POL :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X 0x%08X 0x%08X %d %d %d\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, + (IMG_UINTPTR_T)hUniqueTag, sDevPAddr.uiAddr & ~(psMMUAttrib->ui32DataPageMask), - sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask), + (unsigned int)(sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask)), ui32Value, ui32Mask, eOperator, @@ -876,10 +909,12 @@ PVRSRV_ERROR PDumpMemPolKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo, MEMPOLL_DELAY); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -913,12 +948,13 @@ static PVRSRV_ERROR _PDumpMemIntKM(IMG_PVOID pvAltLinAddr, IMG_UINT32 ui32ParamOutPos; PDUMP_MMU_ATTRIB *psMMUAttrib; IMG_UINT32 ui32DataPageSize; - PDUMP_GET_SCRIPT_AND_FILE_STRING(); - + + PDUMP_LOCK(); /* PRQA S 3415 1 */ /* side effects desired */ if (ui32Bytes == 0 || PDumpOSIsSuspended()) { + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -931,24 +967,10 @@ static PVRSRV_ERROR _PDumpMemIntKM(IMG_PVOID pvAltLinAddr, if (!PDumpOSJTInitialised()) { + PDUMP_UNLOCK(); return PVRSRV_ERROR_PDUMP_NOT_AVAILABLE; } -#if defined(SUPPORT_PDUMP_MULTI_PROCESS) - /* if we're dumping a shared heap, need to ensure phys allocation - * is initialised even if this app isn't the one marked for pdumping - */ - { - BM_HEAP *pHeap = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap; - PVRSRV_DEVICE_NODE *psDeviceNode = pHeap->pBMContext->psDeviceNode; - - if( psDeviceNode->pfnMMUIsHeapShared(pHeap->pMMUHeap) ) - { - ui32Flags |= PDUMP_FLAGS_PERSISTENT; - } - } -#endif - /* setup memory addresses */ if(pvAltLinAddr) { @@ -979,6 +1001,7 @@ static PVRSRV_ERROR _PDumpMemIntKM(IMG_PVOID pvAltLinAddr, ui32Bytes, ui32Flags)) { + PDUMP_UNLOCK(); return PVRSRV_ERROR_PDUMP_BUFFER_FULL; } @@ -992,6 +1015,7 @@ static PVRSRV_ERROR _PDumpMemIntKM(IMG_PVOID pvAltLinAddr, } if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } @@ -1000,9 +1024,9 @@ static PVRSRV_ERROR _PDumpMemIntKM(IMG_PVOID pvAltLinAddr, */ eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, - "-- LDB :%s:VA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n", + "-- LDB :%s:VA_" UINTPTR_FMT "%08X:0x%08X 0x%08X 0x%08X %s\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, + (IMG_UINTPTR_T)hUniqueTag, psMemInfo->sDevVAddr.uiAddr, ui32Offset, ui32Bytes, @@ -1010,6 +1034,7 @@ static PVRSRV_ERROR _PDumpMemIntKM(IMG_PVOID pvAltLinAddr, pszFileName); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); @@ -1059,16 +1084,17 @@ static PVRSRV_ERROR _PDumpMemIntKM(IMG_PVOID pvAltLinAddr, eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, - "LDB :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n", + "LDB :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X 0x%08X 0x%08X %s\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, + (IMG_UINTPTR_T)hUniqueTag, sDevPAddr.uiAddr & ~(psMMUAttrib->ui32DataPageMask), - sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask), + (unsigned int)(sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask)), ui32BlockBytes, ui32ParamOutPos, pszFileName); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); @@ -1092,6 +1118,7 @@ static PVRSRV_ERROR _PDumpMemIntKM(IMG_PVOID pvAltLinAddr, ui32ParamOutPos += ui32BlockBytes; } + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -1191,26 +1218,35 @@ PVRSRV_ERROR PDumpMemPTEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib, IMG_UINT32 ui32BlockBytes; IMG_UINT8* pui8LinAddr; IMG_DEV_PHYADDR sDevPAddr; + IMG_DEV_PHYADDR sDevPAddrTmp; IMG_CPU_PHYADDR sCpuPAddr; IMG_UINT32 ui32Offset; IMG_UINT32 ui32ParamOutPos; IMG_UINT32 ui32PageMask; /* mask for the physical page backing the PT */ +#if !defined(SGX_FEATURE_36BIT_MMU) + IMG_DEV_PHYADDR sDevPAddrTmp2; +#endif PDUMP_GET_SCRIPT_AND_FILE_STRING(); - ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0; + + PDUMP_LOCK(); + if (PDumpOSIsSuspended()) { + PDUMP_UNLOCK(); return PVRSRV_OK; } if (!PDumpOSJTInitialised()) { + PDUMP_UNLOCK(); return PVRSRV_ERROR_PDUMP_NOT_AVAILABLE; } if (!pvLinAddr) { + PDUMP_UNLOCK(); return PVRSRV_ERROR_INVALID_PARAMS; } @@ -1229,6 +1265,7 @@ PVRSRV_ERROR PDumpMemPTEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib, ui32Bytes, ui32Flags | PDUMP_FLAGS_CONTINUOUS)) { + PDUMP_UNLOCK(); return PVRSRV_ERROR_PDUMP_BUFFER_FULL; } @@ -1242,6 +1279,7 @@ PVRSRV_ERROR PDumpMemPTEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib, } if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } } @@ -1295,16 +1333,17 @@ PVRSRV_ERROR PDumpMemPTEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib, { eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, - "LDB :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n", + "LDB :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X 0x%08X 0x%08X %s\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1, + (IMG_UINTPTR_T)hUniqueTag1, sDevPAddr.uiAddr & ~ui32PageMask, - sDevPAddr.uiAddr & ui32PageMask, + (unsigned int)(sDevPAddr.uiAddr & ui32PageMask), ui32BlockBytes, ui32ParamOutPos, pszFileName); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); @@ -1319,15 +1358,18 @@ PVRSRV_ERROR PDumpMemPTEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib, { /* PT entry points to non-null page */ #if defined(SGX_FEATURE_36BIT_MMU) + sDevPAddrTmp.uiAddr = ((ui32PTE & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PTEAlignShift); + eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, - "WRW :%s:$1 :%s:PA_%08X%08X:0x0\r\n", + "WRW :%s:$1 :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x0\r\n", psMMUAttrib->sDevId.pszPDumpDevName, psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)hUniqueTag2, - (ui32PTE & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PTEAlignShift); + (IMG_UINTPTR_T)hUniqueTag2, + sDevPAddrTmp.uiAddr); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); @@ -1336,6 +1378,7 @@ PVRSRV_ERROR PDumpMemPTEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib, psMMUAttrib->sDevId.pszPDumpDevName); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); @@ -1345,36 +1388,44 @@ PVRSRV_ERROR PDumpMemPTEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib, ui32PTE & ~psMMUAttrib->ui32PDEMask); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); + sDevPAddrTmp.uiAddr = (sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask; + eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, - "WRW :%s:PA_%08X%08X:0x%08X :%s:$1\r\n", + "WRW :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X :%s:$1\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)hUniqueTag1, - (sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask, - (sDevPAddr.uiAddr + ui32Offset) & ui32PageMask, + (IMG_UINTPTR_T)hUniqueTag1, + sDevPAddrTmp.uiAddr, + (unsigned int)((sDevPAddr.uiAddr + ui32Offset) & ui32PageMask), psMMUAttrib->sDevId.pszPDumpDevName); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); #else + sDevPAddrTmp.uiAddr = (sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask; + sDevPAddrTmp2.uiAddr = (ui32PTE & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PTEAlignShift; + eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, - "WRW :%s:PA_%08X%08X:0x%08X :%s:PA_%08X%08X:0x%08X\r\n", + "WRW :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1, - (sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask, - (sDevPAddr.uiAddr + ui32Offset) & ui32PageMask, + (IMG_UINTPTR_T)hUniqueTag1, + sDevPAddrTmp.uiAddr, + (unsigned int)((sDevPAddr.uiAddr + ui32Offset) & ui32PageMask), psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag2, - (ui32PTE & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PTEAlignShift, - ui32PTE & ~psMMUAttrib->ui32PDEMask); + (IMG_UINTPTR_T)hUniqueTag2, + sDevPAddrTmp2.uiAddr, + (unsigned int)(ui32PTE & ~psMMUAttrib->ui32PDEMask)); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); @@ -1385,17 +1436,20 @@ PVRSRV_ERROR PDumpMemPTEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib, #if !defined(FIX_HW_BRN_31620) PVR_ASSERT((ui32PTE & psMMUAttrib->ui32PTEValid) == 0UL); #endif + sDevPAddrTmp.uiAddr = (sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask; + eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, - "WRW :%s:PA_%08X%08X:0x%08X 0x%08X%08X\r\n", + "WRW :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X 0x%08X" UINTPTR_FMT "\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1, - (sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask, - (sDevPAddr.uiAddr + ui32Offset) & ui32PageMask, - (ui32PTE << psMMUAttrib->ui32PTEAlignShift), - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag2); + (IMG_UINTPTR_T)hUniqueTag1, + sDevPAddrTmp.uiAddr, + (unsigned int)((sDevPAddr.uiAddr + ui32Offset) & ui32PageMask), + ui32PTE << psMMUAttrib->ui32PTEAlignShift, + (IMG_UINTPTR_T)hUniqueTag2); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); @@ -1415,6 +1469,7 @@ PVRSRV_ERROR PDumpMemPTEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib, ui32ParamOutPos += ui32BlockBytes; } + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -1433,11 +1488,14 @@ PVRSRV_ERROR PDumpPDDevPAddrKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo, IMG_UINT32 ui32ParamOutPos; PDUMP_MMU_ATTRIB *psMMUAttrib; IMG_UINT32 ui32PageMask; /* mask for the physical page backing the PT */ + IMG_DEV_PHYADDR sDevPAddrTmp; PDUMP_GET_SCRIPT_AND_FILE_STRING(); + PDUMP_LOCK(); if (!PDumpOSJTInitialised()) { + PDUMP_UNLOCK(); return PVRSRV_ERROR_PDUMP_NOT_AVAILABLE; } @@ -1452,6 +1510,7 @@ PVRSRV_ERROR PDumpPDDevPAddrKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo, sizeof(IMG_DEV_PHYADDR), ui32Flags)) { + PDUMP_UNLOCK(); return PVRSRV_ERROR_PDUMP_BUFFER_FULL; } @@ -1465,24 +1524,28 @@ PVRSRV_ERROR PDumpPDDevPAddrKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo, } if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } /* Write a comment indicating the PD phys addr write, so that the offsets * into the param stream increase in correspondence with the number of bytes * written. */ + sDevPAddrTmp.uiAddr = sPDDevPAddr.uiAddr & ~ui32PageMask; + eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, - "-- LDB :%s:PA_0x%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n", + "-- LDB :%s:PA_0x" UINTPTR_FMT DEVPADDR_FMT ":0x%08X 0x%08" SIZE_T_FMT_LEN "X 0x%08X %s\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1, - sPDDevPAddr.uiAddr & ~ui32PageMask, - sPDDevPAddr.uiAddr & ui32PageMask, + (IMG_UINTPTR_T)hUniqueTag1, + sDevPAddrTmp.uiAddr, + (unsigned int)(sPDDevPAddr.uiAddr & ui32PageMask), sizeof(IMG_DEV_PHYADDR), ui32ParamOutPos, pszFileName); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); @@ -1496,103 +1559,70 @@ PVRSRV_ERROR PDumpPDDevPAddrKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo, BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr); sDevPAddr.uiAddr += ui32PageByteOffset + ui32Offset; - if ((sPDDevPAddr.uiAddr & psMMUAttrib->ui32PDEMask) != 0UL) - { #if defined(SGX_FEATURE_36BIT_MMU) - eErr = PDumpOSBufprintf(hScript, - ui32MaxLenScript, - "WRW :%s:$1 :%s:PA_%08X%08X:0x0\r\n", - psMMUAttrib->sDevId.pszPDumpDevName, - psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)hUniqueTag2, - sPDDevPAddr.uiAddr); - if(eErr != PVRSRV_OK) - { - return eErr; - } - PDumpOSWriteString2(hScript, ui32Flags); - - eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, "AND :%s:$2 :%s:$1 0xFFFFFFFF\r\n", - psMMUAttrib->sDevId.pszPDumpDevName, - psMMUAttrib->sDevId.pszPDumpDevName); - if(eErr != PVRSRV_OK) - { - return eErr; - } - PDumpOSWriteString2(hScript, ui32Flags); + sDevPAddrTmp.uiAddr = sPDDevPAddr.uiAddr & ~ui32PageMask; - eErr = PDumpOSBufprintf(hScript, + eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, - "WRW :%s:PA_%08X%08X:0x%08X :%s:$2\r\n", + "WRW :%s:$1 :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)hUniqueTag1, - (sDevPAddr.uiAddr) & ~(psMMUAttrib->ui32DataPageMask), - (sDevPAddr.uiAddr) & (psMMUAttrib->ui32DataPageMask), - psMMUAttrib->sDevId.pszPDumpDevName); - if(eErr != PVRSRV_OK) - { - return eErr; - } - PDumpOSWriteString2(hScript, ui32Flags); + psMMUAttrib->sDevId.pszPDumpDevName, + (IMG_UINTPTR_T)hUniqueTag2, + sDevPAddrTmp.uiAddr, + (unsigned int)(sPDDevPAddr.uiAddr & ui32PageMask)); + if(eErr != PVRSRV_OK) + { + PDUMP_UNLOCK(); + return eErr; + } + PDumpOSWriteString2(hScript, ui32Flags); - eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, "SHR :%s:$2 :%s:$1 0x20\r\n", + eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, "SHR :%s:$1 :%s:$1 0x4\r\n", psMMUAttrib->sDevId.pszPDumpDevName, psMMUAttrib->sDevId.pszPDumpDevName); - if(eErr != PVRSRV_OK) - { - return eErr; - } - PDumpOSWriteString2(hScript, ui32Flags); + if(eErr != PVRSRV_OK) + { + PDUMP_UNLOCK(); + return eErr; + } - eErr = PDumpOSBufprintf(hScript, + PDumpOSWriteString2(hScript, ui32Flags); + sDevPAddrTmp.uiAddr = sDevPAddr.uiAddr & ~(psMMUAttrib->ui32DataPageMask); + + eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, - "WRW :%s:PA_%08X%08X:0x%08X :%s:$2\r\n", + "WRW :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X :%s:$1\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)hUniqueTag1, - (sDevPAddr.uiAddr + 4) & ~(psMMUAttrib->ui32DataPageMask), - (sDevPAddr.uiAddr + 4) & (psMMUAttrib->ui32DataPageMask), + (IMG_UINTPTR_T)hUniqueTag1, + sDevPAddrTmp.uiAddr, + (unsigned int)((sDevPAddr.uiAddr) & (psMMUAttrib->ui32DataPageMask)), psMMUAttrib->sDevId.pszPDumpDevName); - if(eErr != PVRSRV_OK) - { - return eErr; - } - PDumpOSWriteString2(hScript, ui32Flags); -#else - eErr = PDumpOSBufprintf(hScript, - ui32MaxLenScript, - "WRW :%s:PA_%08X%08X:0x%08X :%s:PA_%08X%08X:0x%08X\r\n", - psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1, - sDevPAddr.uiAddr & ~ui32PageMask, - sDevPAddr.uiAddr & ui32PageMask, - psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag2, - sPDDevPAddr.uiAddr & psMMUAttrib->ui32PDEMask, - sPDDevPAddr.uiAddr & ~psMMUAttrib->ui32PDEMask); - if(eErr != PVRSRV_OK) - { - return eErr; - } -#endif + if(eErr != PVRSRV_OK) + { + PDUMP_UNLOCK(); + return eErr; } - else +#else + eErr = PDumpOSBufprintf(hScript, + ui32MaxLenScript, + "WRW :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X \r\n", + psMMUAttrib->sDevId.pszPDumpDevName, + (IMG_UINTPTR_T)hUniqueTag1, + sDevPAddr.uiAddr & ~ui32PageMask, + (unsigned int)(sDevPAddr.uiAddr & ui32PageMask), + psMMUAttrib->sDevId.pszPDumpDevName, + (IMG_UINTPTR_T)hUniqueTag2, + sPDDevPAddr.uiAddr & psMMUAttrib->ui32PDEMask, + (unsigned int)(sPDDevPAddr.uiAddr & ~psMMUAttrib->ui32PDEMask)); + if(eErr != PVRSRV_OK) { - PVR_ASSERT(!(sDevPAddr.uiAddr & psMMUAttrib->ui32PTEValid)); - eErr = PDumpOSBufprintf(hScript, - ui32MaxLenScript, - "WRW :%s:PA_%08X%08X:0x%08X 0x%08X\r\n", - psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1, - sDevPAddr.uiAddr & ~ui32PageMask, - sDevPAddr.uiAddr & ui32PageMask, - sPDDevPAddr.uiAddr); - if(eErr != PVRSRV_OK) - { - return eErr; - } + PDUMP_UNLOCK(); + return eErr; } +#endif PDumpOSWriteString2(hScript, ui32Flags); + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -1612,13 +1642,10 @@ PVRSRV_ERROR PDumpCommentKM(IMG_CHAR *pszComment, IMG_UINT32 ui32Flags) #endif IMG_UINT32 ui32LenCommentPrefix; PDUMP_GET_SCRIPT_STRING(); + + PDUMP_LOCK(); PDUMP_DBG(("PDumpCommentKM")); -#if defined(PDUMP_DEBUG_OUTFILES) - /* include comments in the "extended" init phase. - * default is to ignore them. - */ - ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0; -#endif + /* Put \r \n sequence at the end if it isn't already there */ PDumpOSVerifyLineEnding(pszComment, ui32MaxLen); @@ -1637,23 +1664,27 @@ PVRSRV_ERROR PDumpCommentKM(IMG_CHAR *pszComment, IMG_UINT32 ui32Flags) { PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %d: %s (continuous set)", g_ui32EveryLineCounter, pszComment)); + PDUMP_UNLOCK(); return PVRSRV_ERROR_PDUMP_BUFFER_FULL; } else if(ui32Flags & PDUMP_FLAGS_PERSISTENT) { PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %d: %s (persistent set)", g_ui32EveryLineCounter, pszComment)); + PDUMP_UNLOCK(); return PVRSRV_ERROR_CMD_NOT_PROCESSED; } else { PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %d: %s", g_ui32EveryLineCounter, pszComment)); + PDUMP_UNLOCK(); return PVRSRV_ERROR_CMD_NOT_PROCESSED; } #else PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %s", pszComment)); + PDUMP_UNLOCK(); return PVRSRV_ERROR_CMD_NOT_PROCESSED; #endif } @@ -1675,9 +1706,12 @@ PVRSRV_ERROR PDumpCommentKM(IMG_CHAR *pszComment, IMG_UINT32 ui32Flags) if( (eErr != PVRSRV_OK) && (eErr != PVRSRV_ERROR_PDUMP_BUF_OVERFLOW)) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); + + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -1696,6 +1730,7 @@ PVRSRV_ERROR PDumpCommentWithFlags(IMG_UINT32 ui32Flags, IMG_CHAR * pszFormat, . PDUMP_va_list ap; PDUMP_GET_MSG_STRING(); + PDUMP_LOCK_MSG(); /* Construct the string */ PDUMP_va_start(ap, pszFormat); eErr = PDumpOSVSprintf(pszMsg, ui32MaxLen, pszFormat, ap); @@ -1703,9 +1738,12 @@ PVRSRV_ERROR PDumpCommentWithFlags(IMG_UINT32 ui32Flags, IMG_CHAR * pszFormat, . if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK_MSG(); return eErr; } - return PDumpCommentKM(pszMsg, ui32Flags); + eErr = PDumpCommentKM(pszMsg, ui32Flags); + PDUMP_UNLOCK_MSG(); + return eErr; } /************************************************************************** @@ -1723,6 +1761,7 @@ PVRSRV_ERROR PDumpComment(IMG_CHAR *pszFormat, ...) PDUMP_va_list ap; PDUMP_GET_MSG_STRING(); + PDUMP_LOCK_MSG(); /* Construct the string */ PDUMP_va_start(ap, pszFormat); eErr = PDumpOSVSprintf(pszMsg, ui32MaxLen, pszFormat, ap); @@ -1730,9 +1769,12 @@ PVRSRV_ERROR PDumpComment(IMG_CHAR *pszFormat, ...) if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK_MSG(); return eErr; } - return PDumpCommentKM(pszMsg, PDUMP_FLAGS_CONTINUOUS); + eErr = PDumpCommentKM(pszMsg, PDUMP_FLAGS_CONTINUOUS); + PDUMP_UNLOCK_MSG(); + return eErr; } /************************************************************************** @@ -1748,10 +1790,12 @@ PVRSRV_ERROR PDumpDriverInfoKM(IMG_CHAR *pszString, IMG_UINT32 ui32Flags) IMG_UINT32 ui32MsgLen; PDUMP_GET_MSG_STRING(); + PDUMP_LOCK_MSG(); /* Construct the string */ eErr = PDumpOSSprintf(pszMsg, ui32MaxLen, "%s", pszString); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK_MSG(); return eErr; } @@ -1766,13 +1810,17 @@ PVRSRV_ERROR PDumpDriverInfoKM(IMG_CHAR *pszString, IMG_UINT32 ui32Flags) { if (ui32Flags & PDUMP_FLAGS_CONTINUOUS) { + PDUMP_UNLOCK_MSG(); return PVRSRV_ERROR_PDUMP_BUFFER_FULL; } else { + PDUMP_UNLOCK_MSG(); return PVRSRV_ERROR_CMD_NOT_PROCESSED; } } + + PDUMP_UNLOCK_MSG(); return PVRSRV_OK; } @@ -1818,13 +1866,9 @@ PVRSRV_ERROR PDumpBitmapKM( PVRSRV_DEVICE_NODE *psDeviceNode, PVRSRV_ERROR eErr; PDUMP_GET_SCRIPT_STRING(); - if ( _PDumpIsPersistent() ) - { - return PVRSRV_OK; - } - PDumpCommentWithFlags(ui32PDumpFlags, "\r\n-- Dump bitmap of render\r\n"); + PDUMP_LOCK(); /* find MMU context ID */ ui32MMUContextID = psDeviceNode->pfnMMUGetContextID( hDevMemContext ); @@ -1845,10 +1889,13 @@ PVRSRV_ERROR PDumpBitmapKM( PVRSRV_DEVICE_NODE *psDeviceNode, eMemFormat); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2( hScript, ui32PDumpFlags); + + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -1880,9 +1927,9 @@ PVRSRV_ERROR PDumpReadRegKM ( IMG_CHAR *pszPDumpRegName, { PVRSRV_ERROR eErr; PDUMP_GET_SCRIPT_STRING(); - PVR_UNREFERENCED_PARAMETER(ui32Size); + PDUMP_LOCK(); eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "SAB :%s:0x%08X 0x%08X %s\r\n", @@ -1892,11 +1939,13 @@ PVRSRV_ERROR PDumpReadRegKM ( IMG_CHAR *pszPDumpRegName, pszFileName); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2( hScript, ui32PDumpFlags); + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -1954,6 +2003,7 @@ static PVRSRV_ERROR PDumpSignatureRegister (PVRSRV_DEVICE_IDENTIFIER *psDevId, PDumpOSWriteString2(hScript, ui32Flags); *pui32FileOffset += ui32Size; + return PVRSRV_OK; } @@ -2000,7 +2050,6 @@ PVRSRV_ERROR PDump3DSignatureRegisters(PVRSRV_DEVICE_IDENTIFIER *psDevId, { PVRSRV_ERROR eErr; IMG_UINT32 ui32FileOffset, ui32Flags; - PDUMP_GET_FILE_STRING(); ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0; @@ -2013,6 +2062,12 @@ PVRSRV_ERROR PDump3DSignatureRegisters(PVRSRV_DEVICE_IDENTIFIER *psDevId, return eErr; } + /* + Note: + PDumpCommentWithFlags will take the lock so we defer the lock + taking until here + */ + PDUMP_LOCK(); PDumpRegisterRange(psDevId, pszFileName, pui32Registers, @@ -2021,6 +2076,7 @@ PVRSRV_ERROR PDump3DSignatureRegisters(PVRSRV_DEVICE_IDENTIFIER *psDevId, sizeof(IMG_UINT32), ui32Flags); + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2044,7 +2100,6 @@ PVRSRV_ERROR PDumpTASignatureRegisters (PVRSRV_DEVICE_IDENTIFIER *psDevId, { PVRSRV_ERROR eErr; IMG_UINT32 ui32FileOffset, ui32Flags; - PDUMP_GET_FILE_STRING(); ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0; @@ -2057,6 +2112,12 @@ PVRSRV_ERROR PDumpTASignatureRegisters (PVRSRV_DEVICE_IDENTIFIER *psDevId, return eErr; } + /* + Note: + PDumpCommentWithFlags will take the lock so we defer the lock + taking until here + */ + PDUMP_LOCK(); PDumpRegisterRange(psDevId, pszFileName, pui32Registers, @@ -2064,6 +2125,7 @@ PVRSRV_ERROR PDumpTASignatureRegisters (PVRSRV_DEVICE_IDENTIFIER *psDevId, &ui32FileOffset, sizeof(IMG_UINT32), ui32Flags); + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2085,7 +2147,6 @@ PVRSRV_ERROR PDumpCounterRegisters (PVRSRV_DEVICE_IDENTIFIER *psDevId, { PVRSRV_ERROR eErr; IMG_UINT32 ui32FileOffset, ui32Flags; - PDUMP_GET_FILE_STRING(); ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0UL; @@ -2097,7 +2158,12 @@ PVRSRV_ERROR PDumpCounterRegisters (PVRSRV_DEVICE_IDENTIFIER *psDevId, { return eErr; } - + /* + Note: + PDumpCommentWithFlags will take the lock so we defer the lock + taking until here + */ + PDUMP_LOCK(); PDumpRegisterRange(psDevId, pszFileName, pui32Registers, @@ -2106,6 +2172,7 @@ PVRSRV_ERROR PDumpCounterRegisters (PVRSRV_DEVICE_IDENTIFIER *psDevId, sizeof(IMG_UINT32), ui32Flags); + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2124,14 +2191,18 @@ PVRSRV_ERROR PDumpRegRead(IMG_CHAR *pszPDumpRegName, PVRSRV_ERROR eErr; PDUMP_GET_SCRIPT_STRING(); + PDUMP_LOCK(); eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "RDW :%s:0x%X\r\n", pszPDumpRegName, ui32RegOffset); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); + + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2156,7 +2227,8 @@ PVRSRV_ERROR PDumpSaveMemKM (PVRSRV_DEVICE_IDENTIFIER *psDevId, { PVRSRV_ERROR eErr; PDUMP_GET_SCRIPT_STRING(); - + + PDUMP_LOCK(); eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "SAB :%s:v%x:0x%08X 0x%08X 0x%08X %s.bin\r\n", @@ -2168,10 +2240,13 @@ PVRSRV_ERROR PDumpSaveMemKM (PVRSRV_DEVICE_IDENTIFIER *psDevId, pszFileName); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32PDumpFlags); + + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2189,14 +2264,18 @@ PVRSRV_ERROR PDumpCycleCountRegRead(PVRSRV_DEVICE_IDENTIFIER *psDevId, PVRSRV_ERROR eErr; PDUMP_GET_SCRIPT_STRING(); + PDUMP_LOCK(); eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "RDW :%s:0x%X\r\n", psDevId->pszPDumpRegName, ui32RegOffset); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0); + + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2286,9 +2365,9 @@ PVRSRV_ERROR PDumpCBP(PPVRSRV_KERNEL_MEM_INFO psROffMemInfo, IMG_DEV_VIRTADDR sDevVPageAddr; //IMG_CPU_PHYADDR CpuPAddr; PDUMP_MMU_ATTRIB *psMMUAttrib; - PDUMP_GET_SCRIPT_STRING(); + PDUMP_LOCK(); psMMUAttrib = ((BM_BUF*)psROffMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->psMMUAttrib; /* Check the offset and size don't exceed the bounds of the allocation */ @@ -2324,19 +2403,22 @@ PVRSRV_ERROR PDumpCBP(PPVRSRV_KERNEL_MEM_INFO psROffMemInfo, eErr = PDumpOSBufprintf(hScript, ui32MaxLen, - "CBP :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X 0x%08X\r\n", + "CBP :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X 0x%08X 0x%08X 0x%08X\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, + (IMG_UINTPTR_T)hUniqueTag, sDevPAddr.uiAddr & ~(psMMUAttrib->ui32DataPageMask), - sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask), + (unsigned int)(sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask)), ui32WPosVal, ui32PacketSize, ui32BufferSize); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); + + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2352,14 +2434,19 @@ PVRSRV_ERROR PDumpIDLWithFlags(IMG_UINT32 ui32Clocks, IMG_UINT32 ui32Flags) { PVRSRV_ERROR eErr; PDUMP_GET_SCRIPT_STRING(); + + PDUMP_LOCK(); PDUMP_DBG(("PDumpIDLWithFlags")); eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "IDL %u\r\n", ui32Clocks); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, ui32Flags); + + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2617,10 +2704,13 @@ PVRSRV_ERROR PDumpSetMMUContext(PVRSRV_DEVICE_TYPE eDeviceType, PVRSRV_ERROR eErr; PDUMP_GET_SCRIPT_STRING(); + PDUMP_LOCK(); + eErr = _PdumpAllocMMUContext(&ui32MMUContextID); if(eErr != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PDumpSetMMUContext: _PdumpAllocMMUContext failed: %d", eErr)); + PDUMP_UNLOCK(); return eErr; } @@ -2633,15 +2723,16 @@ PVRSRV_ERROR PDumpSetMMUContext(PVRSRV_DEVICE_TYPE eDeviceType, eErr = PDumpOSBufprintf(hScript, ui32MaxLen, - "MMU :%s:v%d %d :%s:PA_%08X%08X\r\n", + "MMU :%s:v%d %d :%s:PA_" UINTPTR_FMT DEVPADDR_FMT "\r\n", pszMemSpace, ui32MMUContextID, ui32MMUType, pszMemSpace, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1, + (IMG_UINTPTR_T)hUniqueTag1, sDevPAddr.uiAddr); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } PDumpOSWriteString2(hScript, PDUMP_FLAGS_CONTINUOUS); @@ -2649,6 +2740,7 @@ PVRSRV_ERROR PDumpSetMMUContext(PVRSRV_DEVICE_TYPE eDeviceType, /* return the MMU Context ID */ *pui32MMUContextID = ui32MMUContextID; + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2674,6 +2766,12 @@ PVRSRV_ERROR PDumpClearMMUContext(PVRSRV_DEVICE_TYPE eDeviceType, * all OSes and platforms */ PDumpComment("Clear MMU Context for memory space %s\r\n", pszMemSpace); + + /* + Note: + PDumpComment takes the lock so we can't take it until here + */ + PDUMP_LOCK(); eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "MMU :%s:v%d\r\n", @@ -2681,17 +2779,21 @@ PVRSRV_ERROR PDumpClearMMUContext(PVRSRV_DEVICE_TYPE eDeviceType, ui32MMUContextID); if(eErr != PVRSRV_OK) { + PDUMP_UNLOCK(); return eErr; } + PDumpOSWriteString2(hScript, PDUMP_FLAGS_CONTINUOUS); eErr = _PdumpFreeMMUContext(ui32MMUContextID); if(eErr != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, "PDumpClearMMUContext: _PdumpFreeMMUContext failed: %d", eErr)); + PDUMP_UNLOCK(); return eErr; } + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2719,6 +2821,7 @@ PVRSRV_ERROR PDumpStoreMemToFile(PDUMP_MMU_ATTRIB *psMMUAttrib, PDUMP_GET_SCRIPT_STRING(); + PDUMP_LOCK(); /* query the buffer manager for the physical pages that back the virtual address @@ -2736,17 +2839,18 @@ PVRSRV_ERROR PDumpStoreMemToFile(PDUMP_MMU_ATTRIB *psMMUAttrib, PDumpOSBufprintf(hScript, ui32MaxLen, - "SAB :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n", + "SAB :%s:PA_" UINTPTR_FMT DEVPADDR_FMT ":0x%08X 0x%08X 0x%08X %s\r\n", psMMUAttrib->sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, - sDevPAddr.uiAddr & ~psMMUAttrib->ui32DataPageMask, - sDevPAddr.uiAddr & psMMUAttrib->ui32DataPageMask, + (IMG_UINTPTR_T)hUniqueTag, + (sDevPAddr.uiAddr & ~psMMUAttrib->ui32DataPageMask), + (unsigned int)(sDevPAddr.uiAddr & psMMUAttrib->ui32DataPageMask), ui32Size, ui32FileOffset, pszFileName); PDumpOSWriteString2(hScript, ui32PDumpFlags); + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2768,6 +2872,8 @@ PVRSRV_ERROR PDumpRegBasedCBP(IMG_CHAR *pszPDumpRegName, { PDUMP_GET_SCRIPT_STRING(); + PDUMP_LOCK(); + PDumpOSBufprintf(hScript, ui32MaxLen, "CBP :%s:0x%08X 0x%08X 0x%08X 0x%08X\r\n", @@ -2777,7 +2883,8 @@ PVRSRV_ERROR PDumpRegBasedCBP(IMG_CHAR *pszPDumpRegName, ui32PacketSize, ui32BufferSize); PDumpOSWriteString2(hScript, ui32Flags); - + + PDUMP_UNLOCK(); return PVRSRV_OK; } @@ -2843,7 +2950,7 @@ IMG_UINT32 DbgWrite(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BC /* Return if process is not marked for pdumping, unless it's persistent. */ if ( (_PDumpIsProcessActive() == IMG_FALSE ) && - ((ui32Flags & PDUMP_FLAGS_PERSISTENT) == 0) ) + ((ui32Flags & PDUMP_FLAGS_PERSISTENT) == 0) && psCtrl->bInitPhaseComplete) { return ui32BCount; } @@ -2867,6 +2974,7 @@ IMG_UINT32 DbgWrite(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BC if (ui32BytesWritten == 0) { + PVR_DPF((PVR_DBG_ERROR, "DbgWrite: Failed to send persistent data")); PDumpOSReleaseExecution(); } @@ -2893,7 +3001,8 @@ IMG_UINT32 DbgWrite(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BC while (((IMG_UINT32) ui32BCount > 0) && (ui32BytesWritten != 0xFFFFFFFFU)) { - if ((ui32Flags & PDUMP_FLAGS_CONTINUOUS) != 0) + /* If we're in the init phase we treat persisent as meaning continuous */ + if (((ui32Flags & PDUMP_FLAGS_CONTINUOUS) != 0) || ((ui32Flags & PDUMP_FLAGS_PERSISTENT) != 0)) { /* If pdump client (or its equivalent) isn't running then throw continuous data away. @@ -2942,6 +3051,10 @@ IMG_UINT32 DbgWrite(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BC */ if (ui32BytesWritten == 0) { + if (ui32Flags & PDUMP_FLAGS_CONTINUOUS) + { + PVR_DPF((PVR_DBG_ERROR, "Buffer is full during writing of %s", &pui8Data[ui32Off])); + } PDumpOSReleaseExecution(); } @@ -2950,7 +3063,13 @@ IMG_UINT32 DbgWrite(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BC ui32Off += ui32BytesWritten; ui32BCount -= ui32BytesWritten; } - + else + { + if (ui32Flags & PDUMP_FLAGS_CONTINUOUS) + { + PVR_DPF((PVR_DBG_ERROR, "Error during writing of %s", &pui8Data[ui32Off])); + } + } /* loop exits when i) all data is written, or ii) an unrecoverable error occurs */ } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/pvrsrv.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/pvrsrv.c index ecad67d..ea1fcaf 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/pvrsrv.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/pvrsrv.c @@ -48,13 +48,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "pdump_km.h" #include "deviceid.h" #include "ra.h" -#if defined(__linux__) -#include "sysfs.h" -#endif #if defined(TTRACE) #include "ttrace.h" #endif #include "perfkm.h" +#include "devicemem.h" #include "pvrversion.h" @@ -64,7 +62,8 @@ IMG_UINT32 g_ui32InitFlags; /* mark which parts of Services were initialised */ #define INIT_DATA_ENABLE_PDUMPINIT 0x1U -#define INIT_DATA_ENABLE_TTARCE 0x2U +#define INIT_DATA_ENABLE_TTRACE 0x2U +#define INIT_DATA_ENABLE_DEVMEM 0x4U /*! ****************************************************************************** @@ -157,7 +156,37 @@ PVRSRV_ERROR FreeDeviceID(SYS_DATA *psSysData, IMG_UINT32 ui32DevID) return PVRSRV_ERROR_INVALID_DEVICEID; } +/*! +****************************************************************************** + + @Function PVRSRVCompatCheckKM + + @Description UM/KM ddk branch Compatibility check function + + @input psUserModeDDKDetails: User mode DDK version + + @output In case of incompatibility, returns PVRSRV_ERROR_DDK_VERSION_MISMATCH + @Return PVRSRV_ERROR + +******************************************************************************/ +IMG_VOID IMG_CALLCONV PVRSRVCompatCheckKM(PVRSRV_BRIDGE_IN_COMPAT_CHECK *psUserModeDDKDetails, PVRSRV_BRIDGE_RETURN *psRetOUT) +{ + + if(psUserModeDDKDetails->ui32DDKVersion != ((PVRVERSION_MAJ << 16) | (PVRVERSION_MIN << 8)) + || (psUserModeDDKDetails->ui32DDKBuild != PVRVERSION_BUILD)) + { + psRetOUT->eError = PVRSRV_ERROR_DDK_VERSION_MISMATCH; + PVR_DPF((PVR_DBG_ERROR, "(FAIL) UM-KM DDK Mismatch UM-(%d) KM-(%d).", + psUserModeDDKDetails->ui32DDKBuild, PVRVERSION_BUILD)); + } + else + { + psRetOUT->eError = PVRSRV_OK; + PVR_DPF((PVR_DBG_MESSAGE, "UM DDK-(%d) and KM DDK-(%d) match. [ OK ]", + psUserModeDDKDetails->ui32DDKBuild ,PVRVERSION_BUILD)); + } +} /*! ****************************************************************************** @@ -206,8 +235,8 @@ IMG_UINT32 ReadHWReg(IMG_PVOID pvLinRegBaseAddr, IMG_UINT32 ui32Offset) IMG_EXPORT IMG_VOID WriteHWReg(IMG_PVOID pvLinRegBaseAddr, IMG_UINT32 ui32Offset, IMG_UINT32 ui32Value) { - PVR_DPF((PVR_DBG_MESSAGE,"WriteHWReg Base:%x, Offset: %x, Value %x", - (IMG_UINTPTR_T)pvLinRegBaseAddr,ui32Offset,ui32Value)); + PVR_DPF((PVR_DBG_MESSAGE,"WriteHWReg Base:%p, Offset: %x, Value %x", + pvLinRegBaseAddr,ui32Offset,ui32Value)); *(IMG_UINT32*)((IMG_UINTPTR_T)pvLinRegBaseAddr+ui32Offset) = ui32Value; } @@ -365,14 +394,6 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVInit(PSYS_DATA psSysData) { PVRSRV_ERROR eError; -#if defined(__linux__) - eError = PVRSRVCreateSysfsEntry(); - if (eError != PVRSRV_OK) - { - goto Error; - } -#endif - /* Initialise Resource Manager */ eError = ResManInit(); if (eError != PVRSRV_OK) @@ -405,16 +426,16 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVInit(PSYS_DATA psSysData) psSysData->eFailedPowerState = PVRSRV_SYS_POWER_STATE_Unspecified; /* Create an event object */ - if(OSAllocMem( PVRSRV_PAGEABLE_SELECT, + if((eError = OSAllocMem( PVRSRV_PAGEABLE_SELECT, sizeof(PVRSRV_EVENTOBJECT) , (IMG_VOID **)&psSysData->psGlobalEventObject, 0, - "Event Object") != PVRSRV_OK) + "Event Object")) != PVRSRV_OK) { goto Error; } - if(OSEventObjectCreateKM("PVRSRV_GLOBAL_EVENTOBJECT", psSysData->psGlobalEventObject) != PVRSRV_OK) + if((eError = OSEventObjectCreateKM("PVRSRV_GLOBAL_EVENTOBJECT", psSysData->psGlobalEventObject)) != PVRSRV_OK) { goto Error; } @@ -428,12 +449,21 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVInit(PSYS_DATA psSysData) eError = PVRSRVTimeTraceInit(); if (eError != PVRSRV_OK) goto Error; - g_ui32InitFlags |= INIT_DATA_ENABLE_TTARCE; + g_ui32InitFlags |= INIT_DATA_ENABLE_TTRACE; #endif +#if defined(PDUMP) /* Initialise pdump */ PDUMPINIT(); g_ui32InitFlags |= INIT_DATA_ENABLE_PDUMPINIT; +#endif + +#if defined(SUPPORT_ION) + eError = PVRSRVInitDeviceMem(); + if (eError != PVRSRV_OK) + goto Error; + g_ui32InitFlags |= INIT_DATA_ENABLE_DEVMEM; +#endif PERFINIT(); return eError; @@ -471,19 +501,35 @@ IMG_VOID IMG_CALLCONV PVRSRVDeInit(PSYS_DATA psSysData) PERFDEINIT(); + +#if defined(SUPPORT_ION) + if ((g_ui32InitFlags & INIT_DATA_ENABLE_DEVMEM) > 0) + { + PVRSRVDeInitDeviceMem(); + } +#endif + +#if defined(MEM_TRACK_INFO_DEBUG) + /* Free the list of memory operations */ + PVRSRVFreeMemOps(); +#endif + #if defined(TTRACE) /* deinitialise ttrace */ - if ((g_ui32InitFlags & INIT_DATA_ENABLE_TTARCE) > 0) + if ((g_ui32InitFlags & INIT_DATA_ENABLE_TTRACE) > 0) { PVRSRVTimeTraceDeinit(); } #endif + +#if defined(PDUMP) /* deinitialise pdump */ if( (g_ui32InitFlags & INIT_DATA_ENABLE_PDUMPINIT) > 0) { PDUMPDEINIT(); } - +#endif + /* destroy event object */ if(psSysData->psGlobalEventObject) { @@ -1147,11 +1193,7 @@ static PVRSRV_ERROR PVRSRVGetMiscInfoKM_Device_AnyVaCb(PVRSRV_DEVICE_NODE *psDev ******************************************************************************/ IMG_EXPORT -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO_KM *psMiscInfo) -#else PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo) -#endif { SYS_DATA *psSysData; @@ -1337,16 +1379,10 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo) } else { -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo = psMiscInfo->sCacheOpCtl.psKernelMemInfo; - - if(!psMiscInfo->sCacheOpCtl.psKernelMemInfo) -#else PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; PVRSRV_PER_PROCESS_DATA *psPerProc; if(!psMiscInfo->sCacheOpCtl.u.psKernelMemInfo) -#endif { PVR_DPF((PVR_DBG_WARNING, "PVRSRVGetMiscInfoKM: " "Ignoring non-deferred cache op with no meminfo")); @@ -1360,9 +1396,6 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo) "to combine deferred cache ops with immediate ones")); } -#if defined (SUPPORT_SID_INTERFACE) - PVR_DBG_BREAK -#else psPerProc = PVRSRVFindPerProcessData(); if(PVRSRVLookupHandle(psPerProc->psHandleBase, @@ -1374,7 +1407,6 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo) "Can't find kernel meminfo")); return PVRSRV_ERROR_INVALID_PARAMS; } -#endif if(psMiscInfo->sCacheOpCtl.eCacheOpType == PVRSRV_MISC_INFO_CPUCACHEOP_FLUSH) { @@ -1388,12 +1420,15 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo) } else if(psMiscInfo->sCacheOpCtl.eCacheOpType == PVRSRV_MISC_INFO_CPUCACHEOP_CLEAN) { - if(!OSCleanCPUCacheRangeKM(psKernelMemInfo->sMemBlk.hOSMemHandle, - 0, - psMiscInfo->sCacheOpCtl.pvBaseVAddr, - psMiscInfo->sCacheOpCtl.ui32Length)) + if(psMiscInfo->sCacheOpCtl.ui32Length!=0) { - return PVRSRV_ERROR_CACHEOP_FAILED; + if(!OSCleanCPUCacheRangeKM(psKernelMemInfo->sMemBlk.hOSMemHandle, + 0, + psMiscInfo->sCacheOpCtl.pvBaseVAddr, + psMiscInfo->sCacheOpCtl.ui32Length)) + { + return PVRSRV_ERROR_CACHEOP_FAILED; + } } } } @@ -1401,16 +1436,11 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo) if((psMiscInfo->ui32StateRequest & PVRSRV_MISC_INFO_GET_REF_COUNT_PRESENT) != 0UL) { -#if !defined (SUPPORT_SID_INTERFACE) PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; PVRSRV_PER_PROCESS_DATA *psPerProc; -#endif psMiscInfo->ui32StatePresent |= PVRSRV_MISC_INFO_GET_REF_COUNT_PRESENT; -#if defined (SUPPORT_SID_INTERFACE) - PVR_DBG_BREAK -#else psPerProc = PVRSRVFindPerProcessData(); if(PVRSRVLookupHandle(psPerProc->psHandleBase, @@ -1424,7 +1454,6 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo) } psMiscInfo->sGetRefCountCtl.ui32RefCount = psKernelMemInfo->ui32RefCount; -#endif } if ((psMiscInfo->ui32StateRequest & PVRSRV_MISC_INFO_GET_PAGE_SIZE_PRESENT) != 0UL) @@ -1441,11 +1470,13 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVGetMiscInfoKM(PVRSRV_MISC_INFO *psMiscInfo) } #endif /* #if defined(PVRSRV_RESET_ON_HWTIMEOUT) */ +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) if ((psMiscInfo->ui32StateRequest & PVRSRV_MISC_INFO_FORCE_SWAP_TO_SYSTEM_PRESENT) != 0UL) { - PVRSRVSetDCState(DC_STATE_FORCE_SWAP_TO_SYSTEM); + PVRSRVProcessQueues(IMG_TRUE); psMiscInfo->ui32StatePresent |= PVRSRV_MISC_INFO_FORCE_SWAP_TO_SYSTEM_PRESENT; } +#endif /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ return PVRSRV_OK; } @@ -1603,11 +1634,13 @@ IMG_VOID IMG_CALLCONV PVRSRVMISR(IMG_VOID *pvSysData) List_PVRSRV_DEVICE_NODE_ForEach(psSysData->psDeviceNodeList, &PVRSRVMISR_ForEachCb); +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) /* Process the queues. */ if (PVRSRVProcessQueues(IMG_FALSE) == PVRSRV_ERROR_PROCESSING_BLOCKED) { PVRSRVProcessQueues(IMG_FALSE); } +#endif /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ /* signal global event object */ if (psSysData->psGlobalEventObject) @@ -1704,7 +1737,11 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVSaveRestoreLiveSegments(IMG_HANDLE hArena, IMG_P return (PVRSRV_ERROR_OUT_OF_MEMORY); } - PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVSaveRestoreLiveSegments: Base %08x size %08x", sSegDetails.sCpuPhyAddr.uiAddr, sSegDetails.uiSize)); + PVR_DPF(( + PVR_DBG_MESSAGE, + "PVRSRVSaveRestoreLiveSegments: Base " CPUPADDR_FMT " size %" SIZE_T_FMT_LEN "x", + sSegDetails.sCpuPhyAddr.uiAddr, + sSegDetails.uiSize)); /* Map the device's local memory area onto the host. */ pvLocalMemCPUVAddr = OSMapPhysToLin(sSegDetails.sCpuPhyAddr, diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/queue.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/queue.c index 09892e3..cddd6f9 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/queue.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/queue.c @@ -45,15 +45,47 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "lists.h" #include "ttrace.h" +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) +#include <linux/version.h> +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)) +#include <linux/sw_sync.h> +#else +#include <../drivers/staging/android/sw_sync.h> +#endif +static struct sync_fence *AllocQueueFence(struct sw_sync_timeline *psTimeline, IMG_UINT32 ui32FenceValue, const char *szName) +{ + struct sync_fence *psFence = IMG_NULL; + struct sync_pt *psPt; + + psPt = sw_sync_pt_create(psTimeline, ui32FenceValue); + if(psPt) + { + psFence = sync_fence_create(szName, psPt); + if(!psFence) + { + sync_pt_free(psPt); + } + } + + return psFence; +} +#endif /* defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ + /* * The number of commands of each type which can be in flight at once. */ + +#define DC_MAX_SUPPORTED_QUEUES 1 #if defined(SUPPORT_DC_CMDCOMPLETE_WHEN_NO_LONGER_DISPLAYED) -#define DC_NUM_COMMANDS_PER_TYPE 2 +#define DC_NUM_COMMANDS_PER_QUEUE 2 #else -#define DC_NUM_COMMANDS_PER_TYPE 1 +#define DC_NUM_COMMANDS_PER_QUEUE 1 #endif +#define DC_NUM_COMMANDS_PER_TYPE (DC_NUM_COMMANDS_PER_QUEUE * DC_MAX_SUPPORTED_QUEUES) + +static IMG_UINT32 ui32NoOfSwapchainCreated = 0; + /* * List of private command processing function pointer tables and command * complete tables for a device in the system. @@ -87,8 +119,8 @@ void ProcSeqShowQueue(struct seq_file *sfile,void* el) { PVRSRV_QUEUE_INFO *psQueue = (PVRSRV_QUEUE_INFO*)el; IMG_INT cmds = 0; - IMG_SIZE_T ui32ReadOffset; - IMG_SIZE_T ui32WriteOffset; + IMG_SIZE_T uReadOffset; + IMG_SIZE_T uWriteOffset; PVRSRV_COMMAND *psCmd; if(el == PVR_PROC_SEQ_START_TOKEN) @@ -99,16 +131,16 @@ void ProcSeqShowQueue(struct seq_file *sfile,void* el) return; } - ui32ReadOffset = psQueue->ui32ReadOffset; - ui32WriteOffset = psQueue->ui32WriteOffset; + uReadOffset = psQueue->uReadOffset; + uWriteOffset = psQueue->uWriteOffset; - while (ui32ReadOffset != ui32WriteOffset) + while (uReadOffset != uWriteOffset) { - psCmd= (PVRSRV_COMMAND *)((IMG_UINTPTR_T)psQueue->pvLinQueueKM + ui32ReadOffset); + psCmd= (PVRSRV_COMMAND *)((IMG_UINTPTR_T)psQueue->pvLinQueueKM + uReadOffset); - seq_printf(sfile, "%x %x %5u %6u %3u %5u %2u %2u %3u \n", - (IMG_UINTPTR_T)psQueue, - (IMG_UINTPTR_T)psCmd, + seq_printf(sfile, "%p %p %5u %6u %3" SIZE_T_FMT_LEN "u %5u %2u %2u %3" SIZE_T_FMT_LEN "u \n", + psQueue, + psCmd, psCmd->ui32ProcessID, psCmd->CommandType, psCmd->uCmdSize, @@ -133,14 +165,14 @@ void ProcSeqShowQueue(struct seq_file *sfile,void* el) } /* taken from UPDATE_QUEUE_ROFF in queue.h */ - ui32ReadOffset += psCmd->uCmdSize; - ui32ReadOffset &= psQueue->ui32QueueSize - 1; + uReadOffset += psCmd->uCmdSize; + uReadOffset &= psQueue->uQueueSize - 1; cmds++; } if (cmds == 0) { - seq_printf(sfile, "%x <empty>\n", (IMG_UINTPTR_T)psQueue); + seq_printf(sfile, "%p <empty>\n", psQueue); } } @@ -181,15 +213,15 @@ void* ProcSeqOff2ElementQueue(struct seq_file * sfile, loff_t off) * Macro to return space in given command queue */ #define GET_SPACE_IN_CMDQ(psQueue) \ - ((((psQueue)->ui32ReadOffset - (psQueue)->ui32WriteOffset) \ - + ((psQueue)->ui32QueueSize - 1)) & ((psQueue)->ui32QueueSize - 1)) + ((((psQueue)->uReadOffset - (psQueue)->uWriteOffset) \ + + ((psQueue)->uQueueSize - 1)) & ((psQueue)->uQueueSize - 1)) /*! * Macro to Write Offset in given command queue */ -#define UPDATE_QUEUE_WOFF(psQueue, ui32Size) \ - (psQueue)->ui32WriteOffset = ((psQueue)->ui32WriteOffset + (ui32Size)) \ - & ((psQueue)->ui32QueueSize - 1); +#define UPDATE_QUEUE_WOFF(psQueue, uSize) \ + (psQueue)->uWriteOffset = ((psQueue)->uWriteOffset + (uSize)) \ + & ((psQueue)->uQueueSize - 1); /*! * Check if an ops complete value has gone past the pending value. @@ -227,7 +259,7 @@ IMG_UINT32 PVRSRVGetWriteOpsPending(PVRSRV_KERNEL_SYNC_INFO *psSyncInfo, IMG_BOO Note: This needs to be atomic and is provided the kernel driver is single threaded (non-rentrant) */ - ui32WriteOpsPending = psSyncInfo->psSyncData->ui32WriteOpsPending++; + ui32WriteOpsPending = SyncTakeWriteOp(psSyncInfo, SYNC_OP_CLASS_QUEUE); } return ui32WriteOpsPending; @@ -254,7 +286,7 @@ IMG_UINT32 PVRSRVGetReadOpsPending(PVRSRV_KERNEL_SYNC_INFO *psSyncInfo, IMG_BOOL if(bIsReadOp) { - ui32ReadOpsPending = psSyncInfo->psSyncData->ui32ReadOps2Pending++; + ui32ReadOpsPending = SyncTakeReadOp2(psSyncInfo, SYNC_OP_CLASS_QUEUE); } else { @@ -347,21 +379,21 @@ IMG_VOID QueueDumpDebugInfo(IMG_VOID) Kernel-side functions of User->Kernel transitions ******************************************************************************/ -static IMG_SIZE_T NearestPower2(IMG_SIZE_T ui32Value) +static IMG_SIZE_T NearestPower2(IMG_SIZE_T uValue) { - IMG_SIZE_T ui32Temp, ui32Result = 1; + IMG_SIZE_T uTemp, uResult = 1; - if(!ui32Value) + if(!uValue) return 0; - ui32Temp = ui32Value - 1; - while(ui32Temp) + uTemp = uValue - 1; + while(uTemp) { - ui32Result <<= 1; - ui32Temp >>= 1; + uResult <<= 1; + uTemp >>= 1; } - return ui32Result; + return uResult; } @@ -374,7 +406,7 @@ static IMG_SIZE_T NearestPower2(IMG_SIZE_T ui32Value) Creates a new command queue into which render/blt commands etc can be inserted. - @Input ui32QueueSize : + @Input uQueueSize : @Output ppsQueueInfo : @@ -382,15 +414,21 @@ static IMG_SIZE_T NearestPower2(IMG_SIZE_T ui32Value) ******************************************************************************/ IMG_EXPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateCommandQueueKM(IMG_SIZE_T ui32QueueSize, +PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateCommandQueueKM(IMG_SIZE_T uQueueSize, PVRSRV_QUEUE_INFO **ppsQueueInfo) { PVRSRV_QUEUE_INFO *psQueueInfo; - IMG_SIZE_T ui32Power2QueueSize = NearestPower2(ui32QueueSize); + IMG_SIZE_T uPower2QueueSize = NearestPower2(uQueueSize); SYS_DATA *psSysData; PVRSRV_ERROR eError; IMG_HANDLE hMemBlock; + if (ui32NoOfSwapchainCreated >= DC_NUM_COMMANDS_PER_TYPE) + { + PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateCommandQueueKM: Swapchain already exists, increament DC_MAX_SUPPORTED_QUEUES to support more than one swapchain")); + return PVRSRV_ERROR_FLIP_CHAIN_EXISTS; + } + SysAcquireData(&psSysData); /* allocate an internal queue info structure */ @@ -410,7 +448,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateCommandQueueKM(IMG_SIZE_T ui32QueueSize, /* allocate the command queue buffer - allow for overrun */ eError = OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - ui32Power2QueueSize + PVRSRV_MAX_CMD_SIZE, + uPower2QueueSize + PVRSRV_MAX_CMD_SIZE, &psQueueInfo->pvLinQueueKM, &hMemBlock, "Command Queue"); if (eError != PVRSRV_OK) @@ -423,10 +461,19 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateCommandQueueKM(IMG_SIZE_T ui32QueueSize, psQueueInfo->pvLinQueueUM = psQueueInfo->pvLinQueueKM; /* Sanity check: Should be zeroed by OSMemSet */ - PVR_ASSERT(psQueueInfo->ui32ReadOffset == 0); - PVR_ASSERT(psQueueInfo->ui32WriteOffset == 0); + PVR_ASSERT(psQueueInfo->uReadOffset == 0); + PVR_ASSERT(psQueueInfo->uWriteOffset == 0); + + psQueueInfo->uQueueSize = uPower2QueueSize; - psQueueInfo->ui32QueueSize = ui32Power2QueueSize; +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + psQueueInfo->pvTimeline = sw_sync_timeline_create("pvr_queue_proc"); + if(psQueueInfo->pvTimeline == IMG_NULL) + { + PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateCommandQueueKM: sw_sync_timeline_create() failed")); + goto ErrorExit; + } +#endif /* if this is the first q, create a lock resource for the q list */ if (psSysData->psQueueList == IMG_NULL) @@ -457,6 +504,8 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateCommandQueueKM(IMG_SIZE_T ui32QueueSize, *ppsQueueInfo = psQueueInfo; + ui32NoOfSwapchainCreated++; + return PVRSRV_OK; ErrorExit: @@ -466,7 +515,7 @@ ErrorExit: if(psQueueInfo->pvLinQueueKM) { OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - psQueueInfo->ui32QueueSize, + psQueueInfo->uQueueSize, psQueueInfo->pvLinQueueKM, psQueueInfo->hMemBlock[1]); psQueueInfo->pvLinQueueKM = IMG_NULL; @@ -510,7 +559,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVDestroyCommandQueueKM(PVRSRV_QUEUE_INFO *psQueue /* PRQA S 3415,4109 1 */ /* macro format critical - leave alone */ LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US) { - if(psQueueInfo->ui32ReadOffset == psQueueInfo->ui32WriteOffset) + if(psQueueInfo->uReadOffset == psQueueInfo->uWriteOffset) { bTimeout = IMG_FALSE; break; @@ -535,12 +584,18 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVDestroyCommandQueueKM(PVRSRV_QUEUE_INFO *psQueue goto ErrorExit; } + ui32NoOfSwapchainCreated--; + +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + sync_timeline_destroy(psQueueInfo->pvTimeline); +#endif + if(psQueue == psQueueInfo) { psSysData->psQueueList = psQueueInfo->psNextKM; OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - NearestPower2(psQueueInfo->ui32QueueSize) + PVRSRV_MAX_CMD_SIZE, + NearestPower2(psQueueInfo->uQueueSize) + PVRSRV_MAX_CMD_SIZE, psQueueInfo->pvLinQueueKM, psQueueInfo->hMemBlock[1]); psQueueInfo->pvLinQueueKM = IMG_NULL; @@ -560,7 +615,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVDestroyCommandQueueKM(PVRSRV_QUEUE_INFO *psQueue psQueue->psNextKM = psQueueInfo->psNextKM; OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, - psQueueInfo->ui32QueueSize, + psQueueInfo->uQueueSize, psQueueInfo->pvLinQueueKM, psQueueInfo->hMemBlock[1]); psQueueInfo->pvLinQueueKM = IMG_NULL; @@ -626,40 +681,26 @@ ErrorExit: *****************************************************************************/ IMG_EXPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetQueueSpaceKM(PVRSRV_QUEUE_INFO *psQueue, - IMG_SIZE_T ui32ParamSize, + IMG_SIZE_T uParamSize, IMG_VOID **ppvSpace) { - IMG_BOOL bTimeout = IMG_TRUE; - /* round to 4byte units */ - ui32ParamSize = (ui32ParamSize+3) & 0xFFFFFFFC; + uParamSize = (uParamSize + 3) & 0xFFFFFFFC; - if (ui32ParamSize > PVRSRV_MAX_CMD_SIZE) + if (uParamSize > PVRSRV_MAX_CMD_SIZE) { PVR_DPF((PVR_DBG_WARNING,"PVRSRVGetQueueSpace: max command size is %d bytes", PVRSRV_MAX_CMD_SIZE)); return PVRSRV_ERROR_CMD_TOO_BIG; } - /* PRQA S 3415,4109 1 */ /* macro format critical - leave alone */ - LOOP_UNTIL_TIMEOUT(MAX_HW_TIME_US) + if (GET_SPACE_IN_CMDQ(psQueue) > uParamSize) { - if (GET_SPACE_IN_CMDQ(psQueue) > ui32ParamSize) - { - bTimeout = IMG_FALSE; - break; - } - OSSleepms(1); - } END_LOOP_UNTIL_TIMEOUT(); - - if (bTimeout == IMG_TRUE) - { - *ppvSpace = IMG_NULL; - - return PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE; + *ppvSpace = (IMG_VOID *)((IMG_UINTPTR_T)psQueue->pvLinQueueUM + psQueue->uWriteOffset); } else { - *ppvSpace = (IMG_VOID *)((IMG_UINTPTR_T)psQueue->pvLinQueueUM + psQueue->ui32WriteOffset); + *ppvSpace = IMG_NULL; + return PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE; } return PVRSRV_OK; @@ -695,17 +736,22 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVInsertCommandKM(PVRSRV_QUEUE_INFO *psQueue, PVRSRV_KERNEL_SYNC_INFO *apsDstSync[], IMG_UINT32 ui32SrcSyncCount, PVRSRV_KERNEL_SYNC_INFO *apsSrcSync[], - IMG_SIZE_T ui32DataByteSize, + IMG_SIZE_T uDataByteSize, PFN_QUEUE_COMMAND_COMPLETE pfnCommandComplete, - IMG_HANDLE hCallbackData) + IMG_HANDLE hCallbackData, + IMG_HANDLE *phFence) { PVRSRV_ERROR eError; PVRSRV_COMMAND *psCommand; - IMG_SIZE_T ui32CommandSize; + IMG_SIZE_T uCommandSize; IMG_UINT32 i; SYS_DATA *psSysData; DEVICE_COMMAND_DATA *psDeviceCommandData; +#if !defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + PVR_UNREFERENCED_PARAMETER(phFence); +#endif + /* Check that we've got enough space in our command complete data for this command */ SysAcquireData(&psSysData); psDeviceCommandData = psSysData->apsDeviceCommandData[ui32DevIndex]; @@ -718,24 +764,63 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVInsertCommandKM(PVRSRV_QUEUE_INFO *psQueue, } /* Round up to nearest 32 bit size so pointer arithmetic works */ - ui32DataByteSize = (ui32DataByteSize + 3UL) & ~3UL; + uDataByteSize = (uDataByteSize + 3UL) & ~3UL; /* calc. command size */ - ui32CommandSize = sizeof(PVRSRV_COMMAND) + uCommandSize = sizeof(PVRSRV_COMMAND) + ((ui32DstSyncCount + ui32SrcSyncCount) * sizeof(PVRSRV_SYNC_OBJECT)) - + ui32DataByteSize; + + uDataByteSize; /* wait for space in queue */ - eError = PVRSRVGetQueueSpaceKM (psQueue, ui32CommandSize, (IMG_VOID**)&psCommand); + eError = PVRSRVGetQueueSpaceKM (psQueue, uCommandSize, (IMG_VOID**)&psCommand); if(eError != PVRSRV_OK) { return eError; } +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + if(phFence != IMG_NULL) + { + struct sync_fence *psRetireFence, *psCleanupFence; + + /* New command? New timeline target */ + psQueue->ui32FenceValue++; + + psRetireFence = AllocQueueFence(psQueue->pvTimeline, psQueue->ui32FenceValue, "pvr_queue_retire"); + if(!psRetireFence) + { + PVR_DPF((PVR_DBG_ERROR, "PVRSRVInsertCommandKM: sync_fence_create() failed")); + psQueue->ui32FenceValue--; + return PVRSRV_ERROR_INVALID_PARAMS; + } + + /* This similar to the retire fence, except that it is destroyed + * when a display command completes, rather than at the whim of + * userspace. It is used to keep the timeline alive. + */ + psCleanupFence = AllocQueueFence(psQueue->pvTimeline, psQueue->ui32FenceValue, "pvr_queue_cleanup"); + if(!psCleanupFence) + { + PVR_DPF((PVR_DBG_ERROR, "PVRSRVInsertCommandKM: sync_fence_create() #2 failed")); + sync_fence_put(psRetireFence); + psQueue->ui32FenceValue--; + return PVRSRV_ERROR_INVALID_PARAMS; + } + + psCommand->pvCleanupFence = psCleanupFence; + psCommand->pvTimeline = psQueue->pvTimeline; + *phFence = psRetireFence; + } + else + { + psCommand->pvTimeline = IMG_NULL; + } +#endif /* defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ + psCommand->ui32ProcessID = OSGetCurrentProcessIDKM(); /* setup the command */ - psCommand->uCmdSize = ui32CommandSize; /* this may change if cmd shrinks */ + psCommand->uCmdSize = uCommandSize; /* this may change if cmd shrinks */ psCommand->ui32DevIndex = ui32DevIndex; psCommand->CommandType = CommandType; psCommand->ui32DstSyncCount = ui32DstSyncCount; @@ -752,7 +837,7 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVInsertCommandKM(PVRSRV_QUEUE_INFO *psQueue, + (ui32SrcSyncCount * sizeof(PVRSRV_SYNC_OBJECT))); /* PRQA L:END_PTR_ASSIGNMENTS */ - psCommand->uDataSize = ui32DataByteSize;/* this may change if cmd shrinks */ + psCommand->uDataSize = uDataByteSize;/* this may change if cmd shrinks */ psCommand->pfnCommandComplete = pfnCommandComplete; psCommand->hCallbackData = hCallbackData; @@ -829,18 +914,18 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVSubmitCommandKM(PVRSRV_QUEUE_INFO *psQueue, if (psCommand->ui32DstSyncCount > 0) { psCommand->psDstSync = (PVRSRV_SYNC_OBJECT*)(((IMG_UINTPTR_T)psQueue->pvLinQueueKM) - + psQueue->ui32WriteOffset + sizeof(PVRSRV_COMMAND)); + + psQueue->uWriteOffset + sizeof(PVRSRV_COMMAND)); } if (psCommand->ui32SrcSyncCount > 0) { psCommand->psSrcSync = (PVRSRV_SYNC_OBJECT*)(((IMG_UINTPTR_T)psQueue->pvLinQueueKM) - + psQueue->ui32WriteOffset + sizeof(PVRSRV_COMMAND) + + psQueue->uWriteOffset + sizeof(PVRSRV_COMMAND) + (psCommand->ui32DstSyncCount * sizeof(PVRSRV_SYNC_OBJECT))); } psCommand->pvData = (PVRSRV_SYNC_OBJECT*)(((IMG_UINTPTR_T)psQueue->pvLinQueueKM) - + psQueue->ui32WriteOffset + sizeof(PVRSRV_COMMAND) + + psQueue->uWriteOffset + sizeof(PVRSRV_COMMAND) + (psCommand->ui32DstSyncCount * sizeof(PVRSRV_SYNC_OBJECT)) + (psCommand->ui32SrcSyncCount * sizeof(PVRSRV_SYNC_OBJECT))); @@ -897,8 +982,8 @@ PVRSRV_ERROR CheckIfSyncIsQueued(PVRSRV_SYNC_OBJECT *psSync, COMMAND_COMPLETE_DA if (SYNCOPS_STALE(ui32WriteOpsComplete, psSync->ui32WriteOpsPending)) { PVR_DPF((PVR_DBG_WARNING, - "CheckIfSyncIsQueued: Stale syncops psSyncData:0x%x ui32WriteOpsComplete:0x%x ui32WriteOpsPending:0x%x", - (IMG_UINTPTR_T)psSyncData, ui32WriteOpsComplete, psSync->ui32WriteOpsPending)); + "CheckIfSyncIsQueued: Stale syncops psSyncData:0x%p ui32WriteOpsComplete:0x%x ui32WriteOpsPending:0x%x", + psSyncData, ui32WriteOpsComplete, psSync->ui32WriteOpsPending)); return PVRSRV_OK; } } @@ -979,8 +1064,8 @@ PVRSRV_ERROR PVRSRVProcessCommand(SYS_DATA *psSysData, SYNCOPS_STALE(ui32ReadOpsComplete, psWalkerObj->ui32ReadOps2Pending)) { PVR_DPF((PVR_DBG_WARNING, - "PVRSRVProcessCommand: Stale syncops psSyncData:0x%x ui32WriteOpsComplete:0x%x ui32WriteOpsPending:0x%x", - (IMG_UINTPTR_T)psSyncData, ui32WriteOpsComplete, psWalkerObj->ui32WriteOpsPending)); + "PVRSRVProcessCommand: Stale syncops psSyncData:0x%p ui32WriteOpsComplete:0x%x ui32WriteOpsPending:0x%x", + psSyncData, ui32WriteOpsComplete, psWalkerObj->ui32WriteOpsPending)); } if (!bFlush || @@ -1047,6 +1132,11 @@ PVRSRV_ERROR PVRSRVProcessCommand(SYS_DATA *psSysData, psCmdCompleteData->pfnCommandComplete = psCommand->pfnCommandComplete; psCmdCompleteData->hCallbackData = psCommand->hCallbackData; +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + psCmdCompleteData->pvCleanupFence = psCommand->pvCleanupFence; + psCmdCompleteData->pvTimeline = psCommand->pvTimeline; +#endif + /* copy dst updates over */ psCmdCompleteData->ui32SrcSyncCount = psCommand->ui32SrcSyncCount; for (i=0; i<psCommand->ui32SrcSyncCount; i++) @@ -1150,9 +1240,9 @@ PVRSRV_ERROR PVRSRVProcessQueues(IMG_BOOL bFlush) while (psQueue) { - while (psQueue->ui32ReadOffset != psQueue->ui32WriteOffset) + while (psQueue->uReadOffset != psQueue->uWriteOffset) { - psCommand = (PVRSRV_COMMAND*)((IMG_UINTPTR_T)psQueue->pvLinQueueKM + psQueue->ui32ReadOffset); + psCommand = (PVRSRV_COMMAND*)((IMG_UINTPTR_T)psQueue->pvLinQueueKM + psQueue->uReadOffset); if (PVRSRVProcessCommand(psSysData, psCommand, bFlush) == PVRSRV_OK) { @@ -1180,44 +1270,7 @@ PVRSRV_ERROR PVRSRVProcessQueues(IMG_BOOL bFlush) return PVRSRV_OK; } -#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS) -/*! -****************************************************************************** - - @Function PVRSRVCommandCompleteKM - - @Description Updates non-private command complete sync objects - - @Input hCmdCookie : command cookie - @Input bScheduleMISR : obsolete parameter - - @Return PVRSRV_ERROR - -******************************************************************************/ -IMG_INTERNAL -IMG_VOID PVRSRVFreeCommandCompletePacketKM(IMG_HANDLE hCmdCookie, - IMG_BOOL bScheduleMISR) -{ - COMMAND_COMPLETE_DATA *psCmdCompleteData = (COMMAND_COMPLETE_DATA *)hCmdCookie; - SYS_DATA *psSysData; - - PVR_UNREFERENCED_PARAMETER(bScheduleMISR); - - SysAcquireData(&psSysData); - - /* free command complete storage */ - psCmdCompleteData->bInUse = IMG_FALSE; - - /* FIXME: This may cause unrelated devices to be woken up. */ - PVRSRVScheduleDeviceCallbacks(); - - /* the MISR is always scheduled, regardless of bScheduleMISR */ - OSScheduleMISR(psSysData); -} - -#endif /* (SUPPORT_CUSTOM_SWAP_OPERATIONS) */ - -#if defined(SYS_OMAP4_HAS_DVFS_FRAMEWORK) +#if defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) extern void sgxfreq_notif_sgx_frame_done(void); #endif /* (SYS_OMAP4_HAS_DVFS_FRAMEWORK) */ @@ -1242,9 +1295,9 @@ IMG_VOID PVRSRVCommandCompleteKM(IMG_HANDLE hCmdCookie, COMMAND_COMPLETE_DATA *psCmdCompleteData = (COMMAND_COMPLETE_DATA *)hCmdCookie; SYS_DATA *psSysData; -#if defined(SYS_OMAP4_HAS_DVFS_FRAMEWORK) +#if defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) sgxfreq_notif_sgx_frame_done(); -#endif /* (SYS_OMAP4_HAS_DVFS_FRAMEWORK) */ +#endif /* (SYS_OMAP_HAS_DVFS_FRAMEWORK) */ SysAcquireData(&psSysData); @@ -1295,6 +1348,14 @@ IMG_VOID PVRSRVCommandCompleteKM(IMG_HANDLE hCmdCookie, psCmdCompleteData->pfnCommandComplete(psCmdCompleteData->hCallbackData); } +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + if(psCmdCompleteData->pvTimeline) + { + sw_sync_timeline_inc(psCmdCompleteData->pvTimeline, 1); + sync_fence_put(psCmdCompleteData->pvCleanupFence); + } +#endif /* defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ + /* free command complete storage */ psCmdCompleteData->bInUse = IMG_FALSE; @@ -1308,8 +1369,6 @@ IMG_VOID PVRSRVCommandCompleteKM(IMG_HANDLE hCmdCookie, } - - /*! ****************************************************************************** diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/ra.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/ra.c index da48939..37c7176 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/ra.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/ra.c @@ -93,9 +93,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #if defined(__linux__) && defined(__KERNEL__) #include <linux/kernel.h> -#include "pvr_uaccess.h" #include "proc.h" -#include <linux/sched.h> #endif #ifdef USE_BM_FREESPACE_CHECK @@ -220,23 +218,13 @@ struct _RA_ARENA_ RA_STATISTICS sStatistics; #endif -#if defined(CONFIG_PROC_FS) && defined(CONFIG_PVR_PROC_FS) +#if defined(CONFIG_PROC_FS) && defined(DEBUG) #define PROC_NAME_SIZE 64 - struct proc_dir_entry* pProcInfo; - struct proc_dir_entry* pProcSegs; + struct pvr_proc_dir_entry* pProcInfo; + struct pvr_proc_dir_entry* pProcSegs; IMG_BOOL bInitProcEntry; - -#if defined(CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG) - struct proc_dir_entry* pProcAllocFailThreshold; - - IMG_BOOL bFailAllocationOnce; - IMG_BOOL bFailAllocationPersist; - IMG_SIZE_T uAllocFailThreshold; - IMG_UINT32 uAllocFailMask; -#endif //defined(CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG) - #endif }; /* #define ENABLE_RA_DUMP 1 */ @@ -244,45 +232,19 @@ struct _RA_ARENA_ IMG_VOID RA_Dump (RA_ARENA *pArena); #endif -static INLINE IMG_BOOL RA_TestAllocationFail(RA_ARENA *pArena, IMG_SIZE_T size, IMG_UINT32 buff_type) -{ - #if defined (CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG) - if(pArena->bFailAllocationOnce == IMG_TRUE) - { - if((size > pArena->uAllocFailThreshold) && (pArena->uAllocFailMask & buff_type)) - { - if(pArena->bFailAllocationPersist == IMG_FALSE) - pArena->bFailAllocationOnce = IMG_FALSE; - return IMG_TRUE; - } - } - #endif //CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG - return IMG_FALSE; -} - -#if defined(CONFIG_PROC_FS) && defined(CONFIG_PVR_PROC_FS) - +#if defined(CONFIG_PROC_FS) && defined(DEBUG) static void RA_ProcSeqShowInfo(struct seq_file *sfile, void* el); static void* RA_ProcSeqOff2ElementInfo(struct seq_file * sfile, loff_t off); static void RA_ProcSeqShowRegs(struct seq_file *sfile, void* el); static void* RA_ProcSeqOff2ElementRegs(struct seq_file * sfile, loff_t off); - -#if defined(CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG) -static int RA_ProcSetAllocFailThreshold(struct file *file, const char __user *buffer, unsigned long count, void *data); -static void* RA_ProcSeqOff2AllocFailThreshold(struct seq_file * sfile, loff_t off); -static void RA_ProcSeqShowAllocFailThreshold(struct seq_file *sfile,void* el); -#endif //defined(CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG) - #endif /* defined(CONFIG_PROC_FS) && defined(DEBUG) */ -static PVRSRV_ERROR RA_DumpHeapInfo(RA_ARENA *pArena, IMG_UINT32 ui32DebugLevel); - #ifdef USE_BM_FREESPACE_CHECK IMG_VOID CheckBMFreespace(IMG_VOID); #endif -#if defined(CONFIG_PROC_FS) && defined(CONFIG_PVR_PROC_FS) +#if defined(CONFIG_PROC_FS) && defined(DEBUG) static IMG_CHAR *ReplaceSpaces(IMG_CHAR * const pS) { IMG_CHAR *pT; @@ -770,7 +732,7 @@ _InsertResourceSpan (RA_ARENA *pArena, IMG_UINTPTR_T base, IMG_SIZE_T uSize) } PVR_DPF ((PVR_DBG_MESSAGE, - "RA_InsertResourceSpan: arena='%s', base=0x%x, size=0x%x", + "RA_InsertResourceSpan: arena='%s', base=0x" UINTPTR_FMT ", size=0x%" SIZE_T_FMT_LEN "x", pArena->name, base, uSize)); pSpanStart = _BuildSpanMarker (base, uSize); @@ -1038,9 +1000,13 @@ _AttemptAllocAligned (RA_ARENA *pArena, else aligned_base = pBT->base; PVR_DPF ((PVR_DBG_MESSAGE, - "RA_AttemptAllocAligned: pBT-base=0x%x " - "pBT-size=0x%x alignedbase=0x%x size=0x%x", - pBT->base, pBT->uSize, aligned_base, uSize)); + "RA_AttemptAllocAligned: pBT-base=0x" UINTPTR_FMT " " + "pBT-size=0x%" SIZE_T_FMT_LEN "x alignedbase=0x" + UINTPTR_FMT " size=0x%" SIZE_T_FMT_LEN "x", + pBT->base, + pBT->uSize, + aligned_base, + uSize)); if (pBT->base + pBT->uSize >= aligned_base + uSize) { @@ -1184,8 +1150,8 @@ RA_Create (IMG_CHAR *name, IMG_INT i; PVR_DPF ((PVR_DBG_MESSAGE, - "RA_Create: name='%s', base=0x%x, uSize=0x%x, alloc=0x%x, free=0x%x", - name, base, uSize, (IMG_UINTPTR_T)imp_alloc, (IMG_UINTPTR_T)imp_free)); + "RA_Create: name='%s', base=0x" UINTPTR_FMT ", uSize=0x%" SIZE_T_FMT_LEN "x, alloc=0x%p, free=0x%p", + name, base, uSize, imp_alloc, imp_free)); if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, @@ -1208,22 +1174,30 @@ RA_Create (IMG_CHAR *name, pArena->uQuantum = uQuantum; #ifdef RA_STATS - OSMemSet(&pArena->sStatistics, 0x00, sizeof(pArena->sStatistics)); + pArena->sStatistics.uSpanCount = 0; + pArena->sStatistics.uLiveSegmentCount = 0; + pArena->sStatistics.uFreeSegmentCount = 0; + pArena->sStatistics.uFreeResourceCount = 0; + pArena->sStatistics.uTotalResourceCount = 0; + pArena->sStatistics.uCumulativeAllocs = 0; + pArena->sStatistics.uCumulativeFrees = 0; + pArena->sStatistics.uImportCount = 0; + pArena->sStatistics.uExportCount = 0; #endif -#if defined(CONFIG_PROC_FS) && defined(CONFIG_PVR_PROC_FS) +#if defined(CONFIG_PROC_FS) && defined(DEBUG) if(strcmp(pArena->name,"") != 0) { IMG_INT ret; IMG_CHAR szProcInfoName[PROC_NAME_SIZE]; IMG_CHAR szProcSegsName[PROC_NAME_SIZE]; - struct proc_dir_entry* (*pfnCreateProcEntrySeq)(const IMG_CHAR *, + struct pvr_proc_dir_entry* (*pfnCreateProcEntrySeq)(const IMG_CHAR *, IMG_VOID*, pvr_next_proc_seq_t, pvr_show_proc_seq_t, pvr_off2element_proc_seq_t, pvr_startstop_proc_seq_t, - write_proc_t); + pvr_proc_write_t); pArena->bInitProcEntry = !PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_SUCCESSFUL); @@ -1243,7 +1217,7 @@ RA_Create (IMG_CHAR *name, } ret = snprintf(szProcSegsName, sizeof(szProcSegsName), "ra_segs_%s", pArena->name); - if (ret > 0 && ret < sizeof(szProcSegsName)) + if (ret > 0 && ret < sizeof(szProcInfoName)) { pArena->pProcSegs = pfnCreateProcEntrySeq(ReplaceSpaces(szProcSegsName), pArena, NULL, RA_ProcSeqShowRegs, RA_ProcSeqOff2ElementRegs, NULL, NULL); @@ -1253,27 +1227,8 @@ RA_Create (IMG_CHAR *name, pArena->pProcSegs = 0; PVR_DPF((PVR_DBG_ERROR, "RA_Create: couldn't create ra_segs proc entry for arena %s", pArena->name)); } - -#if defined(CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG) - pArena->uAllocFailThreshold = ~0; - pArena->uAllocFailMask = ~0; - pArena->bFailAllocationOnce = IMG_FALSE; - pArena->bFailAllocationPersist = IMG_FALSE; - - ret = snprintf(szProcSegsName, sizeof(szProcSegsName), "ra_fail_alloc_thld_%s", pArena->name); - if (ret > 0 && ret < sizeof(szProcSegsName)) - { - pArena->pProcAllocFailThreshold = pfnCreateProcEntrySeq(ReplaceSpaces(szProcSegsName), pArena, NULL, - RA_ProcSeqShowAllocFailThreshold, RA_ProcSeqOff2AllocFailThreshold, NULL, RA_ProcSetAllocFailThreshold); - } - else - { - pArena->pProcAllocFailThreshold = 0; - PVR_DPF((PVR_DBG_ERROR, "RA_Create: couldn't create ra_fail_alloc_thld proc entry for arena %s", pArena->name)); - } -#endif //defined(CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG) } -#endif /* defined(CONFIG_PROC_FS) && defined(CONFIG_PVR_PROC_FS) */ +#endif /* defined(CONFIG_PROC_FS) && defined(DEBUG) */ pArena->pSegmentHash = HASH_Create (MINIMUM_HASH_SIZE); if (pArena->pSegmentHash==IMG_NULL) @@ -1339,8 +1294,8 @@ RA_Delete (RA_ARENA *pArena) if (pBT->type != btt_free) { PVR_DPF ((PVR_DBG_ERROR,"RA_Delete: allocations still exist in the arena that is being destroyed")); - PVR_DPF ((PVR_DBG_ERROR,"Likely Cause: client drivers not freeing allocations before destroying devmemcontext")); - PVR_DPF ((PVR_DBG_ERROR,"RA_Delete: base = 0x%x size=0x%x", pBT->base, pBT->uSize)); + PVR_DPF ((PVR_DBG_ERROR,"Likely Cause: client drivers not freeing alocations before destroying devmemcontext")); + PVR_DPF ((PVR_DBG_ERROR,"RA_Delete: base = 0x" UINTPTR_FMT " size=0x%" SIZE_T_FMT_LEN "x", pBT->base, pBT->uSize)); } _SegmentListRemove (pArena, pBT); @@ -1350,9 +1305,9 @@ RA_Delete (RA_ARENA *pArena) pArena->sStatistics.uSpanCount--; #endif } -#if defined(CONFIG_PROC_FS) && defined(CONFIG_PVR_PROC_FS) +#if defined(CONFIG_PROC_FS) && defined(DEBUG) { - IMG_VOID (*pfnRemoveProcEntrySeq)(struct proc_dir_entry*); + IMG_VOID (*pfnRemoveProcEntrySeq)(struct pvr_proc_dir_entry*); pfnRemoveProcEntrySeq = pArena->bInitProcEntry ? RemoveProcEntrySeq : RemovePerProcessProcEntrySeq; @@ -1365,13 +1320,6 @@ RA_Delete (RA_ARENA *pArena) { pfnRemoveProcEntrySeq( pArena->pProcSegs ); } - -#if defined(CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG) - if(pArena->pProcAllocFailThreshold != 0) - { - pfnRemoveProcEntrySeq( pArena->pProcAllocFailThreshold ); - } -#endif //defined(CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG) } #endif HASH_Delete (pArena->pSegmentHash); @@ -1403,7 +1351,7 @@ RA_TestDelete (RA_ARENA *pArena) if (pBT->type != btt_free) { PVR_DPF ((PVR_DBG_ERROR,"RA_TestDelete: detected resource leak!")); - PVR_DPF ((PVR_DBG_ERROR,"RA_TestDelete: base = 0x%x size=0x%x", pBT->base, pBT->uSize)); + PVR_DPF ((PVR_DBG_ERROR,"RA_TestDelete: base = 0x" UINTPTR_FMT " size=0x%" SIZE_T_FMT_LEN "x", pBT->base, pBT->uSize)); return IMG_FALSE; } } @@ -1438,7 +1386,7 @@ RA_Add (RA_ARENA *pArena, IMG_UINTPTR_T base, IMG_SIZE_T uSize) } PVR_DPF ((PVR_DBG_MESSAGE, - "RA_Add: name='%s', base=0x%x, size=0x%x", pArena->name, base, uSize)); + "RA_Add: name='%s', base=0x" UINTPTR_FMT ", size=0x%" SIZE_T_FMT_LEN "x", pArena->name, base, uSize)); uSize = (uSize + pArena->uQuantum - 1) / pArena->uQuantum * pArena->uQuantum; return ((IMG_BOOL)(_InsertResource (pArena, base, uSize) != IMG_NULL)); @@ -1479,8 +1427,7 @@ RA_Alloc (RA_ARENA *pArena, IMG_UINT32 ui32PrivDataLength, IMG_UINTPTR_T *base) { - IMG_BOOL bResult = IMG_FALSE; - IMG_BOOL bTestAllocFail = IMG_FALSE; + IMG_BOOL bResult; IMG_SIZE_T uSize = uRequestSize; PVR_ASSERT (pArena!=IMG_NULL); @@ -1505,101 +1452,85 @@ RA_Alloc (RA_ARENA *pArena, } PVR_DPF ((PVR_DBG_MESSAGE, - "RA_Alloc: arena='%s', size=0x%x(0x%x), alignment=0x%x, offset=0x%x", + "RA_Alloc: arena='%s', size=0x%" SIZE_T_FMT_LEN "x(0x%" SIZE_T_FMT_LEN "x), alignment=0x%x, offset=0x%x", pArena->name, uSize, uRequestSize, uAlignment, uAlignmentOffset)); - bTestAllocFail = RA_TestAllocationFail(pArena, uSize, ~0); - if(!bTestAllocFail) - { - /* if allocation failed then we might have an import source which - can provide more resource, else we will have to fail the - allocation to the caller. */ - bResult = _AttemptAllocAligned (pArena, uSize, ppsMapping, uFlags, - uAlignment, uAlignmentOffset, base); - if (!bResult) + /* if allocation failed then we might have an import source which + can provide more resource, else we will have to fail the + allocation to the caller. */ + bResult = _AttemptAllocAligned (pArena, uSize, ppsMapping, uFlags, + uAlignment, uAlignmentOffset, base); + if (!bResult) + { + BM_MAPPING *psImportMapping; + IMG_UINTPTR_T import_base; + IMG_SIZE_T uImportSize = uSize; + + /* + Ensure that we allocate sufficient space to meet the uAlignment + constraint + */ + if (uAlignment > pArena->uQuantum) { - BM_MAPPING *psImportMapping; - IMG_UINTPTR_T import_base; - IMG_SIZE_T uImportSize = uSize; - - /* - Ensure that we allocate sufficient space to meet the uAlignment - constraint - */ - if (uAlignment > pArena->uQuantum) - { - uImportSize += (uAlignment - 1); - } + uImportSize += (uAlignment - 1); + } - /* ensure that we import according to the quanta of this arena */ - uImportSize = ((uImportSize + pArena->uQuantum - 1)/pArena->uQuantum)*pArena->uQuantum; + /* ensure that we import according to the quanta of this arena */ + uImportSize = ((uImportSize + pArena->uQuantum - 1)/pArena->uQuantum)*pArena->uQuantum; - bResult = - pArena->pImportAlloc (pArena->pImportHandle, uImportSize, &uImportSize, - &psImportMapping, uFlags, - pvPrivData, ui32PrivDataLength, &import_base); - if (bResult) + bResult = + pArena->pImportAlloc (pArena->pImportHandle, uImportSize, &uImportSize, + &psImportMapping, uFlags, + pvPrivData, ui32PrivDataLength, &import_base); + if (bResult) + { + BT *pBT; + pBT = _InsertResourceSpan (pArena, import_base, uImportSize); + /* successfully import more resource, create a span to + represent it and retry the allocation attempt */ + if (pBT == IMG_NULL) { - BT *pBT; - pBT = _InsertResourceSpan (pArena, import_base, uImportSize); - /* successfully import more resource, create a span to - represent it and retry the allocation attempt */ - if (pBT == IMG_NULL) - { - /* insufficient resources to insert the newly acquired span, - so free it back again */ - pArena->pImportFree(pArena->pImportHandle, import_base, - psImportMapping); - PVR_DPF ((PVR_DBG_MESSAGE, - "RA_Alloc: name='%s', size=0x%x failed!", - pArena->name, uSize)); - /* RA_Dump (arena); */ - return IMG_FALSE; - } - pBT->psMapping = psImportMapping; - #ifdef RA_STATS - pArena->sStatistics.uFreeSegmentCount++; - pArena->sStatistics.uFreeResourceCount += uImportSize; - pArena->sStatistics.uImportCount++; - pArena->sStatistics.uSpanCount++; - #endif - bResult = _AttemptAllocAligned(pArena, uSize, ppsMapping, uFlags, - uAlignment, uAlignmentOffset, - base); - if (!bResult) - { - PVR_DPF ((PVR_DBG_ERROR, - "RA_Alloc: name='%s' uAlignment failed!", - pArena->name)); - } + /* insufficient resources to insert the newly acquired span, + so free it back again */ + pArena->pImportFree(pArena->pImportHandle, import_base, + psImportMapping); + PVR_DPF ((PVR_DBG_MESSAGE, + "RA_Alloc: name='%s', size=0x%" SIZE_T_FMT_LEN "x failed!", + pArena->name, uSize)); + /* RA_Dump (arena); */ + return IMG_FALSE; + } + pBT->psMapping = psImportMapping; +#ifdef RA_STATS + pArena->sStatistics.uFreeSegmentCount++; + pArena->sStatistics.uFreeResourceCount += uImportSize; + pArena->sStatistics.uImportCount++; + pArena->sStatistics.uSpanCount++; +#endif + bResult = _AttemptAllocAligned(pArena, uSize, ppsMapping, uFlags, + uAlignment, uAlignmentOffset, + base); + if (!bResult) + { + PVR_DPF ((PVR_DBG_MESSAGE, + "RA_Alloc: name='%s' uAlignment failed!", + pArena->name)); } } - #ifdef RA_STATS - if (bResult) - pArena->sStatistics.uCumulativeAllocs++; - #endif } +#ifdef RA_STATS + if (bResult) + pArena->sStatistics.uCumulativeAllocs++; +#endif - PVR_DPF((PVR_DBG_MESSAGE, - "RA_Alloc: arena=%s, size=0x%x(0x%x), alignment=0x%x, "\ - "offset=0x%x, result=%d", - pArena->name, - uSize, uRequestSize, uAlignment, uAlignmentOffset, - bResult)); + PVR_DPF ((PVR_DBG_MESSAGE, + "RA_Alloc: name='%s', size=0x%" SIZE_T_FMT_LEN "x, *base=0x" UINTPTR_FMT " = %d", + pArena->name, uSize, *base, bResult)); /* RA_Dump (pArena); ra_stats (pArena); */ - if (!bResult) { - PVR_LOG(("RA_Alloc %s %s: arena=%s, size=0x%x(0x%x), "\ - "alignment=0x%x, offset=0x%x", - (bResult ? "SUCCESS" : "FAILED"), - (bTestAllocFail ? "in TEST_MODE!" : " "), - pArena->name, - uSize, uRequestSize, uAlignment, uAlignmentOffset)); - RA_DumpHeapInfo(pArena, ~0); - } #if defined(VALIDATE_ARENA_TEST) ValidateArena(pArena); #endif @@ -1653,8 +1584,14 @@ IMG_UINT32 ValidateArena(RA_ARENA *pArena) (eNextSpan == IMPORTED_RESOURCE_SPAN_END))) { /* error - next span must be live, free or end */ - PVR_DPF((PVR_DBG_ERROR, "ValidateArena ERROR: adjacent boundary tags %d (base=0x%x) and %d (base=0x%x) are incompatible (arena: %s)", - pSegment->ui32BoundaryTagID, pSegment->base, pSegment->pNextSegment->ui32BoundaryTagID, pSegment->pNextSegment->base, pArena->name)); + PVR_DPF((PVR_DBG_ERROR, + "ValidateArena ERROR: adjacent boundary tags %d (base=0x" UINTPTR_FMT + ") and %d (base=0x" UINTPTR_FMT ") are incompatible (arena: %s)", + pSegment->ui32BoundaryTagID, + pSegment->base, + pSegment->pNextSegment->ui32BoundaryTagID, + pSegment->pNextSegment->base, + pArena->name)); PVR_DBG_BREAK; } @@ -1666,8 +1603,14 @@ IMG_UINT32 ValidateArena(RA_ARENA *pArena) (eNextSpan == IMPORTED_RESOURCE_SPAN_END))) { /* error - next span must be live or end */ - PVR_DPF((PVR_DBG_ERROR, "ValidateArena ERROR: adjacent boundary tags %d (base=0x%x) and %d (base=0x%x) are incompatible (arena: %s)", - pSegment->ui32BoundaryTagID, pSegment->base, pSegment->pNextSegment->ui32BoundaryTagID, pSegment->pNextSegment->base, pArena->name)); + PVR_DPF((PVR_DBG_ERROR, + "ValidateArena ERROR: adjacent boundary tags %d (base=0x" UINTPTR_FMT + ") and %d (base=0x" UINTPTR_FMT ") are incompatible (arena: %s)", + pSegment->ui32BoundaryTagID, + pSegment->base, + pSegment->pNextSegment->ui32BoundaryTagID, + pSegment->pNextSegment->base, + pArena->name)); PVR_DBG_BREAK; } @@ -1680,8 +1623,14 @@ IMG_UINT32 ValidateArena(RA_ARENA *pArena) (eNextSpan == IMPORTED_RESOURCE_SPAN_END)) { /* error - next span cannot be live, free or end */ - PVR_DPF((PVR_DBG_ERROR, "ValidateArena ERROR: adjacent boundary tags %d (base=0x%x) and %d (base=0x%x) are incompatible (arena: %s)", - pSegment->ui32BoundaryTagID, pSegment->base, pSegment->pNextSegment->ui32BoundaryTagID, pSegment->pNextSegment->base, pArena->name)); + PVR_DPF((PVR_DBG_ERROR, + "ValidateArena ERROR: adjacent boundary tags %d (base=0x" UINTPTR_FMT + ") and %d (base=0x" UINTPTR_FMT ") are incompatible (arena: %s)", + pSegment->ui32BoundaryTagID, + pSegment->base, + pSegment->pNextSegment->ui32BoundaryTagID, + pSegment->pNextSegment->base, + pArena->name)); PVR_DBG_BREAK; } @@ -1694,16 +1643,28 @@ IMG_UINT32 ValidateArena(RA_ARENA *pArena) (eNextSpan == IMPORTED_RESOURCE_SPAN_FREE))) { /* error - next span must be live or free */ - PVR_DPF((PVR_DBG_ERROR, "ValidateArena ERROR: adjacent boundary tags %d (base=0x%x) and %d (base=0x%x) are incompatible (arena: %s)", - pSegment->ui32BoundaryTagID, pSegment->base, pSegment->pNextSegment->ui32BoundaryTagID, pSegment->pNextSegment->base, pArena->name)); + PVR_DPF((PVR_DBG_ERROR, + "ValidateArena ERROR: adjacent boundary tags %d (base=0x" UINTPTR_FMT + ") and %d (base=0x" UINTPTR_FMT ") are incompatible (arena: %s)", + pSegment->ui32BoundaryTagID, + pSegment->base, + pSegment->pNextSegment->ui32BoundaryTagID, + pSegment->pNextSegment->base, + pArena->name)); PVR_DBG_BREAK; } break; default: - PVR_DPF((PVR_DBG_ERROR, "ValidateArena ERROR: adjacent boundary tags %d (base=0x%x) and %d (base=0x%x) are incompatible (arena: %s)", - pSegment->ui32BoundaryTagID, pSegment->base, pSegment->pNextSegment->ui32BoundaryTagID, pSegment->pNextSegment->base, pArena->name)); + PVR_DPF((PVR_DBG_ERROR, + "ValidateArena ERROR: adjacent boundary tags %d (base=0x" UINTPTR_FMT + ") and %d (base=0x" UINTPTR_FMT ") are incompatible (arena: %s)", + pSegment->ui32BoundaryTagID, + pSegment->base, + pSegment->pNextSegment->ui32BoundaryTagID, + pSegment->pNextSegment->base, + pArena->name)); PVR_DBG_BREAK; break; @@ -1727,8 +1688,14 @@ IMG_UINT32 ValidateArena(RA_ARENA *pArena) (eNextSpan == RESOURCE_SPAN_LIVE))) { /* error - next span must be free or live */ - PVR_DPF((PVR_DBG_ERROR, "ValidateArena ERROR: adjacent boundary tags %d (base=0x%x) and %d (base=0x%x) are incompatible (arena: %s)", - pSegment->ui32BoundaryTagID, pSegment->base, pSegment->pNextSegment->ui32BoundaryTagID, pSegment->pNextSegment->base, pArena->name)); + PVR_DPF((PVR_DBG_ERROR, + "ValidateArena ERROR: adjacent boundary tags %d (base=0x" UINTPTR_FMT + ") and %d (base=0x" UINTPTR_FMT ") are incompatible (arena: %s)", + pSegment->ui32BoundaryTagID, + pSegment->base, + pSegment->pNextSegment->ui32BoundaryTagID, + pSegment->pNextSegment->base, + pArena->name)); PVR_DBG_BREAK; } @@ -1740,16 +1707,28 @@ IMG_UINT32 ValidateArena(RA_ARENA *pArena) (eNextSpan == RESOURCE_SPAN_LIVE))) { /* error - next span must be free or live */ - PVR_DPF((PVR_DBG_ERROR, "ValidateArena ERROR: adjacent boundary tags %d (base=0x%x) and %d (base=0x%x) are incompatible (arena: %s)", - pSegment->ui32BoundaryTagID, pSegment->base, pSegment->pNextSegment->ui32BoundaryTagID, pSegment->pNextSegment->base, pArena->name)); + PVR_DPF((PVR_DBG_ERROR, + "ValidateArena ERROR: adjacent boundary tags %d (base=0x" UINTPTR_FMT + ") and %d (base=0x" UINTPTR_FMT ") are incompatible (arena: %s)", + pSegment->ui32BoundaryTagID, + pSegment->base, + pSegment->pNextSegment->ui32BoundaryTagID, + pSegment->pNextSegment->base, + pArena->name)); PVR_DBG_BREAK; } break; default: - PVR_DPF((PVR_DBG_ERROR, "ValidateArena ERROR: adjacent boundary tags %d (base=0x%x) and %d (base=0x%x) are incompatible (arena: %s)", - pSegment->ui32BoundaryTagID, pSegment->base, pSegment->pNextSegment->ui32BoundaryTagID, pSegment->pNextSegment->base, pArena->name)); + PVR_DPF((PVR_DBG_ERROR, + "ValidateArena ERROR: adjacent boundary tags %d (base=0x" UINTPTR_FMT + ") and %d (base=0x" UINTPTR_FMT ") are incompatible (arena: %s)", + pSegment->ui32BoundaryTagID, + pSegment->base, + pSegment->pNextSegment->ui32BoundaryTagID, + pSegment->pNextSegment->base, + pArena->name)); PVR_DBG_BREAK; break; @@ -1801,7 +1780,7 @@ RA_Free (RA_ARENA *pArena, IMG_UINTPTR_T base, IMG_BOOL bFreeBackingStore) #endif PVR_DPF ((PVR_DBG_MESSAGE, - "RA_Free: name='%s', base=0x%x", pArena->name, base)); + "RA_Free: name='%s', base=0x" UINTPTR_FMT, pArena->name, base)); pBT = (BT *) HASH_Remove (pArena->pSegmentHash, base); PVR_ASSERT (pBT != IMG_NULL); @@ -1834,7 +1813,11 @@ RA_Free (RA_ARENA *pArena, IMG_UINTPTR_T base, IMG_BOOL bFreeBackingStore) { *p++ = 0xAA; } - PVR_DPF((PVR_DBG_MESSAGE,"BM_FREESPACE_CHECK: RA_Free Cleared %08X to %08X (size=0x%x)",(IMG_BYTE*)pBT->base + SysGetDevicePhysOffset(),endp-1,pBT->uSize)); + PVR_DPF((PVR_DBG_MESSAGE, + "BM_FREESPACE_CHECK: RA_Free Cleared %p to %p (size=0x%" SIZE_T_FMT_LEN "x)", + (IMG_BYTE*)pBT->base + SysGetDevicePhysOffset(), + endp - 1, + pBT->uSize)); } #endif _FreeBT (pArena, pBT, bFreeBackingStore); @@ -1934,7 +1917,7 @@ IMG_VOID CheckBMFreespace(IMG_VOID) #endif -#if (defined(CONFIG_PROC_FS) && defined(CONFIG_PVR_PROC_FS)) || defined (RA_STATS) +#if (defined(CONFIG_PROC_FS) && defined(DEBUG)) || defined (RA_STATS) static IMG_CHAR * _BTType (IMG_INT eType) { @@ -1965,7 +1948,7 @@ RA_Dump (RA_ARENA *pArena) BT *pBT; PVR_ASSERT (pArena != IMG_NULL); PVR_DPF ((PVR_DBG_MESSAGE,"Arena '%s':", pArena->name)); - PVR_DPF ((PVR_DBG_MESSAGE," alloc=%08X free=%08X handle=%08X quantum=%d", + PVR_DPF ((PVR_DBG_MESSAGE," alloc=%p free=%p handle=%p quantum=%d", pArena->pImportAlloc, pArena->pImportFree, pArena->pImportHandle, pArena->uQuantum)); PVR_DPF ((PVR_DBG_MESSAGE," segment Chain:")); @@ -1978,8 +1961,8 @@ RA_Dump (RA_ARENA *pArena) for (pBT=pArena->pHeadSegment; pBT!=IMG_NULL; pBT=pBT->pNextSegment) { - PVR_DPF ((PVR_DBG_MESSAGE,"\tbase=0x%x size=0x%x type=%s", - (IMG_UINT32) pBT->base, pBT->uSize, _BTType (pBT->type))); + PVR_DPF ((PVR_DBG_MESSAGE,"\tbase=0x" UINTPTR_FMT " size=0x%" SIZE_T_FMT_LEN "x type=%s", + pBT->base, pBT->uSize, _BTType (pBT->type))); } #ifdef HASH_TRACE @@ -1988,257 +1971,48 @@ RA_Dump (RA_ARENA *pArena) } #endif /* #if defined(ENABLE_RA_DUMP) */ -static PVRSRV_ERROR RA_DumpHeapInfo(RA_ARENA *pArena, IMG_UINT32 ui32DebugLevel) -{ - BT *pBT; - - { - IMG_UINT32 ui32PID = OSGetCurrentProcessIDKM(); - IMG_CHAR dirname_buffer[256]; - IMG_CHAR dirname[256]; - const IMG_CHAR *proc_basename = dirname_buffer; - dirname_buffer[255] = dirname[255] = '\0'; - - OSGetProcCmdline(ui32PID, dirname_buffer, sizeof(dirname_buffer)); - PVR_LOG(("\nCommand Line of the current process with ID %u is %s", ui32PID, dirname_buffer)); - - proc_basename = OSGetPathBaseName(dirname_buffer, sizeof(dirname_buffer)); - PVR_LOG(("Base Name of the current process with ID %u is %s", ui32PID, proc_basename)); - - } - - PVR_LOG(("Arena '%s':", pArena->name)); - - PVR_LOG(( " allocCB=%p freeCB=%p handle=%p quantum=%d", - pArena->pImportAlloc, - pArena->pImportFree, - pArena->pImportHandle, - pArena->uQuantum)); - - PVR_LOG(( "span count\t\t%u", pArena->sStatistics.uSpanCount)); - - PVR_LOG(( "live segment count\t%u", pArena->sStatistics.uLiveSegmentCount)); - - PVR_LOG(( "free segment count\t%u", pArena->sStatistics.uFreeSegmentCount)); - - PVR_LOG(( "free resource count\t%u (0x%x)", - pArena->sStatistics.uFreeResourceCount, - (IMG_UINT)pArena->sStatistics.uFreeResourceCount)); - PVR_LOG(( "total allocs\t\t%u", pArena->sStatistics.uCumulativeAllocs)); - - PVR_LOG(( "total failed allocs\t%u", pArena->sStatistics.uFailedAllocCount)); - - PVR_LOG(( "total frees\t\t%u", pArena->sStatistics.uCumulativeFrees)); - - PVR_LOG(( "import count\t\t%u", pArena->sStatistics.uImportCount)); - - PVR_LOG(( "export count\t\t%u", pArena->sStatistics.uExportCount)); - - PVR_LOG(( " segment Chain:")); - - if (pArena->pHeadSegment != IMG_NULL && - pArena->pHeadSegment->pPrevSegment != IMG_NULL) - { - PVR_LOG(( " error: head boundary tag has invalid pPrevSegment")); - } - - if (pArena->pTailSegment != IMG_NULL && - pArena->pTailSegment->pNextSegment != IMG_NULL) - { - PVR_LOG(( " error: tail boundary tag has invalid pNextSegment")); - } - - for (pBT=pArena->pHeadSegment; pBT!=IMG_NULL; pBT=pBT->pNextSegment) - { - PVR_LOG(( "%s base=0x%08x size=%08d(0x%08x) type=%s ref=%p", - ((pBT->type == btt_span) ? "\t\t" : "\t"), - (IMG_UINT32) pBT->base, - pBT->uSize, pBT->uSize, - _BTType(pBT->type), - pBT->psMapping)); - if(pBT->psMapping) - { - BM_MAPPING *psImportMapping = pBT->psMapping; - PVR_LOG(( "\t %p: mapping type %s, mapping count=%d, size=%08d(0x%08x), flags=0x%08x, align=0x%04x", - psImportMapping, - _BMMappingType(psImportMapping->eCpuMemoryOrigin), - psImportMapping->ui32MappingCount, - psImportMapping->uSize, psImportMapping->uSize, - psImportMapping->ui32Flags, - psImportMapping->ui32DevVAddrAlignment)); - } - } - - return PVRSRV_OK; -} - -#if defined(CONFIG_PROC_FS) && defined(CONFIG_PVR_PROC_FS) - -#if defined(CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG) -#define _PROC_SET_ALLOC_TH_BUFFER_SZ 32 -static int RA_ProcSetAllocFailThreshold(struct file *file, const char __user *buffer, unsigned long count, void *data) -{ - PVR_PROC_SEQ_HANDLERS *handlers = (PVR_PROC_SEQ_HANDLERS*)data; - RA_ARENA *pArena; - IMG_CHAR data_buffer[_PROC_SET_ALLOC_TH_BUFFER_SZ]; - IMG_INT32 value = ~0; - IMG_UINT32 mask = ~0; - IMG_INT32 format_ret; - - if ((handlers == NULL) || (handlers->data == NULL) || (count > sizeof(data_buffer))) - { - return -EINVAL; - } - - pArena = (RA_ARENA *)handlers->data; - - count = MIN(count, sizeof(data_buffer)); - - if (pvr_copy_from_user(data_buffer, buffer, count)) - return -EINVAL; - - if (data_buffer[count - 1] != '\n') - return -EINVAL; - - data_buffer[(sizeof(data_buffer) - 1)] = '\0'; - if((sizeof(data_buffer) -1) <= count) - data_buffer[count] = '\0'; - - PVR_LOG(("Buffer from the user is %s\n", data_buffer)); - format_ret = sscanf(data_buffer, "%i:0x%x", &value, &mask); - PVR_LOG(("Value set is %i, type is %x, format %i\n", value, mask, format_ret)); - if(format_ret <= 0) - return -EINVAL; - -/* - Heap Allocation Buffer Threshold Setting - for testing purposes only - Causes allocation of a GFX buffer of type MASK for the respective heap to - fail. - Format is <threshold value number>:<buffer type mask hex value> - for example: 1000:0x01. - Value of -1 disables the allocation fail test - Value bigger than and eq. to 0 enables the allocation fail test for - the first buffer only. - Value smaller than -1 enables the buffer allocation failure for this - heap until the test disables it. -*/ - if(value < 0) - { - if(value == -1) - { - pArena->bFailAllocationPersist = pArena->bFailAllocationOnce = IMG_FALSE; - } - else if(value == -2) - { - RA_DumpHeapInfo(pArena, ~0); - } - else - { - pArena->bFailAllocationPersist = pArena->bFailAllocationOnce = IMG_TRUE; - pArena->uAllocFailThreshold = -value; - } - } - else - { - pArena->bFailAllocationPersist = 0; - pArena->bFailAllocationOnce = 1; - pArena->uAllocFailThreshold = value; - } - - if(format_ret > 1) - { - if((pArena->bFailAllocationOnce == IMG_TRUE) && (mask == 0)) - pArena->uAllocFailMask = ~0; - else - pArena->uAllocFailMask = mask; - } - PVR_LOG(("*************** User Fail Heap Allocation Settings for %s *******************************\n", - pArena->name)); - PVR_LOG(("Fail Heap Allocation is %s in %s mode\n", (pArena->bFailAllocationOnce ? "Enabled": "Disabled"), - (pArena->bFailAllocationPersist ? "Persistent": "One-Shot"))); - PVR_LOG(("Fail Heap Allocation Buffer Size Threshold is %u with a Mask of 0x%x\n", - pArena->uAllocFailThreshold, pArena->uAllocFailMask)); - PVR_LOG(("*******************************************************************************************\n")); - return (count); -} - -static void* RA_ProcSeqOff2AllocFailThreshold(struct seq_file * sfile, loff_t off) -{ - - if(off <= 1) - return (void*)(IMG_INT)(off+1); - - return 0; -} - -static void RA_ProcSeqShowAllocFailThreshold(struct seq_file *sfile,void* el) -{ - PVR_PROC_SEQ_HANDLERS *handlers = (PVR_PROC_SEQ_HANDLERS*)sfile->private; - RA_ARENA *pArena = (RA_ARENA *)handlers->data; - IMG_INT off = (IMG_INT)el; - - switch (off) - { - case 1: - seq_printf(sfile, "Heap Allocation Buffer Threshold Setting - for testing purposes only\n"); - seq_printf(sfile, "Format is <threshold value number>:<buffer type mask hex value> for example: 1000:0x01\n"); - seq_printf(sfile, "Value of -1 disables the allocation fail test\n"); - seq_printf(sfile, "Value of -2 dumps the heap entries to the kernel log\n"); - seq_printf(sfile, "Value => 0 enables the allocation fail test for the first buffer with the met threshold only\n"); - seq_printf(sfile, "Value < -2 enables the buffer allocation failure for this heap until the test disables it\n"); - break; - case 2: - seq_printf(sfile, "*********** Current Settings: ********************\n"); - seq_printf(sfile,"Fail Heap Allocation is %s in %s mode\n", (pArena->bFailAllocationOnce ? "Enabled": "Disabled"), - (pArena->bFailAllocationPersist ? "Persistent": "One-Shot")); - seq_printf(sfile, "Fail Heap Allocation Buffer Size Threshold is %u with a Mask of 0x%x\n", - pArena->uAllocFailThreshold, pArena->uAllocFailMask); - break; - } -} -#endif //defined(CONFIG_PVR_PROC_FS_HEAP_ALLOC_DEBUG) +#if defined(CONFIG_PROC_FS) && defined(DEBUG) static void RA_ProcSeqShowInfo(struct seq_file *sfile, void* el) { - PVR_PROC_SEQ_HANDLERS *handlers = (PVR_PROC_SEQ_HANDLERS*)sfile->private; - RA_ARENA *pArena = (RA_ARENA *)handlers->data; - IMG_INT off = (IMG_INT)el; + RA_ARENA *pArena = (RA_ARENA *)PVRProcGetData(sfile->private); + IMG_UINTPTR_T off = (IMG_UINTPTR_T)el; switch (off) { case 1: - seq_printf(sfile, "quantum\t\t\t%u\n", pArena->uQuantum); + seq_printf(sfile, "quantum\t\t\t%" SIZE_T_FMT_LEN "u\n", pArena->uQuantum); break; case 2: - seq_printf(sfile, "import_handle\t\t%08X\n", (IMG_UINT)pArena->pImportHandle); + seq_printf(sfile, "import_handle\t\t%p\n", pArena->pImportHandle); break; #ifdef RA_STATS case 3: - seq_printf(sfile,"span count\t\t%u\n", pArena->sStatistics.uSpanCount); + seq_printf(sfile,"span count\t\t%" SIZE_T_FMT_LEN "u\n", pArena->sStatistics.uSpanCount); break; case 4: - seq_printf(sfile, "live segment count\t%u\n", pArena->sStatistics.uLiveSegmentCount); + seq_printf(sfile, "live segment count\t%" SIZE_T_FMT_LEN "u\n", pArena->sStatistics.uLiveSegmentCount); break; case 5: - seq_printf(sfile, "free segment count\t%u\n", pArena->sStatistics.uFreeSegmentCount); + seq_printf(sfile, "free segment count\t%" SIZE_T_FMT_LEN "u\n", pArena->sStatistics.uFreeSegmentCount); break; case 6: - seq_printf(sfile, "free resource count\t%u (0x%x)\n", + seq_printf(sfile, "free resource count\t%" SIZE_T_FMT_LEN "u (0x%" SIZE_T_FMT_LEN "x)\n", pArena->sStatistics.uFreeResourceCount, - (IMG_UINT)pArena->sStatistics.uFreeResourceCount); + pArena->sStatistics.uFreeResourceCount); break; case 7: - seq_printf(sfile, "total allocs\t\t%u\n", pArena->sStatistics.uCumulativeAllocs); + seq_printf(sfile, "total allocs\t\t%" SIZE_T_FMT_LEN "u\n", pArena->sStatistics.uCumulativeAllocs); break; case 8: - seq_printf(sfile, "total frees\t\t%u\n", pArena->sStatistics.uCumulativeFrees); + seq_printf(sfile, "total frees\t\t%" SIZE_T_FMT_LEN "u\n", pArena->sStatistics.uCumulativeFrees); break; case 9: - seq_printf(sfile, "import count\t\t%u\n", pArena->sStatistics.uImportCount); + seq_printf(sfile, "import count\t\t%" SIZE_T_FMT_LEN "u\n", pArena->sStatistics.uImportCount); break; case 10: - seq_printf(sfile, "export count\t\t%u\n", pArena->sStatistics.uExportCount); + seq_printf(sfile, "export count\t\t%" SIZE_T_FMT_LEN "u\n", pArena->sStatistics.uExportCount); break; #endif } @@ -2252,14 +2026,13 @@ static void* RA_ProcSeqOff2ElementInfo(struct seq_file * sfile, loff_t off) #else if(off <= 1) #endif - return (void*)(IMG_INT)(off+1); + return (void*)(IMG_UINTPTR_T)(off+1); return 0; } static void RA_ProcSeqShowRegs(struct seq_file *sfile, void* el) { - PVR_PROC_SEQ_HANDLERS *handlers = (PVR_PROC_SEQ_HANDLERS*)sfile->private; - RA_ARENA *pArena = (RA_ARENA *)handlers->data; + RA_ARENA *pArena = (RA_ARENA *)PVRProcGetData(sfile->private); BT *pBT = (BT*)el; if (el == PVR_PROC_SEQ_START_TOKEN) @@ -2270,16 +2043,15 @@ static void RA_ProcSeqShowRegs(struct seq_file *sfile, void* el) if (pBT) { - seq_printf(sfile, "%08x %8x %4s %08x\n", - (IMG_UINT)pBT->base, (IMG_UINT)pBT->uSize, _BTType (pBT->type), - (IMG_UINT)pBT->psMapping); + seq_printf(sfile, "%p %" SIZE_T_FMT_LEN "x %4s %p\n", + (IMG_PVOID)pBT->base, pBT->uSize, _BTType (pBT->type), + pBT->psMapping); } } static void* RA_ProcSeqOff2ElementRegs(struct seq_file * sfile, loff_t off) { - PVR_PROC_SEQ_HANDLERS *handlers = (PVR_PROC_SEQ_HANDLERS*)sfile->private; - RA_ARENA *pArena = (RA_ARENA *)handlers->data; + RA_ARENA *pArena = (RA_ARENA *)PVRProcGetData(sfile->private); BT *pBT = 0; if(off == 0) @@ -2289,7 +2061,6 @@ static void* RA_ProcSeqOff2ElementRegs(struct seq_file * sfile, loff_t off) return (void*)pBT; } - #endif /* defined(CONFIG_PROC_FS) && defined(DEBUG) */ @@ -2321,7 +2092,7 @@ PVRSRV_ERROR RA_GetStats(RA_ARENA *pArena, CHECK_SPACE(ui32StrLen); - i32Count = OSSNPrintf(pszStr, 100, " allocCB=%p freeCB=%p handle=%p quantum=%d\n", + i32Count = OSSNPrintf(pszStr, 100, " allocCB=%p freeCB=%p handle=%p quantum=%" SIZE_T_FMT_LEN "u\n", pArena->pImportAlloc, pArena->pImportFree, pArena->pImportHandle, @@ -2329,37 +2100,44 @@ PVRSRV_ERROR RA_GetStats(RA_ARENA *pArena, UPDATE_SPACE(pszStr, i32Count, ui32StrLen); CHECK_SPACE(ui32StrLen); - i32Count = OSSNPrintf(pszStr, 100, "span count\t\t%u\n", pArena->sStatistics.uSpanCount); + i32Count = OSSNPrintf(pszStr, 100, "span count\t\t%" SIZE_T_FMT_LEN "u\n", + pArena->sStatistics.uSpanCount); UPDATE_SPACE(pszStr, i32Count, ui32StrLen); CHECK_SPACE(ui32StrLen); - i32Count = OSSNPrintf(pszStr, 100, "live segment count\t%u\n", pArena->sStatistics.uLiveSegmentCount); + i32Count = OSSNPrintf(pszStr, 100, "live segment count\t%" SIZE_T_FMT_LEN "u\n", + pArena->sStatistics.uLiveSegmentCount); UPDATE_SPACE(pszStr, i32Count, ui32StrLen); CHECK_SPACE(ui32StrLen); - i32Count = OSSNPrintf(pszStr, 100, "free segment count\t%u\n", pArena->sStatistics.uFreeSegmentCount); + i32Count = OSSNPrintf(pszStr, 100, "free segment count\t%" SIZE_T_FMT_LEN "u\n", + pArena->sStatistics.uFreeSegmentCount); UPDATE_SPACE(pszStr, i32Count, ui32StrLen); CHECK_SPACE(ui32StrLen); - i32Count = OSSNPrintf(pszStr, 100, "free resource count\t%u (0x%x)\n", + i32Count = OSSNPrintf(pszStr, 100, "free resource count\t%" SIZE_T_FMT_LEN "u (0x%" SIZE_T_FMT_LEN "x)\n", pArena->sStatistics.uFreeResourceCount, - (IMG_UINT)pArena->sStatistics.uFreeResourceCount); + pArena->sStatistics.uFreeResourceCount); UPDATE_SPACE(pszStr, i32Count, ui32StrLen); CHECK_SPACE(ui32StrLen); - i32Count = OSSNPrintf(pszStr, 100, "total allocs\t\t%u\n", pArena->sStatistics.uCumulativeAllocs); + i32Count = OSSNPrintf(pszStr, 100, "total allocs\t\t%" SIZE_T_FMT_LEN "u\n", + pArena->sStatistics.uCumulativeAllocs); UPDATE_SPACE(pszStr, i32Count, ui32StrLen); CHECK_SPACE(ui32StrLen); - i32Count = OSSNPrintf(pszStr, 100, "total frees\t\t%u\n", pArena->sStatistics.uCumulativeFrees); + i32Count = OSSNPrintf(pszStr, 100, "total frees\t\t%" SIZE_T_FMT_LEN "u\n", + pArena->sStatistics.uCumulativeFrees); UPDATE_SPACE(pszStr, i32Count, ui32StrLen); CHECK_SPACE(ui32StrLen); - i32Count = OSSNPrintf(pszStr, 100, "import count\t\t%u\n", pArena->sStatistics.uImportCount); + i32Count = OSSNPrintf(pszStr, 100, "import count\t\t%" SIZE_T_FMT_LEN "u\n", + pArena->sStatistics.uImportCount); UPDATE_SPACE(pszStr, i32Count, ui32StrLen); CHECK_SPACE(ui32StrLen); - i32Count = OSSNPrintf(pszStr, 100, "export count\t\t%u\n", pArena->sStatistics.uExportCount); + i32Count = OSSNPrintf(pszStr, 100, "export count\t\t%" SIZE_T_FMT_LEN "u\n", + pArena->sStatistics.uExportCount); UPDATE_SPACE(pszStr, i32Count, ui32StrLen); CHECK_SPACE(ui32StrLen); @@ -2385,8 +2163,8 @@ PVRSRV_ERROR RA_GetStats(RA_ARENA *pArena, for (pBT=pArena->pHeadSegment; pBT!=IMG_NULL; pBT=pBT->pNextSegment) { CHECK_SPACE(ui32StrLen); - i32Count = OSSNPrintf(pszStr, 100, "\tbase=0x%x size=0x%x type=%s ref=%p\n", - (IMG_UINT32) pBT->base, + i32Count = OSSNPrintf(pszStr, 100, "\tbase=0x%p size=0x%" SIZE_T_FMT_LEN "x type=%s ref=%p\n", + (void *)pBT->base, pBT->uSize, _BTType(pBT->type), pBT->psMapping); @@ -2407,7 +2185,7 @@ PVRSRV_ERROR RA_GetStatsFreeMem(RA_ARENA *pArena, IMG_UINT32 ui32StrLen = *pui32StrLen; IMG_INT32 i32Count; CHECK_SPACE(ui32StrLen); - i32Count = OSSNPrintf(pszStr, 100, "Bytes free: Arena %-30s: %u (0x%x)\n", pArena->name, + i32Count = OSSNPrintf(pszStr, 100, "Bytes free: Arena %-30s: %" SIZE_T_FMT_LEN "u (0x%" SIZE_T_FMT_LEN "x)\n", pArena->name, pArena->sStatistics.uFreeResourceCount, pArena->sStatistics.uFreeResourceCount); UPDATE_SPACE(pszStr, i32Count, ui32StrLen); diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/refcount.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/refcount.c index fa64b23..a6dcb19 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/refcount.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/refcount.c @@ -71,9 +71,11 @@ static DEFINE_SPINLOCK(gsCCBLock); #if defined(__linux__) #define PVRSRV_REFCOUNT_CCB_DEBUG_MMAP (1U << 16) #define PVRSRV_REFCOUNT_CCB_DEBUG_MMAP2 (1U << 17) +#define PVRSRV_REFCOUNT_CCB_DEBUG_ION_SYNC (1U << 18) #else #define PVRSRV_REFCOUNT_CCB_DEBUG_MMAP 0 #define PVRSRV_REFCOUNT_CCB_DEBUG_MMAP2 0 +#define PVRSRV_REFCOUNT_CCB_DEBUG_ION_SYNC 0 #endif #define PVRSRV_REFCOUNT_CCB_DEBUG_ALL ~0U @@ -81,6 +83,9 @@ static DEFINE_SPINLOCK(gsCCBLock); /*static const IMG_UINT guiDebugMask = PVRSRV_REFCOUNT_CCB_DEBUG_ALL;*/ static const IMG_UINT guiDebugMask = PVRSRV_REFCOUNT_CCB_DEBUG_SYNCINFO | +#if defined(SUPPORT_ION) + PVRSRV_REFCOUNT_CCB_DEBUG_ION_SYNC | +#endif PVRSRV_REFCOUNT_CCB_DEBUG_MMAP2; typedef struct @@ -120,7 +125,7 @@ void PVRSRVDumpRefCountCCB(void) /* Early on, we won't have MAX_REFCOUNT_CCB_SIZE messages */ if(!psRefCountCCBEntry->pszFile) - break; + continue; PVR_LOG(("%s %d %s:%d", psRefCountCCBEntry->pcMesg, psRefCountCCBEntry->ui32PID, @@ -477,7 +482,7 @@ void PVRSRVOffsetStructIncRef2(const IMG_CHAR *pszFile, IMG_INT iLine, psOffsetStruct, psOffsetStruct->ui32RefCount, psOffsetStruct->ui32RefCount + 1, - psOffsetStruct->ui32RealByteSize); + psOffsetStruct->uiRealByteSize); gsRefCountCCB[giOffset].pcMesg[PVRSRV_REFCOUNT_CCB_MESG_MAX - 1] = 0; giOffset = (giOffset + 1) % PVRSRV_REFCOUNT_CCB_MAX; @@ -509,7 +514,7 @@ void PVRSRVOffsetStructDecRef2(const IMG_CHAR *pszFile, IMG_INT iLine, psOffsetStruct, psOffsetStruct->ui32RefCount, psOffsetStruct->ui32RefCount - 1, - psOffsetStruct->ui32RealByteSize); + psOffsetStruct->uiRealByteSize); gsRefCountCCB[giOffset].pcMesg[PVRSRV_REFCOUNT_CCB_MESG_MAX - 1] = 0; giOffset = (giOffset + 1) % PVRSRV_REFCOUNT_CCB_MAX; @@ -541,7 +546,7 @@ void PVRSRVOffsetStructIncMapped2(const IMG_CHAR *pszFile, IMG_INT iLine, psOffsetStruct, psOffsetStruct->ui32Mapped, psOffsetStruct->ui32Mapped + 1, - psOffsetStruct->ui32RealByteSize); + psOffsetStruct->uiRealByteSize); gsRefCountCCB[giOffset].pcMesg[PVRSRV_REFCOUNT_CCB_MESG_MAX - 1] = 0; giOffset = (giOffset + 1) % PVRSRV_REFCOUNT_CCB_MAX; @@ -573,7 +578,7 @@ void PVRSRVOffsetStructDecMapped2(const IMG_CHAR *pszFile, IMG_INT iLine, psOffsetStruct, psOffsetStruct->ui32Mapped, psOffsetStruct->ui32Mapped - 1, - psOffsetStruct->ui32RealByteSize); + psOffsetStruct->uiRealByteSize); gsRefCountCCB[giOffset].pcMesg[PVRSRV_REFCOUNT_CCB_MESG_MAX - 1] = 0; giOffset = (giOffset + 1) % PVRSRV_REFCOUNT_CCB_MAX; @@ -583,6 +588,88 @@ skip: psOffsetStruct->ui32Mapped--; } +#if defined(SUPPORT_ION) +PVRSRV_ERROR PVRSRVIonBufferSyncInfoIncRef2(const IMG_CHAR *pszFile, IMG_INT iLine, + IMG_HANDLE hUnique, + IMG_HANDLE hDevCookie, + IMG_HANDLE hDevMemContext, + PVRSRV_ION_SYNC_INFO **ppsIonSyncInfo, + PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo) +{ + PVRSRV_ERROR eError; + + /* + We have to do the call 1st as we need to Ion syninfo which it returns + */ + eError = PVRSRVIonBufferSyncAcquire(hUnique, + hDevCookie, + hDevMemContext, + ppsIonSyncInfo); + + if (eError == PVRSRV_OK) + { + if(!(guiDebugMask & PVRSRV_REFCOUNT_CCB_DEBUG_ION_SYNC)) + goto skip; + + PVRSRV_LOCK_CCB(); + + gsRefCountCCB[giOffset].pszFile = pszFile; + gsRefCountCCB[giOffset].iLine = iLine; + gsRefCountCCB[giOffset].ui32PID = OSGetCurrentProcessIDKM(); + snprintf(gsRefCountCCB[giOffset].pcMesg, + PVRSRV_REFCOUNT_CCB_MESG_MAX - 1, + PVRSRV_REFCOUNT_CCB_FMT_STRING, + "ION_SYNC", + (*ppsIonSyncInfo)->psSyncInfo, + psKernelMemInfo, + NULL, + *ppsIonSyncInfo, + (*ppsIonSyncInfo)->ui32RefCount - 1, + (*ppsIonSyncInfo)->ui32RefCount, + 0); + gsRefCountCCB[giOffset].pcMesg[PVRSRV_REFCOUNT_CCB_MESG_MAX - 1] = 0; + giOffset = (giOffset + 1) % PVRSRV_REFCOUNT_CCB_MAX; + + PVRSRV_UNLOCK_CCB(); + } + +skip: + return eError; +} + +void PVRSRVIonBufferSyncInfoDecRef2(const IMG_CHAR *pszFile, IMG_INT iLine, + PVRSRV_ION_SYNC_INFO *psIonSyncInfo, + PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo) +{ + if(!(guiDebugMask & PVRSRV_REFCOUNT_CCB_DEBUG_ION_SYNC)) + goto skip; + + PVRSRV_LOCK_CCB(); + + gsRefCountCCB[giOffset].pszFile = pszFile; + gsRefCountCCB[giOffset].iLine = iLine; + gsRefCountCCB[giOffset].ui32PID = OSGetCurrentProcessIDKM(); + snprintf(gsRefCountCCB[giOffset].pcMesg, + PVRSRV_REFCOUNT_CCB_MESG_MAX - 1, + PVRSRV_REFCOUNT_CCB_FMT_STRING, + "ION_SYNC", + psIonSyncInfo->psSyncInfo, + psKernelMemInfo, + NULL, + psIonSyncInfo, + psIonSyncInfo->ui32RefCount, + psIonSyncInfo->ui32RefCount - 1, + 0); + gsRefCountCCB[giOffset].pcMesg[PVRSRV_REFCOUNT_CCB_MESG_MAX - 1] = 0; + giOffset = (giOffset + 1) % PVRSRV_REFCOUNT_CCB_MAX; + + PVRSRV_UNLOCK_CCB(); +skip: + PVRSRVIonBufferSyncRelease(psIonSyncInfo); +} + +#endif /* defined (SUPPORT_ION) */ + #endif /* defined(__linux__) */ #endif /* defined(PVRSRV_REFCOUNT_DEBUG) */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/resman.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/resman.c index aef102f..1bb3ebf 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/resman.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/resman.c @@ -359,11 +359,12 @@ IMG_VOID PVRSRVResManDisconnect(PRESMAN_CONTEXT psResManContext, FreeResourceByCriteria(psResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DEVICEMEM_MAPPING, 0, 0, IMG_TRUE); FreeResourceByCriteria(psResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_KERNEL_DEVICEMEM_ALLOCATION, 0, 0, IMG_TRUE); FreeResourceByCriteria(psResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DEVICEMEM_ALLOCATION, 0, 0, IMG_TRUE); - FreeResourceByCriteria(psResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DEVICEMEM_CONTEXT, 0, 0, IMG_TRUE); - FreeResourceByCriteria(psResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_SHARED_MEM_INFO, 0, 0, IMG_TRUE); #if defined(SUPPORT_ION) FreeResourceByCriteria(psResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DEVICEMEM_ION, 0, 0, IMG_TRUE); #endif + FreeResourceByCriteria(psResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DEVICEMEM_CONTEXT, 0, 0, IMG_TRUE); + FreeResourceByCriteria(psResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_SHARED_MEM_INFO, 0, 0, IMG_TRUE); + /* DISPLAY CLASS types: */ FreeResourceByCriteria(psResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DISPLAYCLASS_SWAPCHAIN_REF, 0, 0, IMG_TRUE); FreeResourceByCriteria(psResManContext, RESMAN_CRITERIA_RESTYPE, RESMAN_TYPE_DISPLAYCLASS_DEVICE, 0, 0, IMG_TRUE); @@ -436,13 +437,13 @@ PRESMAN_ITEM ResManRegisterRes(PRESMAN_CONTEXT psResManContext, VALIDATERESLIST(); PVR_DPF((PVR_DBG_MESSAGE, "ResManRegisterRes: register resource " - "Context 0x%x, ResType 0x%x, pvParam 0x%x, ui32Param 0x%x, " - "FreeFunc %08X", - (IMG_UINTPTR_T)psResManContext, + "Context 0x%p, ResType 0x%x, pvParam 0x%p, ui32Param 0x%x, " + "FreeFunc %p", + psResManContext, ui32ResType, - (IMG_UINTPTR_T)pvParam, + pvParam, ui32Param, - (IMG_UINTPTR_T)pfnFreeResource)); + pfnFreeResource)); /* Allocate memory for the new resource structure */ if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, @@ -504,8 +505,8 @@ PVRSRV_ERROR ResManFreeResByPtr(RESMAN_ITEM *psResItem, IMG_BOOL bForceCleanup) return PVRSRV_OK; } - PVR_DPF((PVR_DBG_MESSAGE, "ResManFreeResByPtr: freeing resource at %08X", - (IMG_UINTPTR_T)psResItem)); + PVR_DPF((PVR_DBG_MESSAGE, "ResManFreeResByPtr: freeing resource at %p", + psResItem)); /*Acquire resource list sync object*/ ACQUIRE_SYNC_OBJ; @@ -558,9 +559,9 @@ PVRSRV_ERROR ResManFreeResByCriteria(PRESMAN_CONTEXT psResManContext, VALIDATERESLIST(); PVR_DPF((PVR_DBG_MESSAGE, "ResManFreeResByCriteria: " - "Context 0x%x, Criteria 0x%x, Type 0x%x, Addr 0x%x, Param 0x%x", - (IMG_UINTPTR_T)psResManContext, ui32SearchCriteria, ui32ResType, - (IMG_UINTPTR_T)pvParam, ui32Param)); + "Context 0x%p, Criteria 0x%x, Type 0x%x, Addr 0x%p, Param 0x%x", + psResManContext, ui32SearchCriteria, ui32ResType, + pvParam, ui32Param)); /* Free resources by criteria for this context */ eError = FreeResourceByCriteria(psResManContext, ui32SearchCriteria, @@ -688,17 +689,17 @@ IMG_INTERNAL PVRSRV_ERROR ResManFindResourceByPtr(PRESMAN_CONTEXT psResManContex ACQUIRE_SYNC_OBJ; PVR_DPF((PVR_DBG_MESSAGE, - "FindResourceByPtr: psItem=%08X, psItem->psNext=%08X", - (IMG_UINTPTR_T)psItem, (IMG_UINTPTR_T)psItem->psNext)); + "FindResourceByPtr: psItem=%p, psItem->psNext=%p", + psItem, psItem->psNext)); PVR_DPF((PVR_DBG_MESSAGE, - "FindResourceByPtr: Resource Ctx 0x%x, Type 0x%x, Addr 0x%x, " - "Param 0x%x, FnCall %08X, Flags 0x%x", - (IMG_UINTPTR_T)psResManContext, + "FindResourceByPtr: Resource Ctx 0x%p, Type 0x%x, Addr 0x%p, " + "Param 0x%x, FnCall %p, Flags 0x%x", + psResManContext, psItem->ui32ResType, - (IMG_UINTPTR_T)psItem->pvParam, + psItem->pvParam, psItem->ui32Param, - (IMG_UINTPTR_T)psItem->pfnFreeResource, + psItem->pfnFreeResource, psItem->ui32Flags)); /* Search resource items starting at after the first dummy item */ @@ -754,15 +755,16 @@ static PVRSRV_ERROR FreeResourceByPtr(RESMAN_ITEM *psItem, #endif PVR_DPF((PVR_DBG_MESSAGE, - "FreeResourceByPtr: psItem=%08X, psItem->psNext=%08X", - (IMG_UINTPTR_T)psItem, (IMG_UINTPTR_T)psItem->psNext)); + "FreeResourceByPtr: psItem=%p, psItem->psNext=%p", + psItem, psItem->psNext)); PVR_DPF((PVR_DBG_MESSAGE, - "FreeResourceByPtr: Type 0x%x, Addr 0x%x, " - "Param 0x%x, FnCall %08X, Flags 0x%x", + "FreeResourceByPtr: Type 0x%x, Addr 0x%p, " + "Param 0x%x, FnCall %p, Flags 0x%x", psItem->ui32ResType, - (IMG_UINTPTR_T)psItem->pvParam, psItem->ui32Param, - (IMG_UINTPTR_T)psItem->pfnFreeResource, psItem->ui32Flags)); + psItem->pvParam, + psItem->ui32Param, + psItem->pfnFreeResource, psItem->ui32Flags)); /* Release resource list sync object just in case the free routine calls the resource manager */ RELEASE_SYNC_OBJ; @@ -941,11 +943,11 @@ static IMG_VOID ValidateResList(PRESMAN_LIST psResList) if (psCurContext->ppsThis != ppsThisContext) { PVR_DPF((PVR_DBG_WARNING, - "psCC=%08X psCC->ppsThis=%08X psCC->psNext=%08X ppsTC=%08X", - (IMG_UINTPTR_T)psCurContext, - (IMG_UINTPTR_T)psCurContext->ppsThis, - (IMG_UINTPTR_T)psCurContext->psNext, - (IMG_UINTPTR_T)ppsThisContext)); + "psCC=%p psCC->ppsThis=%p psCC->psNext=%p ppsTC=%p", + psCurContext, + psCurContext->ppsThis, + psCurContext->psNext, + ppsThisContext)); PVR_ASSERT(psCurContext->ppsThis == ppsThisContext); } @@ -959,11 +961,11 @@ static IMG_VOID ValidateResList(PRESMAN_LIST psResList) if (psCurItem->ppsThis != ppsThisItem) { PVR_DPF((PVR_DBG_WARNING, - "psCurItem=%08X psCurItem->ppsThis=%08X psCurItem->psNext=%08X ppsThisItem=%08X", - (IMG_UINTPTR_T)psCurItem, - (IMG_UINTPTR_T)psCurItem->ppsThis, - (IMG_UINTPTR_T)psCurItem->psNext, - (IMG_UINTPTR_T)ppsThisItem)); + "psCurItem=%p psCurItem->ppsThis=%p psCurItem->psNext=%p ppsThisItem=%p", + psCurItem, + psCurItem->ppsThis, + psCurItem->psNext, + ppsThisItem)); PVR_ASSERT(psCurItem->ppsThis == ppsThisItem); } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/ttrace.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/ttrace.c index 574bf25..d1dd788 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/ttrace.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/common/ttrace.c @@ -123,7 +123,7 @@ PVRSRVTimeTraceAllocItem(IMG_UINT32 **pui32Item, IMG_UINT32 ui32Size) { PVRSRV_ERROR eError; - PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVTimeTraceAllocItem: Creating buffer for PID %u", (IMG_UINT32) ui32PID)); + PVR_DPF((PVR_DBG_MESSAGE, "PVRSRVTimeTraceAllocItem: Creating buffer for PID %u", ui32PID)); eError = PVRSRVTimeTraceBufferCreate(ui32PID); if (eError != PVRSRV_OK) { @@ -171,7 +171,7 @@ PVRSRVTimeTraceAllocItem(IMG_UINT32 **pui32Item, IMG_UINT32 ui32Size) psBuffer->ui32Woff = psBuffer->ui32Woff + ui32Size; psBuffer->ui32ByteCount += ui32Size; - /* This allocation will start overwritting past our read pointer, move the read pointer along */ + /* This allocation will start overwriting past our read pointer, move the read pointer along */ while (psBuffer->ui32ByteCount > TIME_TRACE_BUFFER_SIZE) { IMG_UINT32 *psReadItem = (IMG_UINT32 *) &psBuffer->ui8Data[psBuffer->ui32Roff]; @@ -248,6 +248,7 @@ PVRSRV_ERROR PVRSRVTimeTraceBufferCreate(IMG_UINT32 ui32PID) ******************************************************************************/ PVRSRV_ERROR PVRSRVTimeTraceBufferDestroy(IMG_UINT32 ui32PID) { +#if !defined(TTRACE_KEEP_BUFFER_ON_EXIT) sTimeTraceBuffer *psBuffer; #if defined(DUMP_TTRACE_BUFFERS_ON_EXIT) @@ -264,6 +265,9 @@ PVRSRV_ERROR PVRSRVTimeTraceBufferDestroy(IMG_UINT32 ui32PID) PVR_DPF((PVR_DBG_ERROR, "PVRSRVTimeTraceBufferDestroy: Can't find trace buffer in hash table")); return PVRSRV_ERROR_INVALID_PARAMS; +#else + return PVRSRV_OK; +#endif } /*! @@ -535,7 +539,7 @@ static PVRSRV_ERROR PVRSRVDumpTimeTraceBuffer(IMG_UINTPTR_T hKey, IMG_UINTPTR_T IMG_UINT32 ui32Walker = psBuffer->ui32Roff; IMG_UINT32 ui32Read, ui32LineLen, ui32EOL, ui32MinLine; - PVR_DPF((PVR_DBG_ERROR, "TTB for PID %u:\n", (IMG_UINT32) hKey)); + PVR_LOG(("TTB for PID %u:\n", (IMG_UINT32) hKey)); while (ui32ByteCount) { @@ -547,25 +551,25 @@ static PVRSRV_ERROR PVRSRVDumpTimeTraceBuffer(IMG_UINTPTR_T hKey, IMG_UINTPTR_T if (ui32MinLine >= 4) { - PVR_DPF((PVR_DBG_ERROR, "\t(TTB-%X) %08X %08X %08X %08X", ui32ByteCount, + PVR_LOG(("\t(TTB-%X) %08X %08X %08X %08X [", ui32ByteCount, pui32Buffer[0], pui32Buffer[1], pui32Buffer[2], pui32Buffer[3])); ui32Read = 4 * sizeof(IMG_UINT32); } else if (ui32MinLine >= 3) { - PVR_DPF((PVR_DBG_ERROR, "\t(TTB-%X) %08X %08X %08X", ui32ByteCount, + PVR_LOG(("\t(TTB-%X) %08X %08X %08X [", ui32ByteCount, pui32Buffer[0], pui32Buffer[1], pui32Buffer[2])); ui32Read = 3 * sizeof(IMG_UINT32); } else if (ui32MinLine >= 2) { - PVR_DPF((PVR_DBG_ERROR, "\t(TTB-%X) %08X %08X", ui32ByteCount, + PVR_LOG(("\t(TTB-%X) %08X %08X [", ui32ByteCount, pui32Buffer[0], pui32Buffer[1])); ui32Read = 2 * sizeof(IMG_UINT32); } else { - PVR_DPF((PVR_DBG_ERROR, "\t(TTB-%X) %08X", ui32ByteCount, + PVR_LOG(("\t(TTB-%X) %08X [", ui32ByteCount, pui32Buffer[0])); ui32Read = sizeof(IMG_UINT32); } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/mmu.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/mmu.c index 44dc824..8e4f159 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/mmu.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/mmu.c @@ -274,6 +274,10 @@ struct _MMU_HEAP_ static IMG_VOID _DeferredFreePageTable (MMU_HEAP *pMMUHeap, IMG_UINT32 ui32PTIndex, IMG_BOOL bOSFreePT); +#if defined (MEM_TRACK_INFO_DEBUG) +IMG_IMPORT IMG_VOID PVRSRVPrintMemTrackInfo(IMG_UINT32 ui32FaultAddr); +#endif + #if defined(PDUMP) static IMG_VOID MMU_PDumpPageTables (MMU_HEAP *pMMUHeap, @@ -332,7 +336,7 @@ static IMG_VOID CheckPT(MMU_PT_INFO *psPTInfoList) PVR_DPF((PVR_DBG_ERROR, "ui32ValidPTECount: %u ui32Count: %u\n", psPTInfoList->ui32ValidPTECount, ui32Count)); DumpPT(psPTInfoList); - BUG(); + PVR_DBG_BREAK; } } #else /* PT_DEBUG */ @@ -348,7 +352,7 @@ static INLINE IMG_VOID CheckPT(MMU_PT_INFO *psPTInfoList) it read/write when we alter it. This allows us to check that our memory isn't being overwritten */ -#if defined(PVRSRV_MMU_MAKE_READWRITE_ON_DEMAND) +#if defined(__linux__) && defined(PVRSRV_MMU_MAKE_READWRITE_ON_DEMAND) #include <linux/version.h> @@ -848,6 +852,15 @@ _AllocPageTableMemory (MMU_HEAP *pMMUHeap, } else { + /* + We cannot use IMG_SYS_PHYADDR here, as that is 64-bit for 32-bit PAE builds. + The physical address in this call to RA_Alloc is specifically the SysPAddr + of local (card) space, and it is highly unlikely we would ever need to + support > 4GB of local (card) memory (this does assume that such local + memory will be mapped into System physical memory space at a low address so + that any and all local memory exists within the 4GB SYSPAddr range). + */ + IMG_UINTPTR_T uiLocalPAddr; IMG_SYS_PHYADDR sSysPAddr; /* @@ -864,12 +877,15 @@ _AllocPageTableMemory (MMU_HEAP *pMMUHeap, 0, IMG_NULL, 0, - &(sSysPAddr.uiAddr))!= IMG_TRUE) + &uiLocalPAddr)!= IMG_TRUE) { PVR_DPF((PVR_DBG_ERROR, "_AllocPageTableMemory: ERROR call to RA_Alloc failed")); return IMG_FALSE; } + /* Munge the local PAddr back into the SysPAddr */ + sSysPAddr.uiAddr = uiLocalPAddr; + /* derive the CPU virtual address */ sCpuPAddr = SysSysPAddrToCpuPAddr(sSysPAddr); /* note: actual ammount is pMMUHeap->ui32PTSize but must be a multiple of 4k pages */ @@ -986,8 +1002,9 @@ _FreePageTableMemory (MMU_HEAP *pMMUHeap, MMU_PT_INFO *psPTInfoList) /* just free from the first local memory arena (unlikely to be more than one local mem area(?)) + Note that the cast to IMG_UINTPTR_T is ok as we're local mem. */ - RA_Free (pMMUHeap->psDevArena->psDeviceMemoryHeapInfo->psLocalDevMemArena, sSysPAddr.uiAddr, IMG_FALSE); + RA_Free (pMMUHeap->psDevArena->psDeviceMemoryHeapInfo->psLocalDevMemArena, (IMG_UINTPTR_T)sSysPAddr.uiAddr, IMG_FALSE); } } @@ -1308,8 +1325,9 @@ _DeferredAllocPagetables(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR DevVAddr, IMG_UINT if((UINT32_MAX_VALUE - DevVAddr.uiAddr) < (ui32Size + pMMUHeap->ui32DataPageMask + pMMUHeap->ui32PTMask)) { - /* detected overflow, clamp to highest address */ + /* detected overflow, clamp to highest address, reserve all PDs */ sHighDevVAddr.uiAddr = UINT32_MAX_VALUE; + ui32PageTableCount = 1024; } else { @@ -1317,9 +1335,10 @@ _DeferredAllocPagetables(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR DevVAddr, IMG_UINT + ui32Size + pMMUHeap->ui32DataPageMask + pMMUHeap->ui32PTMask; + + ui32PageTableCount = sHighDevVAddr.uiAddr >> pMMUHeap->ui32PDShift; } - ui32PageTableCount = sHighDevVAddr.uiAddr >> pMMUHeap->ui32PDShift; /* Fix allocation of last 4MB */ if (ui32PageTableCount == 0) @@ -1343,10 +1362,18 @@ _DeferredAllocPagetables(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR DevVAddr, IMG_UINT DevVAddr.uiAddr = DevVAddr.uiAddr & (~BRN31620_PDE_CACHE_FILL_MASK); /* Round the end address of the PD allocation to cacheline */ - sHighDevVAddr.uiAddr = ((sHighDevVAddr.uiAddr + (BRN31620_PDE_CACHE_FILL_SIZE - 1)) & (~BRN31620_PDE_CACHE_FILL_MASK)); + if (UINT32_MAX_VALUE - sHighDevVAddr.uiAddr < (BRN31620_PDE_CACHE_FILL_SIZE - 1)) + { + sHighDevVAddr.uiAddr = UINT32_MAX_VALUE; + ui32PageTableCount = 1024; + } + else + { + sHighDevVAddr.uiAddr = ((sHighDevVAddr.uiAddr + (BRN31620_PDE_CACHE_FILL_SIZE - 1)) & (~BRN31620_PDE_CACHE_FILL_MASK)); + ui32PageTableCount = sHighDevVAddr.uiAddr >> pMMUHeap->ui32PDShift; + } ui32PDIndex = DevVAddr.uiAddr >> pMMUHeap->ui32PDShift; - ui32PageTableCount = sHighDevVAddr.uiAddr >> pMMUHeap->ui32PDShift; /* Fix allocation of last 4MB */ if (ui32PageTableCount == 0) @@ -1371,10 +1398,11 @@ _DeferredAllocPagetables(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR DevVAddr, IMG_UINT { ui32Flags |= PDUMP_FLAGS_CONTINUOUS; } - PDUMPCOMMENTWITHFLAGS(ui32Flags, "Alloc PTs (MMU Context ID == %u, PDBaseIndex == %u, Size == 0x%x)", + PDUMPCOMMENTWITHFLAGS(ui32Flags, "Alloc PTs (MMU Context ID == %u, PDBaseIndex == %u, Size == 0x%x, Shared = %s)", pMMUHeap->psMMUContext->ui32PDumpMMUContextID, pMMUHeap->ui32PDBaseIndex, - ui32Size); + ui32Size, + MMU_IsHeapShared(pMMUHeap)?"True":"False"); PDUMPCOMMENTWITHFLAGS(ui32Flags, "Alloc page table (page count == %08X)", ui32PageTableCount); PDUMPCOMMENTWITHFLAGS(ui32Flags, "Page directory mods (page count == %08X)", ui32PageTableCount); } @@ -1424,7 +1452,7 @@ _DeferredAllocPagetables(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR DevVAddr, IMG_UINT if(ppsPTInfoList[i]->hPTPageOSMemHandle == IMG_NULL && ppsPTInfoList[i]->PTPageCpuVAddr == IMG_NULL) { - IMG_DEV_PHYADDR sDevPAddr; + IMG_DEV_PHYADDR sDevPAddr = { 0 }; #if defined(SUPPORT_SGX_MMU_DUMMY_PAGE) IMG_UINT32 *pui32Tmp; IMG_UINT32 j; @@ -1473,7 +1501,9 @@ _DeferredAllocPagetables(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR DevVAddr, IMG_UINT { /* insert Page Table into all memory contexts */ MMU_CONTEXT *psMMUContext = (MMU_CONTEXT*)pMMUHeap->psMMUContext->psDevInfo->pvMMUContextList; - +#if defined(SUPPORT_PDUMP_MULTI_PROCESS) + PVRSRV_SGXDEV_INFO *psDevInfo = psMMUContext->psDevInfo; +#endif while(psMMUContext) { MakeKernelPageReadWrite(psMMUContext->pvPDCpuVAddr); @@ -1482,7 +1512,7 @@ _DeferredAllocPagetables(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR DevVAddr, IMG_UINT pui32PDEntry += ui32PDIndex; /* insert the page, specify the data page size and make the pde valid */ - pui32PDEntry[i] = (sDevPAddr.uiAddr>>SGX_MMU_PDE_ADDR_ALIGNSHIFT) + pui32PDEntry[i] = (IMG_UINT32)(sDevPAddr.uiAddr>>SGX_MMU_PDE_ADDR_ALIGNSHIFT) | pMMUHeap->ui32PDEPageSizeCtrl | SGX_MMU_PDE_VALID; MakeKernelPageReadOnly(psMMUContext->pvPDCpuVAddr); @@ -1492,8 +1522,16 @@ _DeferredAllocPagetables(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR DevVAddr, IMG_UINT if(psMMUContext->bPDumpActive) #endif { - //PDUMPCOMMENT("_DeferredAllocPTs: Dumping shared PDEs on context %d (%s)", psMMUContext->ui32PDumpMMUContextID, (psMMUContext->bPDumpActive) ? "active" : ""); - PDUMPPDENTRIES(&pMMUHeap->sMMUAttrib, psMMUContext->hPDOSMemHandle, (IMG_VOID*)&pui32PDEntry[i], sizeof(IMG_UINT32), 0, IMG_FALSE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG); +#if defined(SUPPORT_PDUMP_MULTI_PROCESS) + /* + Any modification of the uKernel memory context + needs to be PDumped when we're multi-process + */ + IMG_UINT32 ui32HeapFlags = ( psMMUContext->sPDDevPAddr.uiAddr == psDevInfo->sKernelPDDevPAddr.uiAddr ) ? PDUMP_FLAGS_PERSISTENT : 0; +#else + IMG_UINT32 ui32HeapFlags = 0; +#endif + PDUMPPDENTRIES(&pMMUHeap->sMMUAttrib, psMMUContext->hPDOSMemHandle, (IMG_VOID*)&pui32PDEntry[i], sizeof(IMG_UINT32), ui32HeapFlags, IMG_FALSE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG); } #endif /* PDUMP */ /* advance to next context */ @@ -1509,12 +1547,11 @@ _DeferredAllocPagetables(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR DevVAddr, IMG_UINT { MakeKernelPageReadWrite(pMMUHeap->psMMUContext->pvPDCpuVAddr); /* insert Page Table into only this memory context */ - pui32PDEntry[i] = (sDevPAddr.uiAddr>>SGX_MMU_PDE_ADDR_ALIGNSHIFT) + pui32PDEntry[i] = (IMG_UINT32)(sDevPAddr.uiAddr>>SGX_MMU_PDE_ADDR_ALIGNSHIFT) | pMMUHeap->ui32PDEPageSizeCtrl | SGX_MMU_PDE_VALID; MakeKernelPageReadOnly(pMMUHeap->psMMUContext->pvPDCpuVAddr); /* pdump the PD Page modifications */ - //PDUMPCOMMENT("_DeferredAllocPTs: Dumping kernel PDEs on context %d (%s)", pMMUHeap->psMMUContext->ui32PDumpMMUContextID, (pMMUHeap->psMMUContext->bPDumpActive) ? "active" : ""); PDUMPPDENTRIES(&pMMUHeap->sMMUAttrib, pMMUHeap->psMMUContext->hPDOSMemHandle, (IMG_VOID*)&pui32PDEntry[i], sizeof(IMG_UINT32), 0, IMG_FALSE, PDUMP_PD_UNIQUETAG, PDUMP_PT_UNIQUETAG); break; } @@ -1918,6 +1955,15 @@ MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, I } else { + /* + We cannot use IMG_SYS_PHYADDR here, as that is 64-bit for 32-bit PAE builds. + The physical address in this call to RA_Alloc is specifically the SysPAddr + of local (card) space, and it is highly unlikely we would ever need to + support > 4GB of local (card) memory (this does assume that such local + memory will be mapped into System physical memory space at a low address so + that any and all local memory exists within the 4GB SYSPAddr range). + */ + IMG_UINTPTR_T uiLocalPAddr; IMG_SYS_PHYADDR sSysPAddr; /* allocate from the device's local memory arena */ @@ -1930,12 +1976,15 @@ MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, I 0, IMG_NULL, 0, - &(sSysPAddr.uiAddr))!= IMG_TRUE) + &uiLocalPAddr)!= IMG_TRUE) { PVR_DPF((PVR_DBG_ERROR, "MMU_Initialise: ERROR call to RA_Alloc failed")); return PVRSRV_ERROR_FAILED_TO_ALLOC_VIRT_MEMORY; } + /* Munge the local PAddr back into the SysPAddr */ + sSysPAddr.uiAddr = uiLocalPAddr; + /* derive the CPU virtual address */ sCpuPAddr = SysSysPAddrToCpuPAddr(sSysPAddr); sPDDevPAddr = SysSysPAddrToDevPAddr(PVRSRV_DEVICE_TYPE_SGX, sSysPAddr); @@ -1967,12 +2016,15 @@ MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, I 0, IMG_NULL, 0, - &(sSysPAddr.uiAddr))!= IMG_TRUE) + &uiLocalPAddr)!= IMG_TRUE) { PVR_DPF((PVR_DBG_ERROR, "MMU_Initialise: ERROR call to RA_Alloc failed")); return PVRSRV_ERROR_FAILED_TO_ALLOC_VIRT_MEMORY; } + /* Munge the local PAddr back into the SysPAddr */ + sSysPAddr.uiAddr = uiLocalPAddr; + /* derive the CPU virtual address */ sCpuPAddr = SysSysPAddrToCpuPAddr(sSysPAddr); psDevInfo->sDummyPTDevPAddr = SysSysPAddrToDevPAddr(PVRSRV_DEVICE_TYPE_SGX, sSysPAddr); @@ -1996,12 +2048,15 @@ MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, I 0, IMG_NULL, 0, - &(sSysPAddr.uiAddr))!= IMG_TRUE) + &uiLocalPAddr)!= IMG_TRUE) { PVR_DPF((PVR_DBG_ERROR, "MMU_Initialise: ERROR call to RA_Alloc failed")); return PVRSRV_ERROR_FAILED_TO_ALLOC_VIRT_MEMORY; } + /* Munge the local PAddr back into the SysPAddr */ + sSysPAddr.uiAddr = uiLocalPAddr; + /* derive the CPU virtual address */ sCpuPAddr = SysSysPAddrToCpuPAddr(sSysPAddr); psDevInfo->sDummyDataDevPAddr = SysSysPAddrToDevPAddr(PVRSRV_DEVICE_TYPE_SGX, sSysPAddr); @@ -2031,12 +2086,15 @@ MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, I 0, IMG_NULL, 0, - &(sSysPAddr.uiAddr))!= IMG_TRUE) + &uiLocalPAddr)!= IMG_TRUE) { PVR_DPF((PVR_DBG_ERROR, "MMU_Initialise: ERROR call to RA_Alloc failed")); return PVRSRV_ERROR_FAILED_TO_ALLOC_VIRT_MEMORY; } + /* Munge the local PAddr back into the SysPAddr */ + sSysPAddr.uiAddr = uiLocalPAddr; + /* derive the CPU virtual address */ sCpuPAddr = SysSysPAddrToCpuPAddr(sSysPAddr); psDevInfo->sBRN31620DummyPageDevPAddr = SysSysPAddrToDevPAddr(PVRSRV_DEVICE_TYPE_SGX, sSysPAddr); @@ -2069,12 +2127,15 @@ MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, I 0, IMG_NULL, 0, - &(sSysPAddr.uiAddr))!= IMG_TRUE) + &uiLocalPAddr)!= IMG_TRUE) { PVR_DPF((PVR_DBG_ERROR, "MMU_Initialise: ERROR call to RA_Alloc failed")); return PVRSRV_ERROR_FAILED_TO_ALLOC_VIRT_MEMORY; } + /* Munge the local PAddr back into the SysPAddr */ + sSysPAddr.uiAddr = uiLocalPAddr; + /* derive the CPU virtual address */ sCpuPAddr = SysSysPAddrToCpuPAddr(sSysPAddr); psDevInfo->sBRN31620DummyPTDevPAddr = SysSysPAddrToDevPAddr(PVRSRV_DEVICE_TYPE_SGX, sSysPAddr); @@ -2123,13 +2184,7 @@ MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, I } #endif /* SUPPORT_PDUMP_MULTI_PROCESS */ /* pdump the PD malloc */ -#if IMG_ADDRSPACE_PHYSADDR_BITS == 32 - PDUMPCOMMENT("Alloc page directory for new MMU context (PDDevPAddr == 0x%08x)", - sPDDevPAddr.uiAddr); -#else - PDUMPCOMMENT("Alloc page directory for new MMU context, 64-bit arch detected (PDDevPAddr == 0x%08x%08x)", - sPDDevPAddr.uiHighAddr, sPDDevPAddr.uiAddr); -#endif + PDUMPCOMMENT("Alloc page directory for new MMU context (PDDevPAddr == 0x" DEVPADDR_FMT ")", sPDDevPAddr.uiAddr); PDUMPMALLOCPAGETABLE(&psDeviceNode->sDevId, hPDOSMemHandle, 0, pvPDCpuVAddr, SGX_MMU_PAGE_SIZE, 0, PDUMP_PD_UNIQUETAG); #endif /* PDUMP */ @@ -2377,13 +2432,8 @@ MMU_Finalise (MMU_CONTEXT *psMMUContext) PDUMPCLEARMMUCONTEXT(PVRSRV_DEVICE_TYPE_SGX, psMMUContext->psDeviceNode->sDevId.pszPDumpDevName, psMMUContext->ui32PDumpMMUContextID, 2); /* pdump the PD free */ -#if IMG_ADDRSPACE_PHYSADDR_BITS == 32 - PDUMPCOMMENT("Free page directory (PDDevPAddr == 0x%08x)", + PDUMPCOMMENT("Free page directory (PDDevPAddr == 0x" DEVPADDR_FMT ")", psMMUContext->sPDDevPAddr.uiAddr); -#else - PDUMPCOMMENT("Free page directory, 64-bit arch detected (PDDevPAddr == 0x%08x%08x)", - psMMUContext->sPDDevPAddr.uiHighAddr, psMMUContext->sPDDevPAddr.uiAddr); -#endif #endif /* PDUMP */ PDUMPFREEPAGETABLE(&psMMUContext->psDeviceNode->sDevId, psMMUContext->hPDOSMemHandle, psMMUContext->pvPDCpuVAddr, SGX_MMU_PAGE_SIZE, 0, PDUMP_PT_UNIQUETAG); @@ -2467,8 +2517,8 @@ MMU_Finalise (MMU_CONTEXT *psMMUContext) SGX_MMU_PAGE_SIZE, PVRSRV_HAP_WRITECOMBINE|PVRSRV_HAP_KERNEL_ONLY, psMMUContext->hPDOSMemHandle); - /* and free the memory */ - RA_Free (psMMUContext->psDeviceNode->psLocalDevMemArena, sSysPAddr.uiAddr, IMG_FALSE); + /* and free the memory, Note that the cast to IMG_UINTPTR_T is ok as we're local mem. */ + RA_Free (psMMUContext->psDeviceNode->psLocalDevMemArena, (IMG_UINTPTR_T)sSysPAddr.uiAddr, IMG_FALSE); #if defined(SUPPORT_SGX_MMU_DUMMY_PAGE) /* if this is the last context free the dummy pages too */ @@ -2819,16 +2869,16 @@ MMU_UnmapPagesAndFreePTs (MMU_HEAP *psMMUHeap, RETURNS: ******************************************************************************/ static IMG_VOID MMU_FreePageTables(IMG_PVOID pvMMUHeap, - IMG_SIZE_T ui32Start, - IMG_SIZE_T ui32End, + IMG_SIZE_T uStart, + IMG_SIZE_T uEnd, IMG_HANDLE hUniqueTag) { MMU_HEAP *pMMUHeap = (MMU_HEAP*)pvMMUHeap; IMG_DEV_VIRTADDR Start; - Start.uiAddr = (IMG_UINT32)ui32Start; + Start.uiAddr = (IMG_UINT32)uStart; - MMU_UnmapPagesAndFreePTs(pMMUHeap, Start, (IMG_UINT32)((ui32End - ui32Start) >> pMMUHeap->ui32PTShift), hUniqueTag); + MMU_UnmapPagesAndFreePTs(pMMUHeap, Start, (IMG_UINT32)((uEnd - uStart) >> pMMUHeap->ui32PTShift), hUniqueTag); } /*! @@ -3086,7 +3136,7 @@ MMU_Alloc (MMU_HEAP *pMMUHeap, IMG_BOOL bStatus; PVR_DPF ((PVR_DBG_MESSAGE, - "MMU_Alloc: uSize=0x%x, flags=0x%x, align=0x%x", + "MMU_Alloc: uSize=0x%" SIZE_T_FMT_LEN "x, flags=0x%x, align=0x%x", uSize, uFlags, uDevVAddrAlignment)); /* @@ -3108,10 +3158,19 @@ MMU_Alloc (MMU_HEAP *pMMUHeap, &uiAddr); if(!bStatus) { - PVR_DPF((PVR_DBG_ERROR,"MMU_Alloc: RA_Alloc of VMArena failed")); - PVR_DPF((PVR_DBG_ERROR,"MMU_Alloc: Alloc of DevVAddr failed from heap %s ID%d", - pMMUHeap->psDevArena->pszName, - pMMUHeap->psDevArena->ui32HeapID)); + IMG_CHAR asCurrentProcessName[128]; + + PVR_DPF((PVR_DBG_ERROR,"MMU_Alloc: RA_Alloc of VMArena failed")); + OSGetCurrentProcessNameKM(asCurrentProcessName, 128); + PVR_DPF((PVR_DBG_ERROR,"MMU_Alloc: Alloc of DevVAddr failed from heap %s ID%d, pid: %d, task: %s", + pMMUHeap->psDevArena->pszName, + pMMUHeap->psDevArena->ui32HeapID, + OSGetCurrentProcessIDKM(), + asCurrentProcessName)); + #if defined (MEM_TRACK_INFO_DEBUG) + PVRSRVPrintMemTrackInfo(0); + #endif + return bStatus; } @@ -3467,7 +3526,10 @@ MMU_MapPage (MMU_HEAP *pMMUHeap, DevVAddr.uiAddr >> pMMUHeap->ui32PDShift, ui32Index )); PVR_DPF((PVR_DBG_ERROR, "MMU_MapPage: Page table entry value: 0x%08X", uTmp)); - PVR_DPF((PVR_DBG_ERROR, "MMU_MapPage: Physical page to map: 0x%08X", DevPAddr.uiAddr)); + + PVR_DPF((PVR_DBG_ERROR, "MMU_MapPage: Physical page to map: 0x" DEVPADDR_FMT, + DevPAddr.uiAddr)); + #if PT_DUMP DumpPT(ppsPTInfoList[0]); #endif @@ -3483,7 +3545,7 @@ MMU_MapPage (MMU_HEAP *pMMUHeap, MakeKernelPageReadWrite(ppsPTInfoList[0]->PTPageCpuVAddr); /* map in the physical page */ - pui32Tmp[ui32Index] = ((DevPAddr.uiAddr>>SGX_MMU_PTE_ADDR_ALIGNSHIFT) + pui32Tmp[ui32Index] = ((IMG_UINT32)(DevPAddr.uiAddr>>SGX_MMU_PTE_ADDR_ALIGNSHIFT) & ((~pMMUHeap->ui32DataPageMask)>>SGX_MMU_PTE_ADDR_ALIGNSHIFT)) | SGX_MMU_PTE_VALID | ui32MMUFlags; @@ -3546,10 +3608,14 @@ MMU_MapScatter (MMU_HEAP *pMMUHeap, DevVAddr.uiAddr += pMMUHeap->ui32DataPageSize; PVR_DPF ((PVR_DBG_MESSAGE, - "MMU_MapScatter: devVAddr=%08X, SysAddr=%08X, size=0x%x/0x%x", + "MMU_MapScatter: devVAddr=%x, SysAddr=" SYSPADDR_FMT ", size=0x%x/0x%" SIZE_T_FMT_LEN "x", DevVAddr.uiAddr, sSysAddr.uiAddr, uCount, uSize)); } +#if (SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE > 1) + MMU_InvalidatePageTableCache(pMMUHeap->psMMUContext->psDevInfo); +#endif + #if defined(PDUMP) MMU_PDumpPageTables (pMMUHeap, MapBaseDevVAddr, uSize, IMG_FALSE, hUniqueTag); #endif /* #if defined(PDUMP) */ @@ -3589,7 +3655,7 @@ MMU_MapPages (MMU_HEAP *pMMUHeap, PVR_ASSERT (pMMUHeap != IMG_NULL); - PVR_DPF ((PVR_DBG_MESSAGE, "MMU_MapPages: heap:%s, heap_id:%d devVAddr=%08X, SysPAddr=%08X, size=0x%x", + PVR_DPF ((PVR_DBG_MESSAGE, "MMU_MapPages: heap:%s, heap_id:%d devVAddr=%08X, SysPAddr=" SYSPADDR_FMT ", size=0x%" SIZE_T_FMT_LEN "x", pMMUHeap->psDevArena->pszName, pMMUHeap->psDevArena->ui32HeapID, DevVAddr.uiAddr, @@ -3627,6 +3693,10 @@ MMU_MapPages (MMU_HEAP *pMMUHeap, DevPAddr.uiAddr += ui32PAdvance; } +#if (SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE > 1) + MMU_InvalidatePageTableCache(pMMUHeap->psMMUContext->psDevInfo); +#endif + #if defined(PDUMP) MMU_PDumpPageTables (pMMUHeap, MapBaseDevVAddr, uSize, IMG_FALSE, hUniqueTag); #endif /* #if defined(PDUMP) */ @@ -3677,7 +3747,7 @@ MMU_MapPagesSparse (MMU_HEAP *pMMUHeap, PVR_ASSERT (pMMUHeap != IMG_NULL); - PVR_DPF ((PVR_DBG_MESSAGE, "MMU_MapPagesSparse: heap:%s, heap_id:%d devVAddr=%08X, SysPAddr=%08X, VM space=0x%x, PHYS space=0x%x", + PVR_DPF ((PVR_DBG_MESSAGE, "MMU_MapPagesSparse: heap:%s, heap_id:%d devVAddr=%08X, SysPAddr=" SYSPADDR_FMT ", VM space=0x%" SIZE_T_FMT_LEN "x, PHYS space=0x%x", pMMUHeap->psDevArena->pszName, pMMUHeap->psDevArena->ui32HeapID, DevVAddr.uiAddr, @@ -3720,6 +3790,10 @@ MMU_MapPagesSparse (MMU_HEAP *pMMUHeap, } pMMUHeap->bHasSparseMappings = IMG_TRUE; +#if (SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE > 1) + MMU_InvalidatePageTableCache(pMMUHeap->psMMUContext->psDevInfo); +#endif + #if defined(PDUMP) MMU_PDumpPageTables (pMMUHeap, MapBaseDevVAddr, uSizeVM, IMG_FALSE, hUniqueTag); #endif /* #if defined(PDUMP) */ @@ -3772,10 +3846,10 @@ MMU_MapShadow (MMU_HEAP *pMMUHeap, #endif PVR_DPF ((PVR_DBG_MESSAGE, - "MMU_MapShadow: DevVAddr:%08X, Bytes:0x%x, CPUVAddr:%08X", + "MMU_MapShadow: DevVAddr:%08X, Bytes:0x%" SIZE_T_FMT_LEN "x, CPUVAddr:%p", MapBaseDevVAddr.uiAddr, uByteSize, - (IMG_UINTPTR_T)CpuVAddr)); + CpuVAddr)); /* set the virtual and physical advance */ ui32VAdvance = pMMUHeap->ui32DataPageSize; @@ -3817,9 +3891,9 @@ MMU_MapShadow (MMU_HEAP *pMMUHeap, PVR_ASSERT((DevPAddr.uiAddr & pMMUHeap->ui32DataPageMask) == 0); PVR_DPF ((PVR_DBG_MESSAGE, - "Offset=0x%x: CpuVAddr=%08X, CpuPAddr=%08X, DevVAddr=%08X, DevPAddr=%08X", + "Offset=0x%x: CpuVAddr=%p, CpuPAddr=" CPUPADDR_FMT ", DevVAddr=%08X, DevPAddr=" DEVPADDR_FMT, uOffset, - (IMG_UINTPTR_T)CpuVAddr + uOffset, + (IMG_PVOID)((IMG_UINTPTR_T)CpuVAddr + uOffset), CpuPAddr.uiAddr, MapDevVAddr.uiAddr, DevPAddr.uiAddr)); @@ -3831,6 +3905,10 @@ MMU_MapShadow (MMU_HEAP *pMMUHeap, uOffset += ui32PAdvance; } +#if (SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE > 1) + MMU_InvalidatePageTableCache(pMMUHeap->psMMUContext->psDevInfo); +#endif + #if defined(PDUMP) MMU_PDumpPageTables (pMMUHeap, MapBaseDevVAddr, uByteSize, IMG_FALSE, hUniqueTag); #endif /* #if defined(PDUMP) */ @@ -3894,10 +3972,10 @@ MMU_MapShadowSparse (MMU_HEAP *pMMUHeap, #endif PVR_DPF ((PVR_DBG_MESSAGE, - "MMU_MapShadowSparse: DevVAddr:%08X, VM space:0x%x, CPUVAddr:%08X PHYS space:0x%x", + "MMU_MapShadowSparse: DevVAddr:%08X, VM space:0x%" SIZE_T_FMT_LEN "x, CPUVAddr:%p PHYS space:0x%x", MapBaseDevVAddr.uiAddr, uiSizeVM, - (IMG_UINTPTR_T)CpuVAddr, + CpuVAddr, ui32ChunkSize * ui32NumPhysChunks)); /* set the virtual and physical advance */ @@ -3937,9 +4015,9 @@ MMU_MapShadowSparse (MMU_HEAP *pMMUHeap, PVR_ASSERT((DevPAddr.uiAddr & pMMUHeap->ui32DataPageMask) == 0); PVR_DPF ((PVR_DBG_MESSAGE, - "Offset=0x%x: CpuVAddr=%08X, CpuPAddr=%08X, DevVAddr=%08X, DevPAddr=%08X", + "Offset=0x%x: CpuVAddr=%p, CpuPAddr=" CPUPADDR_FMT ", DevVAddr=%08X, DevPAddr=" DEVPADDR_FMT, uOffset, - (IMG_UINTPTR_T)CpuVAddr + uOffset, + (void *)((IMG_UINTPTR_T)CpuVAddr + uOffset), CpuPAddr.uiAddr, MapDevVAddr.uiAddr, DevPAddr.uiAddr)); @@ -3959,6 +4037,11 @@ MMU_MapShadowSparse (MMU_HEAP *pMMUHeap, } pMMUHeap->bHasSparseMappings = IMG_TRUE; + +#if (SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE > 1) + MMU_InvalidatePageTableCache(pMMUHeap->psMMUContext->psDevInfo); +#endif + #if defined(PDUMP) MMU_PDumpPageTables (pMMUHeap, MapBaseDevVAddr, uiSizeVM, IMG_FALSE, hUniqueTag); #endif /* #if defined(PDUMP) */ @@ -4261,6 +4344,16 @@ PVRSRV_ERROR MMU_BIFResetPDAlloc(PVRSRV_SGXDEV_INFO *psDevInfo) { /* non-UMA system */ + /* + We cannot use IMG_SYS_PHYADDR here, as that is 64-bit for 32-bit PAE builds. + The physical address in this call to RA_Alloc is specifically the SysPAddr + of local (card) space, and it is highly unlikely we would ever need to + support > 4GB of local (card) memory (this does assume that such local + memory will be mapped into System physical memory space at a low address so + that any and all local memory exists within the 4GB SYSPAddr range). + */ + IMG_UINTPTR_T uiLocalPAddr; + if(RA_Alloc(psLocalDevMemArena, 3 * SGX_MMU_PAGE_SIZE, IMG_NULL, @@ -4270,12 +4363,15 @@ PVRSRV_ERROR MMU_BIFResetPDAlloc(PVRSRV_SGXDEV_INFO *psDevInfo) 0, IMG_NULL, 0, - &(sMemBlockSysPAddr.uiAddr)) != IMG_TRUE) + &uiLocalPAddr) != IMG_TRUE) { PVR_DPF((PVR_DBG_ERROR, "MMU_BIFResetPDAlloc: ERROR call to RA_Alloc failed")); return PVRSRV_ERROR_OUT_OF_MEMORY; } + /* Munge the local PAddr back into the SysPAddr */ + sMemBlockSysPAddr.uiAddr = uiLocalPAddr; + /* derive the CPU virtual address */ sMemBlockCpuPAddr = SysSysPAddrToCpuPAddr(sMemBlockSysPAddr); pui8MemBlock = OSMapPhysToLin(sMemBlockCpuPAddr, @@ -4342,7 +4438,8 @@ IMG_VOID MMU_BIFResetPDFree(PVRSRV_SGXDEV_INFO *psDevInfo) psDevInfo->hBIFResetPDOSMemHandle); sPDSysPAddr = SysDevPAddrToSysPAddr(PVRSRV_DEVICE_TYPE_SGX, psDevInfo->sBIFResetPDDevPAddr); - RA_Free(psLocalDevMemArena, sPDSysPAddr.uiAddr, IMG_FALSE); + /* Note that the cast to IMG_UINTPTR_T is ok as we're local mem. */ + RA_Free(psLocalDevMemArena, (IMG_UINTPTR_T)sPDSysPAddr.uiAddr, IMG_FALSE); } } @@ -4421,7 +4518,7 @@ PVRSRV_ERROR MMU_MapExtSystemCacheRegs(PVRSRV_DEVICE_NODE *psDeviceNode) { IMG_CHAR szScript[128]; - sprintf(szScript, "MALLOC :EXTSYSCACHE:PA_%08X%08X %u %u 0x%08X\r\n", 0, psDevInfo->sExtSysCacheRegsDevPBase.uiAddr, SGX_MMU_PAGE_SIZE, SGX_MMU_PAGE_SIZE, psDevInfo->sExtSysCacheRegsDevPBase.uiAddr); + sprintf(szScript, "MALLOC :EXTSYSCACHE:PA_%08X%08X %u %u 0x%p\r\n", 0, psDevInfo->sExtSysCacheRegsDevPBase.uiAddr, SGX_MMU_PAGE_SIZE, SGX_MMU_PAGE_SIZE, psDevInfo->sExtSysCacheRegsDevPBase.uiAddr); PDumpOSWriteString2(szScript, PDUMP_FLAGS_CONTINUOUS); } #endif @@ -4454,13 +4551,13 @@ PVRSRV_ERROR MMU_MapExtSystemCacheRegs(PVRSRV_DEVICE_NODE *psDeviceNode) eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, - "WRW :%s:PA_%08X%08X:0x%08X :%s:PA_%08X%08X:0x%08X\r\n", + "WRW :%s:PA_%p%p:0x%08X :%s:PA_%p%08X:0x%08X\r\n", sMMUAttrib.sDevId.pszPDumpDevName, - (IMG_UINT32)(IMG_UINTPTR_T)PDUMP_PT_UNIQUETAG, - (sDevPAddr.uiAddr) & ~ui32PageMask, + PDUMP_PT_UNIQUETAG, + (IMG_PVOID)((sDevPAddr.uiAddr) & ~ui32PageMask), (sDevPAddr.uiAddr) & ui32PageMask, "EXTSYSCACHE", - (IMG_UINT32)(IMG_UINTPTR_T)PDUMP_PD_UNIQUETAG, + PDUMP_PD_UNIQUETAG, (ui32PTE & sMMUAttrib.ui32PDEMask) << sMMUAttrib.ui32PTEAlignShift, ui32PTE & ~sMMUAttrib.ui32PDEMask); if(eErr != PVRSRV_OK) @@ -4560,7 +4657,7 @@ static IMG_VOID PageTest(IMG_VOID* pMem, IMG_DEV_PHYADDR sDevPAddr) if (ui32WriteData != ui32ReadData) { // Mem fault - PVR_DPF ((PVR_DBG_ERROR, "Error - memory page test failed at device phys address 0x%08X", sDevPAddr.uiAddr + (n<<2) )); + PVR_DPF ((PVR_DBG_ERROR, "Error - memory page test failed at device phys address 0x" DEVPADDR_FMT, sDevPAddr.uiAddr + (n<<2) )); PVR_DBG_BREAK; bOK = IMG_FALSE; } @@ -4576,7 +4673,7 @@ static IMG_VOID PageTest(IMG_VOID* pMem, IMG_DEV_PHYADDR sDevPAddr) if (ui32WriteData != ui32ReadData) { // Mem fault - PVR_DPF ((PVR_DBG_ERROR, "Error - memory page test failed at device phys address 0x%08X", sDevPAddr.uiAddr + (n<<2) )); + PVR_DPF ((PVR_DBG_ERROR, "Error - memory page test failed at device phys address 0x" DEVPADDR_FMT, sDevPAddr.uiAddr + (n<<2))); PVR_DBG_BREAK; bOK = IMG_FALSE; } @@ -4584,11 +4681,11 @@ static IMG_VOID PageTest(IMG_VOID* pMem, IMG_DEV_PHYADDR sDevPAddr) if (bOK) { - PVR_DPF ((PVR_DBG_VERBOSE, "MMU Page 0x%08X is OK", sDevPAddr.uiAddr)); + PVR_DPF ((PVR_DBG_VERBOSE, "MMU Page 0x" DEVPADDR_FMT " is OK", sDevPAddr.uiAddr)); } else { - PVR_DPF ((PVR_DBG_VERBOSE, "MMU Page 0x%08X *** FAILED ***", sDevPAddr.uiAddr)); + PVR_DPF ((PVR_DBG_VERBOSE, "MMU Page 0x" DEVPADDR_FMT " *** FAILED ***", sDevPAddr.uiAddr)); } } #endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/pb.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/pb.c index 4ed18bb..26e2ded 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/pb.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/pb.c @@ -100,7 +100,7 @@ SGXFindSharedPBDescKM(PVRSRV_PER_PROCESS_DATA *psPerProc, ui32TotalPBSize, psStubPBDesc->ui32TotalPBSize)); } - if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, + if(OSAllocMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_KERNEL_MEM_INFO *) * psStubPBDesc->ui32SubKernelMemInfosCount, (IMG_VOID **)&ppsSharedPBDescSubKernelMemInfos, diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgx_bridge_km.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgx_bridge_km.h index f281c4e..260a265 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgx_bridge_km.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgx_bridge_km.h @@ -55,28 +55,16 @@ extern "C" { #endif IMG_IMPORT -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSFER_SGX_KICK_KM *psKick); -#else PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSFER_SGX_KICK *psKick); -#endif #if defined(SGX_FEATURE_2D_HARDWARE) IMG_IMPORT -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK_KM *psKick); -#else PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK *psKick); #endif -#endif IMG_IMPORT PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, -#if defined (SUPPORT_SID_INTERFACE) - SGX_CCB_KICK_KM *psCCBKick); -#else SGX_CCB_KICK *psCCBKick); -#endif IMG_IMPORT PVRSRV_ERROR SGXGetPhysPageAddrKM(IMG_HANDLE hDevMemHeap, @@ -114,21 +102,12 @@ PVRSRV_ERROR SGX2DQueryBlitsCompleteKM(PVRSRV_SGXDEV_INFO *psDevInfo, IMG_IMPORT PVRSRV_ERROR SGXGetInfoForSrvinitKM(IMG_HANDLE hDevHandle, -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_HEAP_INFO_KM *pasHeapInfo, - IMG_DEV_PHYADDR *psPDDevPAddr); -#else SGX_BRIDGE_INFO_FOR_SRVINIT *psInitInfo); -#endif IMG_IMPORT PVRSRV_ERROR DevInitSGXPart2KM(PVRSRV_PER_PROCESS_DATA *psPerProc, IMG_HANDLE hDevHandle, -#if defined (SUPPORT_SID_INTERFACE) - SGX_BRIDGE_INIT_INFO_KM *psInitInfo); -#else SGX_BRIDGE_INIT_INFO *psInitInfo); -#endif /*! * ***************************************************************************** @@ -262,11 +241,7 @@ SGXAddSharedPBDescKM(PVRSRV_PER_PROCESS_DATA *psPerProc, ********************************************************************************/ IMG_IMPORT PVRSRV_ERROR SGXGetInternalDevInfoKM(IMG_HANDLE hDevCookie, -#if defined (SUPPORT_SID_INTERFACE) - SGX_INTERNAL_DEVINFO_KM *psSGXInternalDevInfo); -#else SGX_INTERNAL_DEVINFO *psSGXInternalDevInfo); -#endif #if defined (__cplusplus) } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxconfig.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxconfig.h index b9ebab9..632ab51 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxconfig.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxconfig.h @@ -56,13 +56,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_KERNEL_DATA_HEAP_OFFSET 0x00000000 #endif -#if !defined(ION_HEAP_SIZE) && defined(SUPPORT_ION) - /* Default the Ion heap to 16MB */ - #define ION_HEAP_SIZE 0x01000000 -#else - #define ION_HEAP_SIZE 0 -#endif - #if SGX_FEATURE_ADDRESS_SPACE_SIZE == 32 #if defined(FIX_HW_BRN_31620) @@ -78,7 +71,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * For hybrid PB we have to split virtual PB range between the shared * PB and percontext PB due to the fact we only have one heap config * per device. - * If hybrid PB is enabled we split the space acording to HYBRID_SHARED_PB_SIZE. + * If hybrid PB is enabled we split the space according to HYBRID_SHARED_PB_SIZE. * i.e. HYBRID_SHARED_PB_SIZE defines the size of the shared PB and the * remainder is the size of the percontext PB. * If hybrid PB is not enabled then we still create both heaps (helps keep @@ -109,10 +102,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif #define SGX_SHARED_3DPARAMETERS_HEAP_BASE 0xC0000000 - /* Size is defiend above */ + /* Size is defined above */ #define SGX_PERCONTEXT_3DPARAMETERS_HEAP_BASE (SGX_SHARED_3DPARAMETERS_HEAP_BASE + SGX_SHARED_3DPARAMETERS_SIZE) - /* Size is defiend above */ + /* Size is defined above */ #define SGX_TADATA_HEAP_BASE 0xD0000000 #define SGX_TADATA_HEAP_SIZE (0x0D000000-0x00001000) @@ -151,16 +144,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif #if !defined(SUPPORT_MEMORY_TILING) - #if defined (SUPPORT_ION) - #define SGX_GENERAL_HEAP_BASE 0x10000000 - #define SGX_GENERAL_HEAP_SIZE (0xC2000000-ION_HEAP_SIZE-0x00001000) - - #define SGX_ION_HEAP_BASE (SGX_GENERAL_HEAP_BASE+SGX_GENERAL_HEAP_SIZE+0x00001000) - #define SGX_ION_HEAP_SIZE (ION_HEAP_SIZE-0x00001000) - #else - #define SGX_GENERAL_HEAP_BASE 0x10000000 - #define SGX_GENERAL_HEAP_SIZE (0xC2000000-0x00001000) - #endif + #define SGX_GENERAL_HEAP_BASE 0x10000000 + #define SGX_GENERAL_HEAP_SIZE (0xC2000000-0x00001000) #else #include <sgx_msvdx_defs.h> /* Create heaps with memory tiling enabled. @@ -185,7 +170,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * For hybrid PB we have to split virtual PB range between the shared * PB and percontext PB due to the fact we only have one heap config * per device. - * If hybrid PB is enabled we split the space acording to HYBRID_SHARED_PB_SIZE. + * If hybrid PB is enabled we split the space according to HYBRID_SHARED_PB_SIZE. * i.e. HYBRID_SHARED_PB_SIZE defines the size of the shared PB and the * remainder is the size of the percontext PB. * If hybrid PB is not enabled then we still create both heaps (helps keep @@ -216,10 +201,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif #define SGX_SHARED_3DPARAMETERS_HEAP_BASE 0xD2000000 - /* Size is defiend above */ + /* Size is defined above */ #define SGX_PERCONTEXT_3DPARAMETERS_HEAP_BASE (SGX_SHARED_3DPARAMETERS_HEAP_BASE + SGX_SHARED_3DPARAMETERS_SIZE) - /* Size is defiend above */ + /* Size is defined above */ #define SGX_TADATA_HEAP_BASE 0xE2000000 #define SGX_TADATA_HEAP_SIZE (0x0D000000-0x00001000) @@ -258,26 +243,22 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_GENERAL_MAPPING_HEAP_SIZE (0x01800000-0x00001000-0x00001000) #define SGX_GENERAL_HEAP_BASE 0x01800000 - #define SGX_GENERAL_HEAP_SIZE (0x07000000-ION_HEAP_SIZE-0x00001000) + #define SGX_GENERAL_HEAP_SIZE (0x07000000-0x00001000) #else #define SGX_GENERAL_HEAP_BASE 0x00001000 #if defined(SUPPORT_LARGE_GENERAL_HEAP) - #define SGX_GENERAL_HEAP_SIZE (0x0B800000-ION_HEAP_SIZE-0x00001000-0x00001000) + #define SGX_GENERAL_HEAP_SIZE (0x0B800000-0x00001000-0x00001000) #else - #define SGX_GENERAL_HEAP_SIZE (0x08800000-ION_HEAP_SIZE-0x00001000-0x00001000) + #define SGX_GENERAL_HEAP_SIZE (0x08800000-0x00001000-0x00001000) #endif #endif -#if defined(SUPPORT_ION) - #define SGX_ION_HEAP_BASE (SGX_GENERAL_HEAP_BASE+SGX_GENERAL_HEAP_SIZE+0x00001000) - #define SGX_ION_HEAP_SIZE (ION_HEAP_SIZE-0x00001000) -#endif /* * For hybrid PB we have to split virtual PB range between the shared * PB and percontext PB due to the fact we only have one heap config * per device. - * If hybrid PB is enabled we split the space acording to HYBRID_SHARED_PB_SIZE. + * If hybrid PB is enabled we split the space according to HYBRID_SHARED_PB_SIZE. * i.e. HYBRID_SHARED_PB_SIZE defines the size of the shared PB and the * remainder is the size of the percontext PB. * If hybrid PB is not enabled then we still create both heaps (helps keep @@ -428,11 +409,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #error "sgxconfig.h: ERROR: SGX_VPB_TILED_HEAP overlaps SGX_3DPARAMETERS_HEAP" #endif #else - #if defined(SUPPORT_ION) - #if ((SGX_ION_HEAP_BASE + SGX_ION_HEAP_SIZE) >= SGX_SHARED_3DPARAMETERS_HEAP_BASE) - #error "sgxconfig.h: ERROR: SGX_ION_HEAP overlaps SGX_3DPARAMETERS_HEAP" - #endif - #endif #if ((SGX_GENERAL_HEAP_BASE + SGX_GENERAL_HEAP_SIZE) >= SGX_SHARED_3DPARAMETERS_HEAP_BASE) #error "sgxconfig.h: ERROR: SGX_GENERAL_HEAP overlaps SGX_3DPARAMETERS_HEAP" #endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxinfokm.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxinfokm.h index b143347..9a1ffcd 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxinfokm.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxinfokm.h @@ -71,7 +71,37 @@ extern "C" { /*Forward declaration*/ typedef struct _PVRSRV_STUB_PBDESC_ PVRSRV_STUB_PBDESC; +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) +typedef struct _PVRSRV_SYSTRACE_JOB_ +{ + IMG_UINT32 ui32JobID; + IMG_UINT32 ui32FrameNum; + IMG_UINT32 ui32RTData; + +} PVRSRV_SYSTRACE_JOB; +typedef struct _PVRSRV_SYSTRACE_CONTEXT_ +{ + IMG_UINT32 ui32PID; + IMG_UINT32 ui32CtxID; + + /*Every PID has a circular buffer of jobs*/ + IMG_UINT32 ui32Start; + IMG_UINT32 ui32End; + IMG_UINT32 ui32CurrentJobID; + PVRSRV_SYSTRACE_JOB asJobs[16]; + +} PVRSRV_SYSTRACE_CONTEXT; + +typedef struct _PVRSRV_SYSTRACE_DATA_ +{ + IMG_UINT64 ui64LastHostTimestamp; + IMG_UINT32 ui32LastSGXClocksx16; + IMG_UINT32 ui32Index; + IMG_UINT32 ui32CurrentCtxID; + PVRSRV_SYSTRACE_CONTEXT asSystraceContext[8]; +} PVRSRV_SYSTRACE_DATA; +#endif typedef struct _PVRSRV_SGX_CCB_INFO_ *PPVRSRV_SGX_CCB_INFO; @@ -149,12 +179,6 @@ typedef struct _PVRSRV_SGXDEV_INFO_ PPVRSRV_KERNEL_MEM_INFO psKernelHWPerfCBMemInfo; /*!< Meminfo for hardware performace circular buffer */ PPVRSRV_KERNEL_MEM_INFO psKernelTASigBufferMemInfo; /*!< Meminfo for TA signature buffer */ PPVRSRV_KERNEL_MEM_INFO psKernel3DSigBufferMemInfo; /*!< Meminfo for 3D signature buffer */ -#if defined(FIX_HW_BRN_29702) - PPVRSRV_KERNEL_MEM_INFO psKernelCFIMemInfo; /*!< Meminfo for cfi */ -#endif -#if defined(FIX_HW_BRN_29823) - PPVRSRV_KERNEL_MEM_INFO psKernelDummyTermStreamMemInfo; /*!< Meminfo for dummy terminate stream */ -#endif #if defined(SGX_FEATURE_VDM_CONTEXT_SWITCH) && \ defined(FIX_HW_BRN_33657) && defined(SUPPORT_SECURE_33657_FIX) PPVRSRV_KERNEL_MEM_INFO psKernelVDMStateUpdateBufferMemInfo; /*!< Meminfo for state update buffer */ @@ -265,6 +289,11 @@ typedef struct _PVRSRV_SGXDEV_INFO_ IMG_HANDLE hKernelMMUContext; #endif +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) + IMG_BOOL bSystraceInitialised; + PVRSRV_SYSTRACE_DATA *psSystraceData; +#endif + } PVRSRV_SGXDEV_INFO; @@ -381,12 +410,6 @@ typedef struct _SGX_BRIDGE_INIT_INFO_KM_ IMG_HANDLE hKernelTASigBufferMemInfo; IMG_HANDLE hKernel3DSigBufferMemInfo; -#if defined(FIX_HW_BRN_29702) - IMG_HANDLE hKernelCFIMemInfo; -#endif -#if defined(FIX_HW_BRN_29823) - IMG_HANDLE hKernelDummyTermStreamMemInfo; -#endif #if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) IMG_HANDLE hKernelEDMStatusBufferMemInfo; #endif @@ -566,6 +589,8 @@ PVRSRV_ERROR SGXPostClockSpeedChange(IMG_HANDLE hDevHandle, IMG_VOID SGXPanic(PVRSRV_SGXDEV_INFO *psDevInfo); +IMG_VOID RunSGXREGDebugScripts(PVRSRV_SGXDEV_INFO *psDevInfo); + IMG_VOID SGXDumpDebugInfo (PVRSRV_SGXDEV_INFO *psDevInfo, IMG_BOOL bDumpSGXRegs); diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxinit.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxinit.c index 3162978..04b1748 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxinit.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxinit.c @@ -68,6 +68,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "srvkm.h" #include "ttrace.h" +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) +#include "systrace.h" +#endif + IMG_UINT32 g_ui32HostIRQCountSample = 0; #if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) @@ -195,11 +199,7 @@ static IMG_UINT32 DeinitDevInfo(PVRSRV_SGXDEV_INFO *psDevInfo) ******************************************************************************/ static PVRSRV_ERROR InitDevInfo(PVRSRV_PER_PROCESS_DATA *psPerProc, PVRSRV_DEVICE_NODE *psDeviceNode, -#if defined (SUPPORT_SID_INTERFACE) - SGX_BRIDGE_INIT_INFO_KM *psInitInfo) -#else SGX_BRIDGE_INIT_INFO *psInitInfo) -#endif { PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice; PVRSRV_ERROR eError; @@ -237,12 +237,6 @@ static PVRSRV_ERROR InitDevInfo(PVRSRV_PER_PROCESS_DATA *psPerProc, #endif psDevInfo->psKernelTASigBufferMemInfo = psInitInfo->hKernelTASigBufferMemInfo; psDevInfo->psKernel3DSigBufferMemInfo = psInitInfo->hKernel3DSigBufferMemInfo; -#if defined(FIX_HW_BRN_29702) - psDevInfo->psKernelCFIMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psInitInfo->hKernelCFIMemInfo; -#endif -#if defined(FIX_HW_BRN_29823) - psDevInfo->psKernelDummyTermStreamMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psInitInfo->hKernelDummyTermStreamMemInfo; -#endif #if defined(SGX_FEATURE_VDM_CONTEXT_SWITCH) && \ defined(FIX_HW_BRN_33657) && defined(SUPPORT_SECURE_33657_FIX) psDevInfo->psKernelVDMStateUpdateBufferMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psInitInfo->hKernelVDMStateUpdateBufferMemInfo; @@ -340,13 +334,21 @@ static PVRSRV_ERROR SGXRunScript(PVRSRV_SGXDEV_INFO *psDevInfo, SGX_INIT_COMMAND } case SGX_INIT_OP_READ_HW_REG: { - OSReadHWReg(psDevInfo->pvRegsBaseKM, psComm->sReadHWReg.ui32Offset); + psComm->sReadHWReg.ui32Value = OSReadHWReg(psDevInfo->pvRegsBaseKM, psComm->sReadHWReg.ui32Offset); #if defined(PDUMP) PDUMPCOMMENT("SGXRunScript: Read HW reg operation"); PDumpRegRead(SGX_PDUMPREG_NAME, psComm->sReadHWReg.ui32Offset, PDUMP_FLAGS_CONTINUOUS); #endif break; } + case SGX_INIT_OP_PRINT_HW_REG: + { + psComm->sReadHWReg.ui32Value = OSReadHWReg(psDevInfo->pvRegsBaseKM, psComm->sReadHWReg.ui32Offset); + PVR_LOG(("\t(SGXREG) 0x%08X : 0x%08X", psComm->sReadHWReg.ui32Offset, psComm->sReadHWReg.ui32Value)); + + break; + } + #if defined(PDUMP) case SGX_INIT_OP_PDUMP_HW_REG: { @@ -373,6 +375,72 @@ static PVRSRV_ERROR SGXRunScript(PVRSRV_SGXDEV_INFO *psDevInfo, SGX_INIT_COMMAND return PVRSRV_ERROR_UNKNOWN_SCRIPT_OPERATION; } +/* Run scripts on given core */ +static PVRSRV_ERROR SGXRunScriptOnCore(PVRSRV_SGXDEV_INFO *psDevInfo, SGX_INIT_COMMAND *psScript, IMG_UINT32 ui32NumInitCommands, IMG_UINT32 ui32CoreNum) +{ + IMG_UINT32 ui32PC; + SGX_INIT_COMMAND *psComm; + +#if !defined(SGX_FEATURE_MP) + PVR_UNREFERENCED_PARAMETER(ui32CoreNum); +#endif + + for (ui32PC = 0, psComm = psScript; + ui32PC < ui32NumInitCommands; + ui32PC++, psComm++) + { + switch (psComm->eOp) + { + case SGX_INIT_OP_WRITE_HW_REG: + { + OSWriteHWReg(psDevInfo->pvRegsBaseKM, SGX_MP_CORE_SELECT(psComm->sWriteHWReg.ui32Offset,ui32CoreNum), psComm->sWriteHWReg.ui32Value); + PDUMPCOMMENT("SGXRunScriptOnCore: Write HW reg operation"); + PDUMPREG(SGX_PDUMPREG_NAME, SGX_MP_CORE_SELECT(psComm->sWriteHWReg.ui32Offset,ui32CoreNum), psComm->sWriteHWReg.ui32Value); + break; + } + case SGX_INIT_OP_READ_HW_REG: + { + psComm->sReadHWReg.ui32Value = OSReadHWReg(psDevInfo->pvRegsBaseKM, SGX_MP_CORE_SELECT(psComm->sReadHWReg.ui32Offset, ui32CoreNum)); +#if defined(PDUMP) + PDUMPCOMMENT("SGXRunScriptOnCore: Read HW reg operation"); + PDumpRegRead(SGX_PDUMPREG_NAME, SGX_MP_CORE_SELECT(psComm->sReadHWReg.ui32Offset,ui32CoreNum), PDUMP_FLAGS_CONTINUOUS); +#endif + break; + } + case SGX_INIT_OP_PRINT_HW_REG: + { + psComm->sReadHWReg.ui32Value = OSReadHWReg(psDevInfo->pvRegsBaseKM, SGX_MP_CORE_SELECT(psComm->sReadHWReg.ui32Offset,ui32CoreNum)); + PVR_LOG(("\t(SGXREG) 0x%08X : 0x%08X", SGX_MP_CORE_SELECT(psComm->sReadHWReg.ui32Offset, ui32CoreNum), psComm->sReadHWReg.ui32Value)); + + break; + } + +#if defined(PDUMP) + case SGX_INIT_OP_PDUMP_HW_REG: + { + PDUMPCOMMENT("SGXRunScriptOnCore: Dump HW reg operation"); + PDUMPREG(SGX_PDUMPREG_NAME, SGX_MP_CORE_SELECT(psComm->sPDumpHWReg.ui32Offset, ui32CoreNum), psComm->sPDumpHWReg.ui32Value); + break; + } +#endif + case SGX_INIT_OP_HALT: + { + return PVRSRV_OK; + } + case SGX_INIT_OP_ILLEGAL: + /* FALLTHROUGH */ + default: + { + PVR_DPF((PVR_DBG_ERROR,"SGXRunScriptOnCore: PC %d: Illegal command: %d", ui32PC, psComm->eOp)); + return PVRSRV_ERROR_UNKNOWN_SCRIPT_OPERATION; + } + } + + } + + return PVRSRV_ERROR_UNKNOWN_SCRIPT_OPERATION; +} + #if defined(SUPPORT_MEMORY_TILING) static PVRSRV_ERROR SGX_AllocMemTilingRangeInt(PVRSRV_SGXDEV_INFO *psDevInfo, IMG_UINT32 ui32Start, @@ -848,11 +916,7 @@ static PVRSRV_ERROR DevInitSGXPart1 (IMG_VOID *pvDeviceNode) ******************************************************************************/ IMG_EXPORT -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR SGXGetInfoForSrvinitKM(IMG_HANDLE hDevHandle, PVRSRV_HEAP_INFO_KM *pasHeapInfo, IMG_DEV_PHYADDR *psPDDevPAddr) -#else PVRSRV_ERROR SGXGetInfoForSrvinitKM(IMG_HANDLE hDevHandle, SGX_BRIDGE_INFO_FOR_SRVINIT *psInitInfo) -#endif { PVRSRV_DEVICE_NODE *psDeviceNode; PVRSRV_SGXDEV_INFO *psDevInfo; @@ -863,15 +927,9 @@ PVRSRV_ERROR SGXGetInfoForSrvinitKM(IMG_HANDLE hDevHandle, SGX_BRIDGE_INFO_FOR_S psDeviceNode = (PVRSRV_DEVICE_NODE *)hDevHandle; psDevInfo = (PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice; -#if defined (SUPPORT_SID_INTERFACE) - *psPDDevPAddr = psDevInfo->sKernelPDDevPAddr; - - eError = PVRSRVGetDeviceMemHeapsKM(hDevHandle, pasHeapInfo); -#else psInitInfo->sPDDevPAddr = psDevInfo->sKernelPDDevPAddr; eError = PVRSRVGetDeviceMemHeapsKM(hDevHandle, &psInitInfo->asHeapInfo[0]); -#endif if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR,"SGXGetInfoForSrvinit: PVRSRVGetDeviceMemHeapsKM failed (%d)", eError)); @@ -898,11 +956,7 @@ PVRSRV_ERROR SGXGetInfoForSrvinitKM(IMG_HANDLE hDevHandle, SGX_BRIDGE_INFO_FOR_S IMG_EXPORT PVRSRV_ERROR DevInitSGXPart2KM (PVRSRV_PER_PROCESS_DATA *psPerProc, IMG_HANDLE hDevHandle, -#if defined (SUPPORT_SID_INTERFACE) - SGX_BRIDGE_INIT_INFO_KM *psInitInfo) -#else SGX_BRIDGE_INIT_INFO *psInitInfo) -#endif { PVRSRV_DEVICE_NODE *psDeviceNode; PVRSRV_SGXDEV_INFO *psDevInfo; @@ -1158,8 +1212,7 @@ static PVRSRV_ERROR DevDeInitSGX (IMG_VOID *pvDeviceNode) } } #endif /* #ifdef SGX_FEATURE_HOST_PORT */ - - + /* DeAllocate devinfo */ OSFreeMem(PVRSRV_OS_NON_PAGEABLE_HEAP, sizeof(PVRSRV_SGXDEV_INFO), @@ -1181,35 +1234,6 @@ static PVRSRV_ERROR DevDeInitSGX (IMG_VOID *pvDeviceNode) } -#if defined(RESTRICTED_REGISTERS) && defined(SGX_FEATURE_MP) - -/*! -******************************************************************************* - - @Function SGXDumpMasterDebugReg - - @Description - - Dump a single SGX debug register value - - @Input psDevInfo - SGX device info - @Input pszName - string used for logging - @Input ui32RegAddr - SGX register offset - - @Return IMG_VOID - -******************************************************************************/ -static IMG_VOID SGXDumpMasterDebugReg (PVRSRV_SGXDEV_INFO *psDevInfo, - IMG_CHAR *pszName, - IMG_UINT32 ui32RegAddr) -{ - IMG_UINT32 ui32RegVal; - ui32RegVal = OSReadHWReg(psDevInfo->pvRegsBaseKM, ui32RegAddr); - PVR_LOG(("(HYD) %s%08X", pszName, ui32RegVal)); -} - -#endif /* defined(RESTRICTED_REGISTERS) */ - /*! ******************************************************************************* @@ -1251,9 +1275,45 @@ static INLINE IMG_UINT32 GetDirListBaseReg(IMG_UINT32 ui32Index) } #endif -#if defined(CONFIG_DSSCOMP) -void dsscomp_kdump(void); +/*! + * ************************************************************************** + * @Function RunSGXREGDebugScripts + * @Description Runs the SGXREG debug scripts + * + * @Input PVRSRV_SGXDEV_INFO + * @Output + * @Return IMG_VOID + * **************************************************************************/ + +IMG_VOID RunSGXREGDebugScripts (PVRSRV_SGXDEV_INFO *psDevInfo) +{ + IMG_UINT32 ui32Core; + PVRSRV_ERROR eError; + + /* Run SGXREGDebug scripts */ +#if defined(SGX_FEATURE_MP) + PVR_LOG(("(HYD)")); + eError = SGXRunScript(psDevInfo, psDevInfo->sScripts.asSGXREGDebugCommandsMaster, SGX_MAX_PRINT_COMMANDS); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"RunSGXREGDebugScripts: SGXREGDebugCommandsMaster SGXRunScript failed (%d)", eError)); + } #endif + + /* Run on each core */ + for (ui32Core = 0; ui32Core < SGX_FEATURE_MP_CORE_COUNT_3D; ui32Core++) + { + PVR_LOG(("(P%u)",ui32Core)); + eError = SGXRunScriptOnCore(psDevInfo, psDevInfo->sScripts.asSGXREGDebugCommandsSlave, SGX_MAX_PRINT_COMMANDS, ui32Core); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"RunSGXREGDebugScripts: SGXREGDebugCommandsSlave SGXRunScript failed (%d)", eError)); + } + } + /* Scripts end */ +} + + /*! ******************************************************************************* @@ -1275,43 +1335,23 @@ IMG_VOID SGXDumpDebugInfo (PVRSRV_SGXDEV_INFO *psDevInfo, { IMG_UINT32 ui32CoreNum; -#if defined(CONFIG_DSSCOMP) - dsscomp_kdump(); -#endif - PVR_LOG(("SGX debug (%s)", PVRVERSION_STRING)); if (bDumpSGXRegs) { - PVR_DPF((PVR_DBG_ERROR,"SGX Register Base Address (Linear): 0x%08X", (IMG_UINTPTR_T)psDevInfo->pvRegsBaseKM)); - PVR_DPF((PVR_DBG_ERROR,"SGX Register Base Address (Physical): 0x%08X", psDevInfo->sRegsPhysBase.uiAddr)); + PVR_DPF((PVR_DBG_ERROR,"SGX Register Base Address (Linear): 0x%p", psDevInfo->pvRegsBaseKM)); + PVR_DPF((PVR_DBG_ERROR,"SGX Register Base Address (Physical): 0x" SYSPADDR_FMT, psDevInfo->sRegsPhysBase.uiAddr)); + + /* Run SGXREGDebug Scripts */ + PVR_LOG(("Running SGXREG Debug Scripts:")); + RunSGXREGDebugScripts(psDevInfo); + PVR_LOG(("SGX Register Dump:")); SGXDumpDebugReg(psDevInfo, 0, "EUR_CR_CORE_ID: ", EUR_CR_CORE_ID); SGXDumpDebugReg(psDevInfo, 0, "EUR_CR_CORE_REVISION: ", EUR_CR_CORE_REVISION); -#if defined(RESTRICTED_REGISTERS) && defined(SGX_FEATURE_MP) - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_BIF_INT_STAT: ", EUR_CR_MASTER_BIF_INT_STAT); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_BIF_FAULT: ",EUR_CR_MASTER_BIF_FAULT); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_CLKGATESTATUS2: ",EUR_CR_MASTER_CLKGATESTATUS2 ); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_VDM_PIM_STATUS: ",EUR_CR_MASTER_VDM_PIM_STATUS); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_BIF_BANK_SET: ",EUR_CR_MASTER_BIF_BANK_SET); - - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_EVENT_STATUS: ",EUR_CR_MASTER_EVENT_STATUS); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_EVENT_STATUS2: ",EUR_CR_MASTER_EVENT_STATUS2); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_MP_PRIMITIVE: ",EUR_CR_MASTER_MP_PRIMITIVE); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_DPM_DPLIST_STATUS: ",EUR_CR_MASTER_DPM_DPLIST_STATUS); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_DPM_PROACTIVE_PIM_SPEC: ",EUR_CR_MASTER_DPM_PROACTIVE_PIM_SPEC); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_PAGE_MANAGEOP: ",EUR_CR_MASTER_DPM_PAGE_MANAGEOP); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_VDM_CONTEXT_STORE_SNAPSHOT: ",EUR_CR_MASTER_VDM_CONTEXT_STORE_SNAPSHOT); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_VDM_CONTEXT_LOAD_STATUS: ",EUR_CR_MASTER_VDM_CONTEXT_LOAD_STATUS); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_VDM_CONTEXT_STORE_STREAM: ",EUR_CR_MASTER_VDM_CONTEXT_STORE_STREAM); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_VDM_CONTEXT_STORE_STATUS: ",EUR_CR_MASTER_VDM_CONTEXT_STORE_STATUS); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_VDM_CONTEXT_STORE_STATE0: ",EUR_CR_MASTER_VDM_CONTEXT_STORE_STATE0); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_VDM_CONTEXT_STORE_STATE1: ",EUR_CR_MASTER_VDM_CONTEXT_STORE_STATE1); - SGXDumpMasterDebugReg(psDevInfo, "EUR_CR_MASTER_VDM_WAIT_FOR_KICK: ",EUR_CR_MASTER_VDM_WAIT_FOR_KICK); -#endif + for (ui32CoreNum = 0; ui32CoreNum < SGX_FEATURE_MP_CORE_COUNT_3D; ui32CoreNum++) { - /* Dump HW event status */ SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_EVENT_STATUS: ", EUR_CR_EVENT_STATUS); SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_EVENT_STATUS2: ", EUR_CR_EVENT_STATUS2); SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_BIF_CTRL: ", EUR_CR_BIF_CTRL); @@ -1325,37 +1365,6 @@ IMG_VOID SGXDumpDebugInfo (PVRSRV_SGXDEV_INFO *psDevInfo, #if defined(EUR_CR_PDS_PC_BASE) SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_PDS_PC_BASE: ", EUR_CR_PDS_PC_BASE); #endif -#if defined(RESTRICTED_REGISTERS) - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_BIF_BANK_SET: ", EUR_CR_BIF_BANK_SET); - - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_CLKGATECTL: ", EUR_CR_CLKGATECTL); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_CLKGATESTATUS: ", EUR_CR_CLKGATESTATUS); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_MTE_CTRL: ", EUR_CR_MTE_CTRL); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_EVENT_OTHER_PDS_EXEC: ", EUR_CR_EVENT_OTHER_PDS_EXEC); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_EVENT_OTHER_PDS_DATA: ", EUR_CR_EVENT_OTHER_PDS_DATA); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_EVENT_OTHER_PDS_INFO: ", EUR_CR_EVENT_OTHER_PDS_INFO); - - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_ZLS_PAGE_THRESHOLD: ", EUR_CR_DPM_ZLS_PAGE_THRESHOLD); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_TA_GLOBAL_LIST: ", EUR_CR_DPM_TA_GLOBAL_LIST); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_STATE_CONTEXT_ID: ", EUR_CR_DPM_STATE_CONTEXT_ID); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_CONTEXT_PB_BASE: ", EUR_CR_DPM_CONTEXT_PB_BASE); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_TA_ALLOC_FREE_LIST_STATUS1: ", EUR_CR_DPM_TA_ALLOC_FREE_LIST_STATUS1); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_3D_FREE_LIST_STATUS1: ", EUR_CR_DPM_3D_FREE_LIST_STATUS1); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_TA_ALLOC_FREE_LIST_STATUS2: ", EUR_CR_DPM_TA_ALLOC_FREE_LIST_STATUS2); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_3D_FREE_LIST_STATUS2: ", EUR_CR_DPM_3D_FREE_LIST_STATUS2); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_ABORT_STATUS_MTILE: ", EUR_CR_DPM_ABORT_STATUS_MTILE); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_PAGE_STATUS: ", EUR_CR_DPM_PAGE_STATUS); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_PAGE: ", EUR_CR_DPM_PAGE); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_GLOBAL_PAGE_STATUS: ", EUR_CR_DPM_GLOBAL_PAGE_STATUS); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_VDM_CONTEXT_LOAD_STATUS: ", EUR_CR_VDM_CONTEXT_LOAD_STATUS); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_VDM_CONTEXT_STORE_STATUS: ", EUR_CR_VDM_CONTEXT_STORE_STATUS); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_VDM_TASK_KICK_STATUS: ", EUR_CR_VDM_TASK_KICK_STATUS); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_VDM_CONTEXT_STORE_STATE0: ", EUR_CR_VDM_CONTEXT_STORE_STATE0); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_VDM_CONTEXT_STORE_STATE1: ", EUR_CR_VDM_CONTEXT_STORE_STATE1); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_REQUESTING: ", EUR_CR_DPM_REQUESTING); - SGXDumpDebugReg(psDevInfo, ui32CoreNum, "EUR_CR_DPM_REQUESTING: ", EUR_CR_DPM_REQUESTING); - -#endif } #if !defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS) && !defined(FIX_HW_BRN_31620) @@ -1383,67 +1392,149 @@ IMG_VOID SGXDumpDebugInfo (PVRSRV_SGXDEV_INFO *psDevInfo, IMG_UINT32 ui32Bank0; IMG_UINT32 ui32DirListIndex; IMG_UINT32 ui32PDDevPAddr; + IMG_UINT32 ui32RegVal; + +#if defined(SGX_FEATURE_MP) + ui32RegVal = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MASTER_BIF_INT_STAT); +#if defined(EUR_CR_BIF_INT_STAT_FAULT_TYPE_MASK) + if( ui32RegVal & EUR_CR_BIF_INT_STAT_FAULT_TYPE_MASK) +#else + if( ui32RegVal & EUR_CR_BIF_INT_STAT_PF_N_RW_MASK) +#endif + { + ui32FaultAddress = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MASTER_BIF_FAULT); + if(ui32FaultAddress) + { + ui32Bank0 = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_BANK0); + + /* Check the EDM's's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_EDM_MASK) >> EUR_CR_BIF_BANK0_INDEX_EDM_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking EDM memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + + /* Check the TA's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_TA_MASK) >> EUR_CR_BIF_BANK0_INDEX_TA_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking TA memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + + /* Check the 3D's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_3D_MASK) >> EUR_CR_BIF_BANK0_INDEX_3D_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking 3D memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + + #if defined(EUR_CR_BIF_BANK0_INDEX_2D_MASK) + /* Check the 2D's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_2D_MASK) >> EUR_CR_BIF_BANK0_INDEX_2D_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking 2D memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + #endif + + #if defined(EUR_CR_BIF_BANK0_INDEX_PTLA_MASK) + /* Check the 2D's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_PTLA_MASK) >> EUR_CR_BIF_BANK0_INDEX_PTLA_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking PTLA memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + #endif - ui32FaultAddress = OSReadHWReg(psDevInfo->pvRegsBaseKM, - EUR_CR_BIF_FAULT); - ui32FaultAddress = ui32FaultAddress & EUR_CR_BIF_FAULT_ADDR_MASK; - - ui32Bank0 = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_BANK0); - - /* Check the EDM's's memory context */ - ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_EDM_MASK) >> EUR_CR_BIF_BANK0_INDEX_EDM_SHIFT; - ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, - GetDirListBaseReg(ui32DirListIndex)); - PVR_LOG(("Checking EDM memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); - MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); - - /* Check the TA's memory context */ - ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_TA_MASK) >> EUR_CR_BIF_BANK0_INDEX_TA_SHIFT; - ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, - GetDirListBaseReg(ui32DirListIndex)); - PVR_LOG(("Checking TA memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); - MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); - - /* Check the 3D's memory context */ - ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_3D_MASK) >> EUR_CR_BIF_BANK0_INDEX_3D_SHIFT; - ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, - GetDirListBaseReg(ui32DirListIndex)); - PVR_LOG(("Checking 3D memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); - MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); - - #if defined(EUR_CR_BIF_BANK0_INDEX_2D_MASK) - /* Check the 2D's memory context */ - ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_2D_MASK) >> EUR_CR_BIF_BANK0_INDEX_2D_SHIFT; - ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, - GetDirListBaseReg(ui32DirListIndex)); - PVR_LOG(("Checking 2D memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); - MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); - #endif - - #if defined(EUR_CR_BIF_BANK0_INDEX_PTLA_MASK) - /* Check the 2D's memory context */ - ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_PTLA_MASK) >> EUR_CR_BIF_BANK0_INDEX_PTLA_SHIFT; - ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, - GetDirListBaseReg(ui32DirListIndex)); - PVR_LOG(("Checking PTLA memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); - MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); - #endif - - #if defined(EUR_CR_BIF_BANK0_INDEX_HOST_MASK) - /* Check the Host's memory context */ - ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_HOST_MASK) >> EUR_CR_BIF_BANK0_INDEX_HOST_SHIFT; - ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, - GetDirListBaseReg(ui32DirListIndex)); - PVR_LOG(("Checking Host memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); - MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + #if defined(EUR_CR_BIF_BANK0_INDEX_HOST_MASK) + /* Check the Host's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_HOST_MASK) >> EUR_CR_BIF_BANK0_INDEX_HOST_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking Host memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + + #endif + } + } +#endif + for (ui32CoreNum = 0; ui32CoreNum < SGX_FEATURE_MP_CORE_COUNT_3D; ui32CoreNum++) + { + + ui32RegVal = OSReadHWReg(psDevInfo->pvRegsBaseKM, SGX_MP_CORE_SELECT(EUR_CR_BIF_INT_STAT, ui32CoreNum)); + #if defined(EUR_CR_BIF_INT_STAT_FAULT_TYPE_MASK) + if( ui32RegVal & EUR_CR_BIF_INT_STAT_FAULT_TYPE_MASK) + #else + if( ui32RegVal & EUR_CR_BIF_INT_STAT_PF_N_RW_MASK) #endif + { + ui32FaultAddress = OSReadHWReg(psDevInfo->pvRegsBaseKM, SGX_MP_CORE_SELECT(EUR_CR_BIF_FAULT, ui32CoreNum)); + ui32FaultAddress &= EUR_CR_BIF_FAULT_ADDR_MASK; + if(ui32FaultAddress) + { + ui32Bank0 = OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_BANK0); + + /* Check the EDM's's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_EDM_MASK) >> EUR_CR_BIF_BANK0_INDEX_EDM_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking EDM memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + + /* Check the TA's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_TA_MASK) >> EUR_CR_BIF_BANK0_INDEX_TA_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking TA memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + + /* Check the 3D's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_3D_MASK) >> EUR_CR_BIF_BANK0_INDEX_3D_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking 3D memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + + #if defined(EUR_CR_BIF_BANK0_INDEX_2D_MASK) + /* Check the 2D's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_2D_MASK) >> EUR_CR_BIF_BANK0_INDEX_2D_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking 2D memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + #endif + + #if defined(EUR_CR_BIF_BANK0_INDEX_PTLA_MASK) + /* Check the 2D's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_PTLA_MASK) >> EUR_CR_BIF_BANK0_INDEX_PTLA_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking PTLA memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + #endif + + #if defined(EUR_CR_BIF_BANK0_INDEX_HOST_MASK) + /* Check the Host's memory context */ + ui32DirListIndex = (ui32Bank0 & EUR_CR_BIF_BANK0_INDEX_HOST_MASK) >> EUR_CR_BIF_BANK0_INDEX_HOST_SHIFT; + ui32PDDevPAddr = OSReadHWReg(psDevInfo->pvRegsBaseKM, + GetDirListBaseReg(ui32DirListIndex)); + PVR_LOG(("Checking Host memory context (index = %d, PD = 0x%08x)", ui32DirListIndex, ui32PDDevPAddr)); + MMU_CheckFaultAddr(psDevInfo, ui32PDDevPAddr, ui32FaultAddress); + + #endif + } + } + } } #endif } + +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) /* Dump out the outstanding queue items. */ QueueDumpDebugInfo(); +#endif { /* @@ -1452,7 +1543,25 @@ IMG_VOID SGXDumpDebugInfo (PVRSRV_SGXDEV_INFO *psDevInfo, SGXMKIF_HOST_CTL *psSGXHostCtl = psDevInfo->psSGXHostCtl; IMG_UINT32 *pui32HostCtlBuffer = (IMG_UINT32 *)psSGXHostCtl; IMG_UINT32 ui32LoopCounter; - + + /* Report which defines are enabled that affect the HostCTL structure being dumped-out here */ + { + IMG_UINT32 ui32CtlFlags = 0; + #if defined(PVRSRV_USSE_EDM_BREAKPOINTS) + ui32CtlFlags = ui32CtlFlags | 0x0001; + #endif + #if defined(FIX_HW_BRN_28889) + ui32CtlFlags = ui32CtlFlags | 0x0002; + #endif + #if defined(SUPPORT_HW_RECOVERY) + ui32CtlFlags = ui32CtlFlags | 0x0004; + #endif + #if defined(SGX_FEATURE_EXTENDED_PERF_COUNTERS) + ui32CtlFlags = ui32CtlFlags | 0x0008; + #endif + PVR_LOG((" Host Ctl flags= %08x", ui32CtlFlags)); + } + if (psSGXHostCtl->ui32AssertFail != 0) { PVR_LOG(("SGX Microkernel assert fail: 0x%08X", psSGXHostCtl->ui32AssertFail)); @@ -1465,7 +1574,8 @@ IMG_VOID SGXDumpDebugInfo (PVRSRV_SGXDEV_INFO *psDevInfo, ui32LoopCounter < sizeof(*psDevInfo->psSGXHostCtl) / sizeof(*pui32HostCtlBuffer); ui32LoopCounter += 4) { - PVR_LOG(("\t(HC-%X) 0x%08X 0x%08X 0x%08X 0x%08X", ui32LoopCounter * sizeof(*pui32HostCtlBuffer), + PVR_LOG(("\t(HC-%" SIZE_T_FMT_LEN "X) 0x%08X 0x%08X 0x%08X 0x%08X", + ui32LoopCounter * sizeof(*pui32HostCtlBuffer), pui32HostCtlBuffer[ui32LoopCounter + 0], pui32HostCtlBuffer[ui32LoopCounter + 1], pui32HostCtlBuffer[ui32LoopCounter + 2], pui32HostCtlBuffer[ui32LoopCounter + 3])); } @@ -1484,7 +1594,8 @@ IMG_VOID SGXDumpDebugInfo (PVRSRV_SGXDEV_INFO *psDevInfo, ui32LoopCounter < psDevInfo->psKernelSGXTA3DCtlMemInfo->uAllocSize / sizeof(*pui32TA3DCtlBuffer); ui32LoopCounter += 4) { - PVR_LOG(("\t(T3C-%X) 0x%08X 0x%08X 0x%08X 0x%08X", ui32LoopCounter * sizeof(*pui32TA3DCtlBuffer), + PVR_LOG(("\t(T3C-%" SIZE_T_FMT_LEN "X) 0x%08X 0x%08X 0x%08X 0x%08X", + ui32LoopCounter * sizeof(*pui32TA3DCtlBuffer), pui32TA3DCtlBuffer[ui32LoopCounter + 0], pui32TA3DCtlBuffer[ui32LoopCounter + 1], pui32TA3DCtlBuffer[ui32LoopCounter + 2], pui32TA3DCtlBuffer[ui32LoopCounter + 3])); } @@ -1557,6 +1668,24 @@ IMG_VOID SGXDumpDebugInfo (PVRSRV_SGXDEV_INFO *psDevInfo, PVRSRVDumpTimeTraceBuffers(); #endif + #if defined (SUPPORT_FORCE_SYNC_DUMP) + PVRSRVDumpSyncs(IMG_FALSE); + #else + PVRSRVDumpSyncs(IMG_TRUE); + #endif + + +#if defined (MEM_TRACK_INFO_DEBUG) + { + IMG_UINT32 ui32FaultAddress = OSReadHWReg(psDevInfo->pvRegsBaseKM, SGX_MP_CORE_SELECT(EUR_CR_BIF_FAULT, 0)); + PVRSRVPrintMemTrackInfo(ui32FaultAddress); + } +#endif + + +#if defined(PVRSRV_DEBUG_CCB_MAX) + PVRSRVDebugPrintfDumpCCB(); +#endif } @@ -1596,9 +1725,6 @@ IMG_VOID HWRecoveryResetSGX (PVRSRV_DEVICE_NODE *psDeviceNode, PVR_UNREFERENCED_PARAMETER(ui32Component); - /* Debug dumps associated with HWR can be long. Delay system suspend */ - SysLockSystemSuspend(); - /* Ensure that hardware recovery is serialised with any power transitions. */ @@ -1616,7 +1742,7 @@ IMG_VOID HWRecoveryResetSGX (PVRSRV_DEVICE_NODE *psDeviceNode, psSGXHostCtl->ui32InterruptClearFlags |= PVRSRV_USSE_EDM_INTERRUPT_HWR; PVR_LOG(("HWRecoveryResetSGX: SGX Hardware Recovery triggered")); - + #if defined(SUPPORT_HWRECOVERY_TRACE_LIMIT) /* * The following defines are system specific and should be defined in @@ -1654,13 +1780,13 @@ IMG_VOID HWRecoveryResetSGX (PVRSRV_DEVICE_NODE *psDeviceNode, PVRSRVPowerUnlock(ui32CallerID); - SysUnlockSystemSuspend(); - /* Send a dummy kick so that we start processing again */ SGXScheduleProcessQueuesKM(psDeviceNode); +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) /* Flush any old commands from the queues. */ PVRSRVProcessQueues(IMG_TRUE); +#endif } #endif /* #if defined(SYS_USING_INTERRUPTS) || defined(SUPPORT_HW_RECOVERY) */ @@ -1895,6 +2021,71 @@ IMG_BOOL SGX_ISRHandler (IMG_VOID *pvData) return bInterruptProcessed; } +/* + SGX Systrace Handler +*/ +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) +static IMG_VOID SGXSystraceHandler(PVRSRV_DEVICE_NODE *psDeviceNode) +{ + PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice; + IMG_UINT32 ui32SgxClockSpeed, ui32DataCount, ui32HostTimestamp; + + /* NOTE: Not thread safe. MISR should only run in one thread */ + static PVRSRV_SGX_HWPERF_CB_ENTRY asSGXHWPerf[8]; + + if(SystraceIsCapturingHWData() && psDevInfo->bSystraceInitialised) + { + SGXReadHWPerfCBKM((IMG_HANDLE) psDeviceNode, + 8, + asSGXHWPerf, + (IMG_UINT32 *)&ui32DataCount, + (IMG_UINT32 *)&ui32SgxClockSpeed, + (IMG_UINT32 *)&ui32HostTimestamp); + + SystraceHWPerfPackets(psDevInfo, asSGXHWPerf, ui32DataCount, ui32SgxClockSpeed); + } + else if(SystraceIsCapturingHWData() && !psDevInfo->bSystraceInitialised) + { + SGX_MISC_INFO sSGXMiscInfo; + + if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_SYSTRACE_DATA), + (IMG_VOID **)&psDevInfo->psSystraceData, 0, + "Systrace data storage") != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR, "SGXSystraceHandler: Failed to allocate systrace data")); + return; + } + + OSMemSet(psDevInfo->psSystraceData, 0, sizeof(PVRSRV_SYSTRACE_DATA)); + + /* Prepare the SGXMiscInfo request in order to stop recording data*/ + sSGXMiscInfo.eRequest = SGX_MISC_INFO_REQUEST_SET_HWPERF_STATUS; + sSGXMiscInfo.uData.sSetHWPerfStatus.ui32NewHWPerfStatus = PVRSRV_SGX_HWPERF_STATUS_GRAPHICS_ON | PVRSRV_SGX_HWPERF_STATUS_PERIODIC_ON; + + /* Call into SGX DDK KM Services*/ + SGXGetMiscInfoKM(psDevInfo, &sSGXMiscInfo, psDeviceNode, NULL); + + psDevInfo->bSystraceInitialised = IMG_TRUE; + + /* Initialize the first context to be 1 (0 is idle)*/ + psDevInfo->psSystraceData->ui32CurrentCtxID = 1; + } + else if(psDevInfo->bSystraceInitialised) + { + SGX_MISC_INFO sSGXMiscInfo; + + /* Prepare the SGXMiscInfo request in order to stop recording data*/ + sSGXMiscInfo.eRequest = SGX_MISC_INFO_REQUEST_SET_HWPERF_STATUS; + sSGXMiscInfo.uData.sSetHWPerfStatus.ui32NewHWPerfStatus = 0; + + /* Call into SGX DDK KM Services*/ + SGXGetMiscInfoKM(psDevInfo, &sSGXMiscInfo, psDeviceNode, NULL); + + OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_SYSTRACE_DATA), psDevInfo->psSystraceData, NULL); + psDevInfo->bSystraceInitialised = IMG_FALSE; + } +} +#endif /* SGX MISR Handler @@ -1919,6 +2110,11 @@ static IMG_VOID SGX_MISRHandler (IMG_VOID *pvData) #endif SGXTestActivePowerEvent(psDeviceNode, ISR_ID); + +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) + SGXSystraceHandler(psDeviceNode); +#endif + } #endif /* #if defined (SYS_USING_INTERRUPTS) */ @@ -2135,23 +2331,6 @@ PVRSRV_ERROR SGXRegisterDevice (PVRSRV_DEVICE_NODE *psDeviceNode) psDeviceMemoryHeap++;/* advance to the next heap */ #endif -#if defined(SUPPORT_ION) - /************* Ion Heap ***************/ - psDeviceMemoryHeap->ui32HeapID = HEAP_ID( PVRSRV_DEVICE_TYPE_SGX, SGX_ION_HEAP_ID); - psDeviceMemoryHeap->sDevVAddrBase.uiAddr = SGX_ION_HEAP_BASE; - psDeviceMemoryHeap->ui32HeapSize = SGX_ION_HEAP_SIZE; - psDeviceMemoryHeap->ui32Attribs = PVRSRV_HAP_WRITECOMBINE - | PVRSRV_HAP_SINGLE_PROCESS; - psDeviceMemoryHeap->pszName = "Ion"; - psDeviceMemoryHeap->pszBSName = "Ion BS"; - psDeviceMemoryHeap->DevMemHeapType = DEVICE_MEMORY_HEAP_PERCONTEXT; - /* specify the ion heap ID for this device */ - psDevMemoryInfo->ui32IonHeapID = SGX_ION_HEAP_ID; - /* set the default (4k). System can override these as required */ - psDeviceMemoryHeap->ui32DataPageSize = SGX_MMU_PAGE_SIZE; - psDeviceMemoryHeap++;/* advance to the next heap */ -#endif - /************* TA data ***************/ psDeviceMemoryHeap->ui32HeapID = HEAP_ID( PVRSRV_DEVICE_TYPE_SGX, SGX_TADATA_HEAP_ID); psDeviceMemoryHeap->sDevVAddrBase.uiAddr = SGX_TADATA_HEAP_BASE; @@ -2494,8 +2673,7 @@ PVRSRV_ERROR SGXDevInitCompatCheck(PVRSRV_DEVICE_NODE *psDeviceNode) /* * 1. Check kernel-side and client-side build options - * 2. Ensure ukernel DDK version and driver DDK version are compatible - * 3. Check ukernel build options against kernel-side build options + * 2. Check ukernel build options against kernel-side build options */ /* @@ -2536,32 +2714,12 @@ PVRSRV_ERROR SGXDevInitCompatCheck(PVRSRV_DEVICE_NODE *psDeviceNode) psSGXMiscInfoInt->ui32MiscInfoFlags |= PVRSRV_USSE_MISCINFO_GET_STRUCT_SIZES; eError = SGXGetMiscInfoUkernel(psDevInfo, psDeviceNode, IMG_NULL); - /* - * Validate DDK version - */ if(eError != PVRSRV_OK) { - PVR_LOG(("(FAIL) SGXInit: Unable to validate device DDK version")); + PVR_LOG(("(FAIL) SGXInit: Unable to validate hardware core revision")); goto chk_exit; } psSGXFeatures = &((PVRSRV_SGX_MISCINFO_INFO*)(psMemInfo->pvLinAddrKM))->sSGXFeatures; - if( (psSGXFeatures->ui32DDKVersion != - ((PVRVERSION_MAJ << 16) | - (PVRVERSION_MIN << 8) | - PVRVERSION_BRANCH) ) || - (psSGXFeatures->ui32DDKBuild != PVRVERSION_BUILD) ) - { - PVR_LOG(("(FAIL) SGXInit: Incompatible driver DDK revision (%d)/device DDK revision (%d).", - PVRVERSION_BUILD, psSGXFeatures->ui32DDKBuild)); - eError = PVRSRV_ERROR_DDK_VERSION_MISMATCH; - goto chk_exit; - } - else - { - PVR_DPF((PVR_DBG_MESSAGE, "SGXInit: driver DDK (%d) and device DDK (%d) match. [ OK ]", - PVRVERSION_BUILD, psSGXFeatures->ui32DDKBuild)); - } - /* * Check hardware core revision is compatible with the one in software */ @@ -3095,6 +3253,17 @@ PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO *psDevInfo, return PVRSRV_OK; } + case SGX_MISC_INFO_REQUEST_CLOCKSPEED_SLCSIZE: + { + psMiscInfo->uData.sQueryClockSpeedSLCSize.ui32SGXClockSpeed = SYS_SGX_CLOCK_SPEED; +#if defined(SGX_FEATURE_SYSTEM_CACHE) && defined(SYS_SGX_SLC_SIZE) + psMiscInfo->uData.sQueryClockSpeedSLCSize.ui32SGXSLCSize = SYS_SGX_SLC_SIZE; +#else + psMiscInfo->uData.sQueryClockSpeedSLCSize.ui32SGXSLCSize = 0; +#endif /* defined(SGX_FEATURE_SYSTEM_CACHE) && defined(SYS_SGX_SLC_SIZE) */ + return PVRSRV_OK; + } + case SGX_MISC_INFO_REQUEST_ACTIVEPOWER: { psMiscInfo->uData.sActivePower.ui32NumActivePowerEvents = psDevInfo->psSGXHostCtl->ui32NumActivePowerEvents; @@ -3163,24 +3332,27 @@ PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO *psDevInfo, psSGXFeatures->ui32DDKVersion = (PVRVERSION_MAJ << 16) | - (PVRVERSION_MIN << 8) | - PVRVERSION_BRANCH; + (PVRVERSION_MIN << 8); psSGXFeatures->ui32DDKBuild = PVRVERSION_BUILD; /* Also report the kernel module build options -- used in SGXConnectionCheck() */ psSGXFeatures->ui32BuildOptions = (SGX_BUILD_OPTIONS); -#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) - /* Report the EDM status buffer location in memory */ - psSGXFeatures->sDevVAEDMStatusBuffer = psDevInfo->psKernelEDMStatusBufferMemInfo->sDevVAddr; - psSGXFeatures->pvEDMStatusBuffer = psDevInfo->psKernelEDMStatusBufferMemInfo->pvLinAddrKM; -#endif - /* Copy SGX features into misc info struct, to return to client */ psMiscInfo->uData.sSGXFeatures = *psSGXFeatures; return PVRSRV_OK; } +#if defined(PVRSRV_USSE_EDM_STATUS_DEBUG) + case SGX_MISC_INFO_REQUEST_EDM_STATUS_BUFFER_INFO: + { + /* Report the EDM status buffer location in memory */ + psMiscInfo->uData.sEDMStatusBufferInfo.sDevVAEDMStatusBuffer = psDevInfo->psKernelEDMStatusBufferMemInfo->sDevVAddr; + psMiscInfo->uData.sEDMStatusBufferInfo.pvEDMStatusBuffer = psDevInfo->psKernelEDMStatusBufferMemInfo->pvLinAddrKM; + return PVRSRV_OK; + } +#endif + #if defined(SUPPORT_SGX_EDM_MEMORY_DEBUG) case SGX_MISC_INFO_REQUEST_MEMREAD: case SGX_MISC_INFO_REQUEST_MEMCOPY: @@ -3346,6 +3518,14 @@ PVRSRV_ERROR SGXGetMiscInfoKM(PVRSRV_SGXDEV_INFO *psDevInfo, case SGX_MISC_INFO_DUMP_DEBUG_INFO_FORCE_REGS: { + if(!OSProcHasPrivSrvInit()) + { + PVR_DPF((PVR_DBG_ERROR, "Insufficient privileges to dump SGX " + "debug info with registers")); + + return PVRSRV_ERROR_INVALID_MISCINFO; + } + PVR_LOG(("User requested SGX debug info")); /* Dump SGX debug data to the kernel log. */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxkick.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxkick.c index a40bb9e..a03f51a 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxkick.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxkick.c @@ -53,6 +53,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "sgxutils.h" #include "ttrace.h" +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) +#include "pvr_sync.h" +#endif + +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) +#include "systrace.h" +#endif + /*! ****************************************************************************** @@ -68,11 +76,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************************/ IMG_EXPORT -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK_KM *psCCBKick) -#else PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) -#endif { PVRSRV_ERROR eError; PVRSRV_KERNEL_SYNC_INFO *psSyncInfo; @@ -80,6 +84,13 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) SGXMKIF_CMDTA_SHARED *psTACmd; IMG_UINT32 i; IMG_HANDLE hDevMemContext = IMG_NULL; +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) + PVRSRV_DEVICE_NODE *psDeviceNode; + PVRSRV_SGXDEV_INFO *psDevInfo; + + psDeviceNode = (PVRSRV_DEVICE_NODE *)hDevHandle; + psDevInfo = (PVRSRV_SGXDEV_INFO *)psDeviceNode->pvDevice; +#endif #if defined(FIX_HW_BRN_31620) hDevMemContext = psCCBKick->hDevMemContext; #endif @@ -97,6 +108,11 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) PVR_TTRACE(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_CMD_START, KICK_TOKEN_DOKICK); + PVR_TTRACE_UI32(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_FRAMENUM, KICK_TOKEN_FRAMENUM, psCCBKick->ui32FrameNum); + PVR_TTRACE_UI32(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_NONE, KICK_TOKEN_RENDERCONTEXT, psCCBKick->sCommand.ui32Data[1]); + PVR_TTRACE_DEV_VIRTADDR(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_DEVVADDR, KICK_TOKEN_HWRTDATASET, psCCBKick->sHWRTDataSetDevAddr); + PVR_TTRACE_DEV_VIRTADDR(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_DEVVADDR, KICK_TOKEN_HWRTDATA, psCCBKick->sHWRTDataDevAddr); + #if defined(TTRACE) if (psCCBKick->bFirstKickOrResume) { @@ -129,7 +145,7 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) if (psCCBKick->bTADependency) { - psSyncInfo->psSyncData->ui32WriteOpsPending++; + SyncTakeWriteOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); } } @@ -143,7 +159,7 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) psTACmd->sTATQSyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; psTACmd->sTATQSyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; - psTACmd->ui32TATQSyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++; + psTACmd->ui32TATQSyncReadOpsPendingVal = SyncTakeReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); psTACmd->ui32TATQSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; } @@ -157,7 +173,7 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) psTACmd->s3DTQSyncReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; psTACmd->s3DTQSyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; - psTACmd->ui323DTQSyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++; + psTACmd->ui323DTQSyncReadOpsPendingVal = SyncTakeReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); psTACmd->ui323DTQSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; } @@ -205,7 +221,7 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) psTACmd->asTASrcSyncs[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; /* Get ui32ReadOpsPending snapshot and copy into the CCB - before incrementing. */ - psTACmd->asTASrcSyncs[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++; + psTACmd->asTASrcSyncs[i].ui32ReadOpsPendingVal = SyncTakeReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); /* Copy ui32WriteOpsPending snapshot into the CCB. */ psTACmd->asTASrcSyncs[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; } @@ -221,7 +237,7 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) /* Get ui32ReadOpsPending snapshot and copy into the CCB */ psTACmd->asTADstSyncs[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; /* Copy ui32WriteOpsPending snapshot into the CCB - before incrementing */ - psTACmd->asTADstSyncs[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; + psTACmd->asTADstSyncs[i].ui32WriteOpsPendingVal = SyncTakeWriteOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); } psTACmd->ui32Num3DSrcSyncs = psCCBKick->ui32Num3DSrcSyncs; @@ -233,13 +249,47 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) psTACmd->as3DSrcSyncs[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; /* Get ui32ReadOpsPending snapshot and copy into the CCB - before incrementing. */ - psTACmd->as3DSrcSyncs[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++; + psTACmd->as3DSrcSyncs[i].ui32ReadOpsPendingVal = SyncTakeReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); /* Copy ui32WriteOpsPending snapshot into the CCB. */ psTACmd->as3DSrcSyncs[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; } #else /* SUPPORT_SGX_GENERALISED_SYNCOBJECTS */ /* texture dependencies */ - psTACmd->ui32NumSrcSyncs = psCCBKick->ui32NumSrcSyncs; +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + eError = PVRSyncPatchCCBKickSyncInfos(psCCBKick->ahSrcKernelSyncInfo, + psTACmd->asSrcSyncs, + &psCCBKick->ui32NumSrcSyncs); + if(eError != PVRSRV_OK) + { + /* We didn't kick yet, or perform PDUMP processing, so we should + * be able to trivially roll back any changes made to the sync + * data. If we don't do this, we'll wedge services cleanup. + */ + + if (psCCBKick->h3DSyncInfo != IMG_NULL) + { + psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->h3DSyncInfo; + psSyncInfo->psSyncData->ui32ReadOpsPending--; + } + + if (psCCBKick->hTASyncInfo != IMG_NULL) + { + psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTASyncInfo; + psSyncInfo->psSyncData->ui32ReadOpsPending--; + } + + if (psCCBKick->hTA3DSyncInfo && psCCBKick->bTADependency) + { + psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTA3DSyncInfo; + psSyncInfo->psSyncData->ui32WriteOpsPending--; + } + + PVR_DPF((PVR_DBG_ERROR, "SGXDoKickKM: PVRSyncPatchCCBKickSyncInfos failed.")); + PVR_TTRACE(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_FUNCTION_EXIT, + KICK_TOKEN_DOKICK); + return eError; + } +#else /* defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ for (i=0; i<psCCBKick->ui32NumSrcSyncs; i++) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahSrcKernelSyncInfo[i]; @@ -251,11 +301,13 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) psTACmd->asSrcSyncs[i].sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; /* Get ui32ReadOpsPending snapshot and copy into the CCB - before incrementing. */ - psTACmd->asSrcSyncs[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending++; + psTACmd->asSrcSyncs[i].ui32ReadOpsPendingVal = SyncTakeReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); /* Copy ui32WriteOpsPending snapshot into the CCB. */ psTACmd->asSrcSyncs[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; } -#endif/* SUPPORT_SGX_GENERALISED_SYNCOBJECTS */ +#endif /* defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ + psTACmd->ui32NumSrcSyncs = psCCBKick->ui32NumSrcSyncs; +#endif /* defined(SUPPORT_SGX_GENERALISED_SYNCOBJECTS) */ if (psCCBKick->bFirstKickOrResume && psCCBKick->ui32NumDstSyncObjects > 0) { @@ -297,7 +349,7 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) psHWDeviceSyncList->asSyncData[i].sReadOps2CompleteDevVAddr = psSyncInfo->sReadOps2CompleteDevVAddr; psHWDeviceSyncList->asSyncData[i].ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; - psHWDeviceSyncList->asSyncData[i].ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; + psHWDeviceSyncList->asSyncData[i].ui32WriteOpsPendingVal = SyncTakeWriteOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); psHWDeviceSyncList->asSyncData[i].ui32ReadOps2PendingVal = psSyncInfo->psSyncData->ui32ReadOps2Pending; #if defined(PDUMP) @@ -322,37 +374,17 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) 0, MAKEUNIQUETAG(psHWDstSyncListMemInfo)); - if ((psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) && - (psSyncInfo->psSyncData->ui32LastReadOpDumpVal == 0)) - { - /* - * Init the ROpsComplete value to 0. - */ - PDUMPCOMMENT("Init RT ROpsComplete\r\n"); - PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal, - psSyncInfo->psSyncDataMemInfoKM, - offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete), - sizeof(psSyncInfo->psSyncData->ui32ReadOpsComplete), - 0, - MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - /* - * Init the WOpsComplete value to 0. - */ - PDUMPCOMMENT("Init RT WOpsComplete\r\n"); - PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, - psSyncInfo->psSyncDataMemInfoKM, - offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete), - sizeof(psSyncInfo->psSyncData->ui32WriteOpsComplete), - 0, - MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - } - psSyncInfo->psSyncData->ui32LastOpDumpVal++; ui32ModifiedValue = psSyncInfo->psSyncData->ui32LastOpDumpVal - 1; PDUMPCOMMENT("Modify RT %d WOpPendingVal in HWDevSyncList\r\n", i); +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENT("TA Dst: PDump sync sample: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + ui32ModifiedValue); +#endif PDUMPMEM(&ui32ModifiedValue, psHWDstSyncListMemInfo, ui32WOpsOffset, @@ -380,6 +412,11 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psHWDstSyncListMemInfo)); +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_PERSISTENT, "TA Dst: PDump sync update: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif } #endif /* defined(PDUMP) */ } @@ -420,31 +457,6 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) IMG_UINT32 ui32ModifiedValue; psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTASrcKernelSyncInfo[i]; - if ((psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) && - (psSyncInfo->psSyncData->ui32LastReadOpDumpVal == 0)) - { - /* - * Init the ROpsComplete value to 0. - */ - PDUMPCOMMENT("Init RT TA-SRC ROpsComplete\r\n", i); - PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal, - psSyncInfo->psSyncDataMemInfoKM, - offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete), - sizeof(psSyncInfo->psSyncData->ui32ReadOpsComplete), - 0, - MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - /* - * Init the WOpsComplete value to 0. - */ - PDUMPCOMMENT("Init RT TA-SRC WOpsComplete\r\n"); - PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, - psSyncInfo->psSyncDataMemInfoKM, - offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete), - sizeof(psSyncInfo->psSyncData->ui32WriteOpsComplete), - 0, - MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - } - psSyncInfo->psSyncData->ui32LastReadOpDumpVal++; ui32ModifiedValue = psSyncInfo->psSyncData->ui32LastReadOpDumpVal - 1; @@ -475,37 +487,18 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) IMG_UINT32 ui32ModifiedValue; psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTADstKernelSyncInfo[i]; - if ((psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) && - (psSyncInfo->psSyncData->ui32LastReadOpDumpVal == 0)) - { - /* - * Init the ROpsComplete value to 0. - */ - PDUMPCOMMENT("Init RT TA-DST ROpsComplete\r\n", i); - PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal, - psSyncInfo->psSyncDataMemInfoKM, - offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete), - sizeof(psSyncInfo->psSyncData->ui32ReadOpsComplete), - 0, - MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - /* - * Init the WOpsComplete value to 0. - */ - PDUMPCOMMENT("Init RT TA-DST WOpsComplete\r\n"); - PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, - psSyncInfo->psSyncDataMemInfoKM, - offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete), - sizeof(psSyncInfo->psSyncData->ui32WriteOpsComplete), - 0, - MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - } - psSyncInfo->psSyncData->ui32LastOpDumpVal++; ui32ModifiedValue = psSyncInfo->psSyncData->ui32LastOpDumpVal - 1; PDUMPCOMMENT("Modify TA DstSync %d WOpPendingVal\r\n", i); +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENT("TA TADst: PDump sync sample: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr + ui32ModifiedValue; +#endif + PDUMPMEM(&ui32ModifiedValue, psCCBMemInfo, psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, asTADstSyncs) + @@ -523,6 +516,12 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psCCBMemInfo)); + +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_PERSISTENT, "TA TADst: PDump sync update: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif } for (i=0; i<psCCBKick->ui32Num3DSrcSyncs; i++) @@ -530,31 +529,6 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) IMG_UINT32 ui32ModifiedValue; psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ah3DSrcKernelSyncInfo[i]; - if ((psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) && - (psSyncInfo->psSyncData->ui32LastReadOpDumpVal == 0)) - { - /* - * Init the ROpsComplete value to 0. - */ - PDUMPCOMMENT("Init RT 3D-SRC ROpsComplete\r\n", i); - PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal, - psSyncInfo->psSyncDataMemInfoKM, - offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete), - sizeof(psSyncInfo->psSyncData->ui32ReadOpsComplete), - 0, - MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - /* - * Init the WOpsComplete value to 0. - */ - PDUMPCOMMENT("Init RT 3D-SRC WOpsComplete\r\n"); - PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, - psSyncInfo->psSyncDataMemInfoKM, - offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete), - sizeof(psSyncInfo->psSyncData->ui32WriteOpsComplete), - 0, - MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - } - psSyncInfo->psSyncData->ui32LastReadOpDumpVal++; ui32ModifiedValue = psSyncInfo->psSyncData->ui32LastReadOpDumpVal - 1; @@ -585,41 +559,6 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) IMG_UINT32 ui32ModifiedValue; psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahSrcKernelSyncInfo[i]; - if ((psSyncInfo->psSyncData->ui32LastOpDumpVal == 0) && - (psSyncInfo->psSyncData->ui32LastReadOpDumpVal == 0)) - { - /* - * Init the ROpsComplete value to 0. - */ - PDUMPCOMMENT("Init RT ROpsComplete\r\n"); - PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal, - psSyncInfo->psSyncDataMemInfoKM, - offsetof(PVRSRV_SYNC_DATA, ui32ReadOpsComplete), - sizeof(psSyncInfo->psSyncData->ui32ReadOpsComplete), - 0, - MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - /* - * Init the WOpsComplete value to 0. - */ - PDUMPCOMMENT("Init RT WOpsComplete\r\n"); - PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, - psSyncInfo->psSyncDataMemInfoKM, - offsetof(PVRSRV_SYNC_DATA, ui32WriteOpsComplete), - sizeof(psSyncInfo->psSyncData->ui32WriteOpsComplete), - 0, - MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - /* - * Init the ROps2Complete value to 0. - */ - PDUMPCOMMENT("Init RT WOpsComplete\r\n"); - PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal, - psSyncInfo->psSyncDataMemInfoKM, - offsetof(PVRSRV_SYNC_DATA, ui32ReadOps2Complete), - sizeof(psSyncInfo->psSyncData->ui32ReadOps2Complete), - 0, - MAKEUNIQUETAG(psSyncInfo->psSyncDataMemInfoKM)); - } - psSyncInfo->psSyncData->ui32LastReadOpDumpVal++; ui32ModifiedValue = psSyncInfo->psSyncData->ui32LastReadOpDumpVal - 1; @@ -636,6 +575,12 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) PDUMPCOMMENT("Modify SrcSync %d WOpPendingVal\r\n", i); +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENT("TA Src: PDump sync sample: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif + PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, psCCBMemInfo, psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, asSrcSyncs) + @@ -643,6 +588,12 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psCCBMemInfo)); + +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_PERSISTENT, "TA Src: PDump sync update: uiAddr = 0x%08x, ui32LastReadOpDumpVal = 0x%08x\r\n", + psSyncInfo->sReadOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastReadOpDumpVal); +#endif } if (psCCBKick->hTA3DSyncInfo != IMG_NULL) @@ -651,6 +602,12 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) PDUMPCOMMENT("Modify TA/3D dependency WOpPendingVal\r\n"); +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENT("TA TADep: PDump sync sample: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif + PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, psCCBMemInfo, psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, sTA3DDependency.ui32WriteOpsPendingVal), @@ -661,6 +618,12 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) if (psCCBKick->bTADependency) { psSyncInfo->psSyncData->ui32LastOpDumpVal++; + +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_PERSISTENT, "TA TADep: PDump sync update: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif } } @@ -676,6 +639,22 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psCCBMemInfo)); + + PDUMPCOMMENT("Modify TA/TQ WOpPendingVal\r\n"); + +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENT("TA TATQ: PDump sync sample: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif + + PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, + psCCBMemInfo, + psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, ui32TATQSyncWriteOpsPendingVal), + sizeof(IMG_UINT32), + 0, + MAKEUNIQUETAG(psCCBMemInfo)); + psSyncInfo->psSyncData->ui32LastReadOpDumpVal++; } @@ -691,6 +670,22 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) sizeof(IMG_UINT32), 0, MAKEUNIQUETAG(psCCBMemInfo)); + + PDUMPCOMMENT("Modify 3D/TQ WOpPendingVal\r\n"); + +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENT("TA 3DTQ: PDump sync sample: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif + + PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, + psCCBMemInfo, + psCCBKick->ui32CCBDumpWOff + offsetof(SGXMKIF_CMDTA_SHARED, ui323DTQSyncWriteOpsPendingVal), + sizeof(IMG_UINT32), + 0, + MAKEUNIQUETAG(psCCBMemInfo)); + psSyncInfo->psSyncData->ui32LastReadOpDumpVal++; } @@ -742,6 +737,7 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) if (psSyncInfo) { psSyncInfo->psSyncData->ui32WriteOpsPending--; + SyncRollBackWriteOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); #if defined(PDUMP) if (PDumpIsCaptureFrameKM()) { @@ -757,22 +753,26 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTASrcKernelSyncInfo[i]; psSyncInfo->psSyncData->ui32ReadOpsPending--; + SyncRollBackReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); } for (i=0; i<psCCBKick->ui32NumTADstSyncs; i++) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahTADstKernelSyncInfo[i]; psSyncInfo->psSyncData->ui32WriteOpsPending--; + SyncRollBackReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); } for (i=0; i<psCCBKick->ui32Num3DSrcSyncs; i++) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ah3DSrcKernelSyncInfo[i]; psSyncInfo->psSyncData->ui32ReadOpsPending--; + SyncRollBackReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); } #else/* SUPPORT_SGX_GENERALISED_SYNCOBJECTS */ for (i=0; i<psCCBKick->ui32NumSrcSyncs; i++) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *) psCCBKick->ahSrcKernelSyncInfo[i]; psSyncInfo->psSyncData->ui32ReadOpsPending--; + SyncRollBackReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); } #endif/* SUPPORT_SGX_GENERALISED_SYNCOBJECTS */ @@ -780,18 +780,21 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTA3DSyncInfo; psSyncInfo->psSyncData->ui32ReadOpsPending--; + SyncRollBackReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); } if (psCCBKick->hTASyncInfo) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->hTASyncInfo; psSyncInfo->psSyncData->ui32ReadOpsPending--; + SyncRollBackReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); } if (psCCBKick->h3DSyncInfo) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psCCBKick->h3DSyncInfo; psSyncInfo->psSyncData->ui32ReadOpsPending--; + SyncRollBackReadOp(psSyncInfo, SYNC_OP_CLASS_KICKTA); } PVR_TTRACE(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_FUNCTION_EXIT, @@ -910,6 +913,9 @@ PVRSRV_ERROR SGXDoKickKM(IMG_HANDLE hDevHandle, SGX_CCB_KICK *psCCBKick) #endif PVR_TTRACE(PVRSRV_TRACE_GROUP_KICK, PVRSRV_TRACE_CLASS_FUNCTION_EXIT, KICK_TOKEN_DOKICK); +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) + SystraceTAKick(psDevInfo, psCCBKick->ui32FrameNum, psCCBKick->sHWRTDataDevAddr.uiAddr, psCCBKick->bIsFirstKick); +#endif return eError; } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxpower.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxpower.c index 03647a0..a4ef276 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxpower.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxpower.c @@ -374,7 +374,7 @@ PVRSRV_ERROR SGXPrePowerState (IMG_HANDLE hDevHandle, #endif /* PDUMP */ /* Wait for the pending ukernel to host interrupts to come back. */ - #if !defined(NO_HARDWARE) + #if !defined(NO_HARDWARE) && defined(SUPPORT_LISR_MISR_SYNC) if (PollForValueKM(&g_ui32HostIRQCountSample, psDevInfo->psSGXHostCtl->ui32InterruptCount, 0xffffffff, @@ -386,7 +386,7 @@ PVRSRV_ERROR SGXPrePowerState (IMG_HANDLE hDevHandle, SGXDumpDebugInfo(psDevInfo, IMG_FALSE); PVR_DBG_BREAK; } - #endif /* NO_HARDWARE */ + #endif /* NO_HARDWARE && SUPPORT_LISR_MISR_SYNC*/ #if defined(SGX_FEATURE_MP) ui32CoresEnabled = ((OSReadHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MASTER_CORE) & EUR_CR_MASTER_CORE_ENABLE_MASK) >> EUR_CR_MASTER_CORE_ENABLE_SHIFT) + 1; #else diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxreset.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxreset.c index dcdefae..2b7aa4c 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxreset.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxreset.c @@ -191,7 +191,7 @@ static IMG_VOID SGXResetSetupBIFContexts(PVRSRV_SGXDEV_INFO *psDevInfo, ui32EDMDirListReg = EUR_CR_BIF_DIR_LIST_BASE1 + 4 * (SGX_BIF_DIR_LIST_INDEX_EDM - 1); #endif /* SGX_BIF_DIR_LIST_INDEX_EDM */ - ui32RegVal = psDevInfo->sKernelPDDevPAddr.uiAddr >> SGX_MMU_PDE_ADDR_ALIGNSHIFT; + ui32RegVal = (IMG_UINT32)(psDevInfo->sKernelPDDevPAddr.uiAddr >> SGX_MMU_PDE_ADDR_ALIGNSHIFT); #if defined(FIX_HW_BRN_28011) OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_DIR_LIST_BASE0, ui32RegVal); @@ -506,6 +506,16 @@ IMG_VOID SGXReset(PVRSRV_SGXDEV_INFO *psDevInfo, /* enable 36bit addressing mode if the MMU supports it*/ OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_BIF_36BIT_ADDRESSING, EUR_CR_BIF_36BIT_ADDRESSING_ENABLE_MASK); PDUMPREGWITHFLAGS(SGX_PDUMPREG_NAME, EUR_CR_BIF_36BIT_ADDRESSING, EUR_CR_BIF_36BIT_ADDRESSING_ENABLE_MASK, ui32PDUMPFlags); +#else + #if defined(EUR_CR_BIF_36BIT_ADDRESSING) + OSWriteHWReg(psDevInfo->pvRegsBaseKM, + EUR_CR_BIF_36BIT_ADDRESSING, + 0); + PDUMPREGWITHFLAGS(SGX_PDUMPREG_NAME, + EUR_CR_BIF_36BIT_ADDRESSING, + 0, + ui32PDUMPFlags); + #endif #endif SGXResetInitBIFContexts(psDevInfo, ui32PDUMPFlags); @@ -589,11 +599,11 @@ IMG_VOID SGXReset(PVRSRV_SGXDEV_INFO *psDevInfo, SGXResetSoftReset(psDevInfo, IMG_TRUE, ui32PDUMPFlags, IMG_FALSE); /* Map in the dummy page. */ - psDevInfo->pui32BIFResetPD[ui32PDIndex] = (psDevInfo->sBIFResetPTDevPAddr.uiAddr + psDevInfo->pui32BIFResetPD[ui32PDIndex] = (IMG_UINT32)(psDevInfo->sBIFResetPTDevPAddr.uiAddr >>SGX_MMU_PDE_ADDR_ALIGNSHIFT) | SGX_MMU_PDE_PAGE_SIZE_4K | SGX_MMU_PDE_VALID; - psDevInfo->pui32BIFResetPT[ui32PTIndex] = (psDevInfo->sBIFResetPageDevPAddr.uiAddr + psDevInfo->pui32BIFResetPT[ui32PTIndex] = (IMG_UINT32)(psDevInfo->sBIFResetPageDevPAddr.uiAddr >>SGX_MMU_PTE_ADDR_ALIGNSHIFT) | SGX_MMU_PTE_VALID; @@ -715,7 +725,7 @@ IMG_VOID SGXReset(PVRSRV_SGXDEV_INFO *psDevInfo, (4 << EUR_CR_MASTER_SLC_CTRL_ADDR_DECODE_MODE_SHIFT) | #endif #if defined(FIX_HW_BRN_33809) - (2 << EUR_CR_MASTER_SLC_CTRL_ADDR_DECODE_MODE_SHIFT) | + (1 << EUR_CR_MASTER_SLC_CTRL_ADDR_DECODE_MODE_SHIFT) | #endif (0xC << EUR_CR_MASTER_SLC_CTRL_ARB_PAGE_SIZE_SHIFT); OSWriteHWReg(psDevInfo->pvRegsBaseKM, EUR_CR_MASTER_SLC_CTRL, ui32RegVal); diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxtransfer.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxtransfer.c index 81f3b07..74dbc99 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxtransfer.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxtransfer.c @@ -58,11 +58,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "sgxutils.h" #include "ttrace.h" -#if defined (SUPPORT_SID_INTERFACE) -IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSFER_SGX_KICK_KM *psKick) -#else -IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSFER_SGX_KICK *psKick) +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) +#include "pvr_sync.h" #endif + +IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSFER_SGX_KICK *psKick) { PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psKick->hCCBMemInfo; SGXMKIF_COMMAND sCommand = {0}; @@ -125,7 +125,7 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_TRANSFER, TRANSFER_TOKEN_TA_SYNC, psSyncInfo, PVRSRV_SYNCOP_SAMPLE); - psSharedTransferCmd->ui32TASyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; + psSharedTransferCmd->ui32TASyncWriteOpsPendingVal = SyncTakeWriteOp(psSyncInfo, SYNC_OP_CLASS_TQ_3D); psSharedTransferCmd->ui32TASyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; psSharedTransferCmd->sTASyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; @@ -144,7 +144,7 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_TRANSFER, TRANSFER_TOKEN_3D_SYNC, psSyncInfo, PVRSRV_SYNCOP_SAMPLE); - psSharedTransferCmd->ui323DSyncWriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; + psSharedTransferCmd->ui323DSyncWriteOpsPendingVal = SyncTakeWriteOp(psSyncInfo,SYNC_OP_CLASS_TQ_3D); psSharedTransferCmd->ui323DSyncReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; psSharedTransferCmd->s3DSyncWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; @@ -210,9 +210,6 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF } } - psSharedTransferCmd->ui32NumSrcSyncs = ui32RealSrcSyncNum; - psSharedTransferCmd->ui32NumDstSyncs = ui32RealDstSyncNum; - if ((psKick->ui32Flags & SGXMKIF_TQFLAGS_KEEPPENDING) == 0UL) { IMG_UINT32 i = 0; @@ -271,7 +268,7 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF if (abSrcSyncEnable[loop]) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop]; - psSyncInfo->psSyncData->ui32ReadOpsPending++; + SyncTakeReadOp(psSyncInfo, SYNC_OP_CLASS_TQ_3D); } } for (loop = 0; loop < psKick->ui32NumDstSync; loop++) @@ -279,15 +276,92 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF if (abDstSyncEnable[loop]) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[loop]; - psSyncInfo->psSyncData->ui32WriteOpsPending++; + SyncTakeWriteOp(psSyncInfo, SYNC_OP_CLASS_TQ_3D); } } + +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + if (ui32RealDstSyncNum < SGX_MAX_TRANSFER_SYNC_OPS - 2 && psKick->iFenceFd > 0) + { + IMG_HANDLE ahSyncInfo[SGX_MAX_SRC_SYNCS_TA]; + PVRSRV_DEVICE_SYNC_OBJECT *apsDevSyncs = &psSharedTransferCmd->asDstSyncs[ui32RealDstSyncNum]; + IMG_UINT32 ui32NumSrcSyncs = 1; + IMG_UINT32 i; + ahSyncInfo[0] = (IMG_HANDLE)(psKick->iFenceFd - 1); + + eError = PVRSyncPatchTransferSyncInfos(ahSyncInfo, apsDevSyncs, &ui32NumSrcSyncs); + if (eError != PVRSRV_OK) + { + /* We didn't kick yet, or perform PDUMP processing, so we should + * be able to trivially roll back any changes made to the sync + * data. If we don't do this, we'll wedge services cleanup. + */ + + for (loop = 0; loop < psKick->ui32NumDstSync; loop++) + { + if (abDstSyncEnable[loop]) + { + psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[loop]; + psSyncInfo->psSyncData->ui32WriteOpsPending--; + } + } + + for (loop = 0; loop < psKick->ui32NumSrcSync; loop++) + { + if (abSrcSyncEnable[loop]) + { + psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop]; + psSyncInfo->psSyncData->ui32ReadOpsPending--; + } + } + + if (psKick->h3DSyncInfo != IMG_NULL) + { + psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo; + psSyncInfo->psSyncData->ui32WriteOpsPending++; + } + + if (psKick->hTASyncInfo != IMG_NULL) + { + psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo; + psSyncInfo->psSyncData->ui32WriteOpsPending--; + } + + PVR_DPF((PVR_DBG_ERROR, "SGXSubmitTransferKM: PVRSyncPatchTransferKickSyncInfos failed.")); + PVR_TTRACE(PVRSRV_TRACE_GROUP_TRANSFER, PVRSRV_TRACE_CLASS_FUNCTION_EXIT, + TRANSFER_TOKEN_SUBMIT); + return eError; + } + + /* Find a free dst sync to slot in our extra sync */ + for (loop = 0; loop < psKick->ui32NumDstSync; loop++) + { + if (abDstSyncEnable[loop]) + break; + } + + /* We shouldn't be in this code path if ui32RealDstSyncNum + * didn't allow for at least two free synchronization slots. + */ + PVR_ASSERT(loop + ui32NumSrcSyncs <= SGX_MAX_TRANSFER_SYNC_OPS); + + /* Slot in the extra dst syncs */ + for (i = 0; i < ui32NumSrcSyncs; i++) + { + psKick->ahDstSyncInfo[loop + i] = ahSyncInfo[i]; + abDstSyncEnable[loop + i] = IMG_TRUE; + psKick->ui32NumDstSync++; + ui32RealDstSyncNum++; + } + } +#endif /* defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) */ } + psSharedTransferCmd->ui32NumSrcSyncs = ui32RealSrcSyncNum; + psSharedTransferCmd->ui32NumDstSyncs = ui32RealDstSyncNum; + #if defined(PDUMP) - if ((PDumpIsCaptureFrameKM() - || ((psKick->ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0)) - && (bPersistentProcess == IMG_FALSE) ) + if (PDumpWillCapture(psKick->ui32PDumpFlags)) { PDUMPCOMMENT("Shared part of transfer command\r\n"); PDUMPMEM(psSharedTransferCmd, @@ -305,9 +379,15 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF { if (abSrcSyncEnable[loop]) { + IMG_UINT32 ui32PDumpReadOp2 = 0; psSyncInfo = psKick->ahSrcSyncInfo[loop]; PDUMPCOMMENT("Tweak src surface write op in transfer cmd\r\n"); +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_PERSISTENT, "TQ Src: PDump sync sample: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, psCCBMemInfo, psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, asSrcSyncs) + i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32WriteOpsPendingVal)), @@ -322,6 +402,14 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF sizeof(psSyncInfo->psSyncData->ui32LastReadOpDumpVal), psKick->ui32PDumpFlags, MAKEUNIQUETAG(psCCBMemInfo)); + + PDUMPCOMMENT("Tweak srv surface read op2 in transfer cmd\r\n"); + PDUMPMEM(&ui32PDumpReadOp2, + psCCBMemInfo, + psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, asSrcSyncs) + i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32ReadOps2PendingVal)), + sizeof(ui32PDumpReadOp2), + psKick->ui32PDumpFlags, + MAKEUNIQUETAG(psCCBMemInfo)); i++; } } @@ -335,6 +423,11 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF psSyncInfo = psKick->ahDstSyncInfo[loop]; PDUMPCOMMENT("Tweak dest surface write op in transfer cmd\r\n"); +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_PERSISTENT, "TQ Dst: PDump sync sample: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, psCCBMemInfo, psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, asDstSyncs) + i * sizeof(PVRSRV_DEVICE_SYNC_OBJECT) + offsetof(PVRSRV_DEVICE_SYNC_OBJECT, ui32WriteOpsPendingVal)), @@ -373,6 +466,12 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop]; psSyncInfo->psSyncData->ui32LastReadOpDumpVal++; +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_PERSISTENT, + "TQ Src: PDump sync update: uiAddr = 0x%08x, ui32LastReadOpDumpVal = 0x%08x\r\n", + psSyncInfo->sReadOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastReadOpDumpVal); +#endif } } @@ -380,8 +479,14 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF { if (abDstSyncEnable[loop]) { - psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[0]; + psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[loop]; psSyncInfo->psSyncData->ui32LastOpDumpVal++; +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_PERSISTENT, + "TQ Dst: PDump sync update: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif } } } @@ -391,6 +496,11 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF psSyncInfo = psKick->hTASyncInfo; PDUMPCOMMENT("Tweak TA/TQ surface write op in transfer cmd\r\n"); +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENT("TQ TA/TQ: PDump sync sample: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, psCCBMemInfo, psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, ui32TASyncWriteOpsPendingVal)), @@ -398,6 +508,14 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF psKick->ui32PDumpFlags, MAKEUNIQUETAG(psCCBMemInfo)); + PDUMPCOMMENT("Tweak TA/TQ surface read op in transfer cmd\r\n"); + PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal, + psCCBMemInfo, + psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, ui32TASyncReadOpsPendingVal)), + sizeof(psSyncInfo->psSyncData->ui32LastReadOpDumpVal), + psKick->ui32PDumpFlags, + MAKEUNIQUETAG(psCCBMemInfo)); + psSyncInfo->psSyncData->ui32LastOpDumpVal++; } @@ -406,6 +524,11 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF psSyncInfo = psKick->h3DSyncInfo; PDUMPCOMMENT("Tweak 3D/TQ surface write op in transfer cmd\r\n"); +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENT("TQ 3D/TQ: PDump sync sample: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif PDUMPMEM(&psSyncInfo->psSyncData->ui32LastOpDumpVal, psCCBMemInfo, psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, ui323DSyncWriteOpsPendingVal)), @@ -413,6 +536,14 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF psKick->ui32PDumpFlags, MAKEUNIQUETAG(psCCBMemInfo)); + PDUMPCOMMENT("Tweak 3D/TQ surface read op in transfer cmd\r\n"); + PDUMPMEM(&psSyncInfo->psSyncData->ui32LastReadOpDumpVal, + psCCBMemInfo, + psKick->ui32CCBDumpWOff + (IMG_UINT32)(offsetof(SGXMKIF_TRANSFERCMD_SHARED, ui323DSyncReadOpsPendingVal)), + sizeof(psSyncInfo->psSyncData->ui32LastReadOpDumpVal), + psKick->ui32PDumpFlags, + MAKEUNIQUETAG(psCCBMemInfo)); + psSyncInfo->psSyncData->ui32LastOpDumpVal++; } } @@ -435,7 +566,7 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF if (abSrcSyncEnable[loop]) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahSrcSyncInfo[loop]; - psSyncInfo->psSyncData->ui32ReadOpsPending--; + SyncRollBackReadOp(psSyncInfo, SYNC_OP_CLASS_TQ_3D); #if defined(PDUMP) if (PDumpIsCaptureFrameKM() || ((psKick->ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0)) @@ -450,7 +581,7 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF if (abDstSyncEnable[loop]) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->ahDstSyncInfo[loop]; - psSyncInfo->psSyncData->ui32WriteOpsPending--; + SyncRollBackWriteOp(psSyncInfo, SYNC_OP_CLASS_TQ_3D); #if defined(PDUMP) if (PDumpIsCaptureFrameKM() || ((psKick->ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0)) @@ -466,14 +597,14 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF if (psKick->hTASyncInfo != IMG_NULL) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo; - psSyncInfo->psSyncData->ui32WriteOpsPending--; + SyncRollBackWriteOp(psSyncInfo, SYNC_OP_CLASS_TQ_3D); } /* Command needed to be synchronised with the 3D? */ if (psKick->h3DSyncInfo != IMG_NULL) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo; - psSyncInfo->psSyncData->ui32WriteOpsPending--; + SyncRollBackWriteOp(psSyncInfo, SYNC_OP_CLASS_TQ_3D); } } @@ -529,11 +660,7 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmitTransferKM(IMG_HANDLE hDevHandle, PVRSRV_TRANSF } #if defined(SGX_FEATURE_2D_HARDWARE) -#if defined (SUPPORT_SID_INTERFACE) -IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK_KM *psKick) -#else IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK *psKick) -#endif { PVRSRV_KERNEL_MEM_INFO *psCCBMemInfo = (PVRSRV_KERNEL_MEM_INFO *)psKick->hCCBMemInfo; @@ -543,21 +670,6 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK PVRSRV_ERROR eError; IMG_UINT32 i; IMG_HANDLE hDevMemContext = IMG_NULL; -#if defined(PDUMP) - IMG_BOOL bPersistentProcess = IMG_FALSE; - /* - * For persistent processes, the HW kicks should not go into the - * extended init phase; only keep memory transactions from the - * window system which are necessary to run the client app. - */ - { - PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData(); - if(psPerProc != IMG_NULL) - { - bPersistentProcess = psPerProc->bPDumpPersistent; - } - } -#endif /* PDUMP */ #if defined(FIX_HW_BRN_31620) hDevMemContext = psKick->hDevMemContext; #endif @@ -571,31 +683,39 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK /* PRQA S 3305 1 */ ps2DCmd = CCB_DATA_FROM_OFFSET(SGXMKIF_2DCMD_SHARED, psCCBMemInfo, psKick, ui32SharedCmdCCBOffset); - OSMemSet(ps2DCmd, 0, sizeof(*ps2DCmd)); - /* Command needs to be synchronised with the TA? */ if (psKick->hTASyncInfo != IMG_NULL) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo; - ps2DCmd->sTASyncData.ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; + ps2DCmd->sTASyncData.ui32WriteOpsPendingVal = SyncTakeWriteOp(psSyncInfo, SYNC_OP_CLASS_TQ_2D); ps2DCmd->sTASyncData.ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; ps2DCmd->sTASyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; ps2DCmd->sTASyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; } + else + { + ps2DCmd->sTASyncData.sWriteOpsCompleteDevVAddr.uiAddr = 0; + ps2DCmd->sTASyncData.sReadOpsCompleteDevVAddr.uiAddr = 0; + } /* Command needs to be synchronised with the 3D? */ if (psKick->h3DSyncInfo != IMG_NULL) { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo; - ps2DCmd->s3DSyncData.ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending++; + ps2DCmd->s3DSyncData.ui32WriteOpsPendingVal = SyncTakeWriteOp(psSyncInfo, SYNC_OP_CLASS_TQ_2D); ps2DCmd->s3DSyncData.ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; ps2DCmd->s3DSyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; ps2DCmd->s3DSyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; } + else + { + ps2DCmd->s3DSyncData.sWriteOpsCompleteDevVAddr.uiAddr = 0; + ps2DCmd->s3DSyncData.sReadOpsCompleteDevVAddr.uiAddr = 0; + } /* * We allow the first source and destination sync objects to be the @@ -604,6 +724,7 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK * values from the objects. */ ps2DCmd->ui32NumSrcSync = psKick->ui32NumSrcSync; + for (i = 0; i < psKick->ui32NumSrcSync; i++) { psSyncInfo = psKick->ahSrcSyncInfo[i]; @@ -626,25 +747,26 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK ps2DCmd->sDstSyncData.sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; ps2DCmd->sDstSyncData.sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; ps2DCmd->sDstSyncData.sReadOps2CompleteDevVAddr = psSyncInfo->sReadOps2CompleteDevVAddr; + + /* We can do this immediately as we only have one */ + SyncTakeWriteOp(psSyncInfo, SYNC_OP_CLASS_TQ_2D); + } + else + { + ps2DCmd->sDstSyncData.sWriteOpsCompleteDevVAddr.uiAddr = 0; + ps2DCmd->sDstSyncData.sReadOpsCompleteDevVAddr.uiAddr = 0; + ps2DCmd->sDstSyncData.sReadOps2CompleteDevVAddr.uiAddr = 0; } /* Read/Write ops pending updates, delayed from above */ for (i = 0; i < psKick->ui32NumSrcSync; i++) { psSyncInfo = psKick->ahSrcSyncInfo[i]; - psSyncInfo->psSyncData->ui32ReadOpsPending++; - } - - if (psKick->hDstSyncInfo != IMG_NULL) - { - psSyncInfo = psKick->hDstSyncInfo; - psSyncInfo->psSyncData->ui32WriteOpsPending++; + SyncTakeReadOp(psSyncInfo, SYNC_OP_CLASS_TQ_2D); } #if defined(PDUMP) - if ((PDumpIsCaptureFrameKM() - || ((psKick->ui32PDumpFlags & PDUMP_FLAGS_CONTINUOUS) != 0)) - && (bPersistentProcess == IMG_FALSE) ) + if (PDumpWillCapture(psKick->ui32PDumpFlags)) { /* Pdump the command from the per context CCB */ PDUMPCOMMENT("Shared part of 2D command\r\n"); @@ -710,12 +832,24 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK { psSyncInfo = psKick->ahSrcSyncInfo[i]; psSyncInfo->psSyncData->ui32LastReadOpDumpVal++; +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_PERSISTENT, + "TQ2D Src: PDump sync update: uiAddr = 0x%08x, ui32LastReadOpDumpVal = 0x%08x\r\n", + psSyncInfo->sReadOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastReadOpDumpVal); +#endif } if (psKick->hDstSyncInfo != IMG_NULL) { psSyncInfo = psKick->hDstSyncInfo; psSyncInfo->psSyncData->ui32LastOpDumpVal++; +#if defined(SUPPORT_PDUMP_SYNC_DEBUG) + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_PERSISTENT, + "TQ2D Dst: PDump sync update: uiAddr = 0x%08x, ui32LastOpDumpVal = 0x%08x\r\n", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32LastOpDumpVal); +#endif } } #endif @@ -749,13 +883,13 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK for (i = 0; i < psKick->ui32NumSrcSync; i++) { psSyncInfo = psKick->ahSrcSyncInfo[i]; - psSyncInfo->psSyncData->ui32ReadOpsPending--; + SyncRollBackReadOp(psSyncInfo, SYNC_OP_CLASS_TQ_2D); } if (psKick->hDstSyncInfo != IMG_NULL) { psSyncInfo = psKick->hDstSyncInfo; - psSyncInfo->psSyncData->ui32WriteOpsPending--; + SyncRollBackWriteOp(psSyncInfo, SYNC_OP_CLASS_TQ_2D); } /* Command needed to be synchronised with the TA? */ @@ -763,7 +897,7 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->hTASyncInfo; - psSyncInfo->psSyncData->ui32WriteOpsPending--; + SyncRollBackWriteOp(psSyncInfo, SYNC_OP_CLASS_TQ_2D); } /* Command needed to be synchronised with the 3D? */ @@ -771,7 +905,7 @@ IMG_EXPORT PVRSRV_ERROR SGXSubmit2DKM(IMG_HANDLE hDevHandle, PVRSRV_2D_SGX_KICK { psSyncInfo = (PVRSRV_KERNEL_SYNC_INFO *)psKick->h3DSyncInfo; - psSyncInfo->psSyncData->ui32WriteOpsPending--; + SyncRollBackWriteOp(psSyncInfo, SYNC_OP_CLASS_TQ_2D); } } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxutils.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxutils.c index d5cb3c1..b1d2b13 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxutils.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/devices/sgx/sgxutils.c @@ -57,6 +57,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "pvr_debug.h" #include "sgxutils.h" #include "ttrace.h" +#include "sgxmmu.h" #ifdef __linux__ #include <linux/kernel.h> // sprintf @@ -286,7 +287,11 @@ PVRSRV_ERROR SGXScheduleCCBCommand(PVRSRV_DEVICE_NODE *psDeviceNode, #if defined(PDUMP) IMG_VOID *pvDumpCommand; IMG_BOOL bPDumpIsSuspended = PDumpIsSuspended(); - IMG_BOOL bPersistentProcess = IMG_FALSE; +#if defined(SUPPORT_PDUMP_MULTI_PROCESS) + IMG_BOOL bPDumpActive = _PDumpIsProcessActive(); +#else + IMG_BOOL bPDumpActive = IMG_TRUE; +#endif #else PVR_UNREFERENCED_PARAMETER(ui32CallerID); PVR_UNREFERENCED_PARAMETER(ui32PDumpFlags); @@ -424,20 +429,6 @@ PVRSRV_ERROR SGXScheduleCCBCommand(PVRSRV_DEVICE_NODE *psDeviceNode, } } #endif -#if defined(PDUMP) - /* - * For persistent processes, the HW kicks should not go into the - * extended init phase; only keep memory transactions from the - * window system which are necessary to run the client app. - */ - { - PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData(); - if(psPerProc != IMG_NULL) - { - bPersistentProcess = psPerProc->bPDumpPersistent; - } - } -#endif /* PDUMP */ psKernelCCB = psDevInfo->psKernelCCBInfo; psSGXCommand = SGXAcquireKernelCCBSlot(psKernelCCB); @@ -498,7 +489,7 @@ PVRSRV_ERROR SGXScheduleCCBCommand(PVRSRV_DEVICE_NODE *psDeviceNode, #if defined(PDUMP) if ((ui32CallerID != ISR_ID) && (bPDumpIsSuspended == IMG_FALSE) && - (bPersistentProcess == IMG_FALSE) ) + (bPDumpActive == IMG_TRUE) ) { /* Poll for space in the CCB. */ PDUMPCOMMENTWITHFLAGS(ui32PDumpFlags, "Poll for space in the Kernel CCB\r\n"); @@ -561,7 +552,7 @@ PVRSRV_ERROR SGXScheduleCCBCommand(PVRSRV_DEVICE_NODE *psDeviceNode, #if defined(PDUMP) if ((ui32CallerID != ISR_ID) && (bPDumpIsSuspended == IMG_FALSE) && - (bPersistentProcess == IMG_FALSE) ) + (bPDumpActive == IMG_TRUE) ) { #if defined(FIX_HW_BRN_26620) && defined(SGX_FEATURE_SYSTEM_CACHE) && !defined(SGX_BYPASS_SYSTEM_CACHE) PDUMPCOMMENTWITHFLAGS(ui32PDumpFlags, "Poll for previous Kernel CCB CMD to be read\r\n"); @@ -723,8 +714,9 @@ PVRSRV_ERROR SGXScheduleCCBCommandKM(PVRSRV_DEVICE_NODE *psDeviceNode, } else { - PVR_DPF((PVR_DBG_ERROR,"SGXScheduleCCBCommandKM failed to acquire lock - " + PVR_DPF((PVR_DBG_ERROR,"SGXScheduleCCBCommandKM failed to power up device - " "ui32CallerID:%d eError:%u", ui32CallerID, eError)); + PVRSRVPowerUnlock(ui32CallerID); return eError; } @@ -752,10 +744,18 @@ PVRSRV_ERROR SGXScheduleProcessQueuesKM(PVRSRV_DEVICE_NODE *psDeviceNode) { PVRSRV_ERROR eError; PVRSRV_SGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice; - SGXMKIF_HOST_CTL *psHostCtl = psDevInfo->psKernelSGXHostCtlMemInfo->pvLinAddrKM; + SGXMKIF_HOST_CTL *psHostCtl; IMG_UINT32 ui32PowerStatus; SGXMKIF_COMMAND sCommand = {0}; + if (psDevInfo->psKernelSGXHostCtlMemInfo == IMG_NULL) + { + /* Part2 hasn't run yet, we can't do anything */ + return PVRSRV_OK; + } + + psHostCtl = psDevInfo->psKernelSGXHostCtlMemInfo->pvLinAddrKM; + ui32PowerStatus = psHostCtl->ui32PowerStatus; if ((ui32PowerStatus & PVRSRV_USSE_EDM_POWMAN_NO_WORK) != 0) { @@ -811,11 +811,7 @@ IMG_BOOL SGXIsDevicePowered(PVRSRV_DEVICE_NODE *psDeviceNode) ******************************************************************************/ IMG_EXPORT PVRSRV_ERROR SGXGetInternalDevInfoKM(IMG_HANDLE hDevCookie, -#if defined (SUPPORT_SID_INTERFACE) - SGX_INTERNAL_DEVINFO_KM *psSGXInternalDevInfo) -#else SGX_INTERNAL_DEVINFO *psSGXInternalDevInfo) -#endif { PVRSRV_SGXDEV_INFO *psDevInfo = (PVRSRV_SGXDEV_INFO *)((PVRSRV_DEVICE_NODE *)hDevCookie)->pvDevice; @@ -1094,6 +1090,7 @@ IMG_HANDLE SGXRegisterHWRenderContextKM(IMG_HANDLE hDeviceNode, IMG_UINT8 *pSrc; IMG_UINT8 *pDst; PRESMAN_ITEM psResItem; + IMG_UINT32 ui32PDDevPAddrInDirListFormat; eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(SGX_HW_RENDER_CONTEXT_CLEANUP), @@ -1159,17 +1156,23 @@ IMG_HANDLE SGXRegisterHWRenderContextKM(IMG_HANDLE hDeviceNode, psMMUContext = BM_GetMMUContextFromMemContext(hDevMemContextInt); sPDDevPAddr = psDeviceNode->pfnMMUGetPDDevPAddr(psMMUContext); + /* + The PDDevPAddr needs to be shifted-down, as the uKernel expects it in the + format it will be inserted into the DirList registers in. + */ + ui32PDDevPAddrInDirListFormat = (IMG_UINT32)(sPDDevPAddr.uiAddr >> SGX_MMU_PTE_ADDR_ALIGNSHIFT); + /* patch-in the Page-Directory Device-Physical address. Note that this is copied-in one byte at a time, as we have no guarantee that the usermode- provided ui32OffsetToPDDevPAddr is a validly-aligned address for the current CPU architecture. */ - pSrc = (IMG_UINT8 *)&sPDDevPAddr; + pSrc = (IMG_UINT8 *)&ui32PDDevPAddrInDirListFormat; pDst = (IMG_UINT8 *)psCleanup->psHWRenderContextMemInfo->pvLinAddrKM; pDst += ui32OffsetToPDDevPAddr; - for (iPtrByte = 0; iPtrByte < sizeof(IMG_DEV_PHYADDR); iPtrByte++) + for (iPtrByte = 0; iPtrByte < sizeof(ui32PDDevPAddrInDirListFormat); iPtrByte++) { pDst[iPtrByte] = pSrc[iPtrByte]; } @@ -1274,6 +1277,7 @@ IMG_HANDLE SGXRegisterHWTransferContextKM(IMG_HANDLE hDeviceNode, IMG_UINT8 *pSrc; IMG_UINT8 *pDst; PRESMAN_ITEM psResItem; + IMG_UINT32 ui32PDDevPAddrInDirListFormat; eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(SGX_HW_TRANSFER_CONTEXT_CLEANUP), @@ -1290,6 +1294,7 @@ IMG_HANDLE SGXRegisterHWTransferContextKM(IMG_HANDLE hDeviceNode, psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo; psHeapInfo = &psDevMemoryInfo->psDeviceMemoryHeap[SGX_KERNEL_DATA_HEAP_ID]; + PDUMPCOMMENTWITHFLAGS(PDUMP_FLAGS_CONTINUOUS, "Allocate HW Transfer context"); eError = PVRSRVAllocDeviceMemKM(hDeviceNode, psPerProc, psHeapInfo->hDevMemHeap, @@ -1339,17 +1344,23 @@ IMG_HANDLE SGXRegisterHWTransferContextKM(IMG_HANDLE hDeviceNode, psMMUContext = BM_GetMMUContextFromMemContext(hDevMemContextInt); sPDDevPAddr = psDeviceNode->pfnMMUGetPDDevPAddr(psMMUContext); + /* + The PDDevPAddr needs to be shifted-down, as the uKernel expects it in the + format it will be inserted into the DirList registers in. + */ + ui32PDDevPAddrInDirListFormat = (IMG_UINT32)(sPDDevPAddr.uiAddr >> SGX_MMU_PTE_ADDR_ALIGNSHIFT); + /* patch-in the Page-Directory Device-Physical address. Note that this is copied-in one byte at a time, as we have no guarantee that the usermode- provided ui32OffsetToPDDevPAddr is a validly-aligned address for the current CPU architecture. */ - pSrc = (IMG_UINT8 *)&sPDDevPAddr; + pSrc = (IMG_UINT8 *)&ui32PDDevPAddrInDirListFormat; pDst = (IMG_UINT8 *)psCleanup->psHWTransferContextMemInfo->pvLinAddrKM; pDst += ui32OffsetToPDDevPAddr; - for (iPtrByte = 0; iPtrByte < sizeof(IMG_DEV_PHYADDR); iPtrByte++) + for (iPtrByte = 0; iPtrByte < sizeof(ui32PDDevPAddrInDirListFormat); iPtrByte++) { pDst[iPtrByte] = pSrc[iPtrByte]; } @@ -1607,6 +1618,7 @@ IMG_HANDLE SGXRegisterHW2DContextKM(IMG_HANDLE hDeviceNode, IMG_UINT8 *pSrc; IMG_UINT8 *pDst; PRESMAN_ITEM psResItem; + IMG_UINT32 ui32PDDevPAddrInDirListFormat; eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(SGX_HW_2D_CONTEXT_CLEANUP), @@ -1671,17 +1683,23 @@ IMG_HANDLE SGXRegisterHW2DContextKM(IMG_HANDLE hDeviceNode, psMMUContext = BM_GetMMUContextFromMemContext(hDevMemContextInt); sPDDevPAddr = psDeviceNode->pfnMMUGetPDDevPAddr(psMMUContext); + /* + The PDDevPAddr needs to be shifted-down, as the uKernel expects it in the + format it will be inserted into the DirList registers in. + */ + ui32PDDevPAddrInDirListFormat = sPDDevPAddr.uiAddr >> SGX_MMU_PTE_ADDR_ALIGNSHIFT; + /* patch-in the Page-Directory Device-Physical address. Note that this is copied-in one byte at a time, as we have no guarantee that the usermode- provided ui32OffsetToPDDevPAddr is a validly-aligned address for the current CPU architecture. */ - pSrc = (IMG_UINT8 *)&sPDDevPAddr; + pSrc = (IMG_UINT8 *)&ui32PDDevPAddrInDirListFormat; pDst = (IMG_UINT8 *)psCleanup->psHW2DContextMemInfo->pvLinAddrKM; pDst += ui32OffsetToPDDevPAddr; - for (iPtrByte = 0; iPtrByte < sizeof(IMG_DEV_PHYADDR); iPtrByte++) + for (iPtrByte = 0; iPtrByte < sizeof(ui32PDDevPAddrInDirListFormat); iPtrByte++) { pDst[iPtrByte] = pSrc[iPtrByte]; } @@ -1850,8 +1868,8 @@ PVRSRV_ERROR SGX2DQueryBlitsCompleteKM(PVRSRV_SGXDEV_INFO *psDevInfo, { PVRSRV_SYNC_DATA *psSyncData = psSyncInfo->psSyncData; - PVR_TRACE(("SGX2DQueryBlitsCompleteKM: Syncinfo: 0x%x, Syncdata: 0x%x", - (IMG_UINTPTR_T)psSyncInfo, (IMG_UINTPTR_T)psSyncData)); + PVR_TRACE(("SGX2DQueryBlitsCompleteKM: Syncinfo: 0x%p, Syncdata: 0x%p", + psSyncInfo, psSyncData)); PVR_TRACE(("SGX2DQueryBlitsCompleteKM: Read ops complete: %d, Read ops pending: %d", psSyncData->ui32ReadOpsComplete, psSyncData->ui32ReadOpsPending)); PVR_TRACE(("SGX2DQueryBlitsCompleteKM: Write ops complete: %d, Write ops pending: %d", psSyncData->ui32WriteOpsComplete, psSyncData->ui32WriteOpsPending)); diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/Kbuild.mk b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/Kbuild.mk index 25e35e9..10064d6 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/Kbuild.mk +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/Kbuild.mk @@ -38,7 +38,7 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ### ########################################################################### -pvrsrvkm_sgx$(SGXCORE)_$(SGX_CORE_REV)-y += \ +pvrsrvkm-y += \ services4/srvkm/env/linux/osfunc.o \ services4/srvkm/env/linux/mutils.o \ services4/srvkm/env/linux/mmap.o \ @@ -51,10 +51,8 @@ pvrsrvkm_sgx$(SGXCORE)_$(SGX_CORE_REV)-y += \ services4/srvkm/env/linux/mutex.o \ services4/srvkm/env/linux/event.o \ services4/srvkm/env/linux/osperproc.o \ - services4/srvkm/env/linux/sysfs.o \ services4/srvkm/common/buffer_manager.o \ services4/srvkm/common/devicemem.o \ - services4/srvkm/common/deviceclass.o \ services4/srvkm/common/handle.o \ services4/srvkm/common/hash.o \ services4/srvkm/common/lists.o \ @@ -66,7 +64,6 @@ pvrsrvkm_sgx$(SGXCORE)_$(SGX_CORE_REV)-y += \ services4/srvkm/common/perproc.o \ services4/srvkm/common/power.o \ services4/srvkm/common/pvrsrv.o \ - services4/srvkm/common/queue.o \ services4/srvkm/common/ra.o \ services4/srvkm/common/refcount.o \ services4/srvkm/common/resman.o \ @@ -75,21 +72,32 @@ pvrsrvkm_sgx$(SGXCORE)_$(SGX_CORE_REV)-y += \ services4/system/$(PVR_SYSTEM)/sysconfig.o \ services4/system/$(PVR_SYSTEM)/sysutils.o -pvrsrvkm_sgx$(SGXCORE)_$(SGX_CORE_REV)-$(CONFIG_ION_OMAP) += \ - services4/srvkm/env/linux/ion.o -pvrsrvkm_sgx$(SGXCORE)_$(SGX_CORE_REV)-$(CONFIG_GCBV) += \ - services4/srvkm/env/linux/gc_bvmapping.o +ifeq ($(SUPPORT_PVRSRV_DEVICE_CLASS),1) +pvrsrvkm-y += \ + services4/srvkm/common/deviceclass.o \ + services4/srvkm/common/queue.o +endif ifeq ($(SUPPORT_ION),1) pvrsrvkm-y += \ services4/srvkm/env/linux/ion.o endif +ifeq ($(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC),1) +pvrsrvkm-y += \ + services4/srvkm/env/linux/pvr_sync.o +endif + ifeq ($(TTRACE),1) pvrsrvkm-y += \ services4/srvkm/common/ttrace.o endif +ifeq ($(SUPPORT_PVRSRV_ANDROID_SYSTRACE),1) +pvrsrvkm-y += \ + services4/srvkm/env/linux/systrace.o +endif + ifneq ($(W),1) CFLAGS_osfunc.o := -Werror CFLAGS_mutils.o := -Werror @@ -127,7 +135,7 @@ endif # SUPPORT_SGX==1 only -pvrsrvkm_sgx$(SGXCORE)_$(SGX_CORE_REV)-y += \ +pvrsrvkm-y += \ services4/srvkm/bridged/sgx/bridged_sgx_bridge.o \ services4/srvkm/devices/sgx/sgxinit.o \ services4/srvkm/devices/sgx/sgxpower.o \ @@ -152,11 +160,11 @@ endif ifeq ($(SUPPORT_DRI_DRM),1) -pvrsrvkm_sgx$(SGXCORE)_$(SGX_CORE_REV)-y += \ +pvrsrvkm-y += \ services4/srvkm/env/linux/pvr_drm.o ccflags-y += \ - -I$(KERNELDIR)/include/drm \ + -Iinclude/drm \ -I$(TOP)/services4/include/env/linux \ ifeq ($(PVR_DRI_DRM_NOT_PCI),1) diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/Linux.mk b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/Linux.mk index 7e3d0fb..535a1f9 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/Linux.mk +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/Linux.mk @@ -41,5 +41,5 @@ modules := srvkm srvkm_type := kernel_module -srvkm_target := pvrsrvkm_sgx$(SGXCORE)_$(SGX_CORE_REV).ko +srvkm_target := pvrsrvkm.ko srvkm_makefile := $(THIS_DIR)/Kbuild.mk diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/env_perproc.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/env_perproc.h index 8a37a7f..788e80f 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/env_perproc.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/env_perproc.h @@ -43,8 +43,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define __ENV_PERPROC_H__ #include <linux/list.h> -#include <linux/proc_fs.h> +#include "proc.h" #include "services.h" #include "handle.h" @@ -56,7 +56,7 @@ typedef struct _PVRSRV_ENV_PER_PROCESS_DATA_ #if defined(SUPPORT_DRI_DRM) && defined(PVR_SECURE_DRM_AUTH_EXPORT) struct list_head sDRMAuthListHead; #endif -#if defined (SUPPORT_ION) +#if defined(SUPPORT_ION) struct ion_client *psIONClient; IMG_CHAR azIonClientName[ION_CLIENT_NAME_SIZE]; #endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/event.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/event.c index c335640..c60f2d5 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/event.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/event.c @@ -49,7 +49,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <asm/io.h> #include <asm/page.h> -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)) && (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) #include <asm/system.h> #endif #include <linux/mm.h> @@ -74,7 +74,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "pvrmmap.h" #include "mmap.h" #include "env_data.h" -#include "proc.h" #include "mutex.h" #include "lock.h" #include "event.h" diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/ion.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/ion.c index 5cb1521..036f1bd 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/ion.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/ion.c @@ -41,321 +41,417 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "ion.h" -#include "services.h" -#include "servicesint.h" -#include "mutex.h" -#include "lock.h" -#include "mm.h" -#include "handle.h" -#include "perproc.h" -#include "env_perproc.h" -#include "private_data.h" -#include "pvr_debug.h" - -#include <linux/module.h> -#include <linux/file.h> -#include <linux/fs.h> - -#if defined (CONFIG_ION_OMAP) -#define MAX_HANDLES_PER_FD 2 -extern struct ion_client *gpsIONClient; - -int PVRSRVExportFDToIONHandles(int fd, struct ion_client **client, - struct ion_handle **handles, - unsigned int *num_handles) -{ - PVRSRV_FILE_PRIVATE_DATA *psPrivateData; - PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; - LinuxMemArea *psLinuxMemArea; - PVRSRV_ERROR eError; - struct file *psFile; - int i; - unsigned int ui32NumHandles = *num_handles; - int ret = -EINVAL; +/* Three possible configurations: + * + * - SUPPORT_ION && CONFIG_ION_OMAP + * Real ion support, but sharing with an SOC ion device. We need + * to co-share the heaps too. + * + * - SUPPORT_ION && !CONFIG_ION_OMAP + * "Reference" ion implementation. Creates its own ion device + * and heaps for the driver to use. + */ - /* Take the bridge mutex so the handle won't be freed underneath us */ - LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); +#if defined(SUPPORT_ION) - psFile = fget(fd); - if(!psFile) - goto err_unlock; +#include <linux/scatterlist.h> +#include <linux/kernel.h> +#include <linux/slab.h> +#include <linux/err.h> - psPrivateData = psFile->private_data; - if(!psPrivateData) - { - PVR_DPF((PVR_DBG_ERROR, "%s: struct file* has no private_data; " - "invalid export handle", __func__)); - goto err_fput; - } +#if defined(CONFIG_ION_OMAP) - eError = PVRSRVLookupHandle(KERNEL_HANDLE_BASE, - (IMG_PVOID *)&psKernelMemInfo, - psPrivateData->hKernelMemInfo, - PVRSRV_HANDLE_TYPE_MEM_INFO); - if(eError != PVRSRV_OK) - { - PVR_DPF((PVR_DBG_ERROR, "%s: Failed to look up MEM_INFO handle", - __func__)); - goto err_fput; - } +/* Real ion with sharing */ - psLinuxMemArea = (LinuxMemArea *)psKernelMemInfo->sMemBlk.hOSMemHandle; - BUG_ON(psLinuxMemArea == IMG_NULL); +extern struct ion_device *omap_ion_device; +struct ion_device *gpsIonDev; - if(psLinuxMemArea->eAreaType != LINUX_MEM_AREA_ION) - { - PVR_DPF((PVR_DBG_ERROR, "%s: Valid handle, but not an ION buffer", - __func__)); - goto err_fput; - } +PVRSRV_ERROR IonInit(IMG_VOID) +{ + gpsIonDev = omap_ion_device; + return PVRSRV_OK; +} - /* Client is requesting fewer handles then we have */ - if(ui32NumHandles < psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes) { +IMG_VOID IonDeinit(IMG_VOID) +{ + gpsIonDev = IMG_NULL; +} - PVR_DPF((PVR_DBG_ERROR, "%s: Client requested %u handles, but we have %u", - __func__, - ui32NumHandles, - psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes)); +#else /* defined(CONFIG_ION_OMAP) */ - /* Clear client handles */ - for (i = 0; i < ui32NumHandles; i++) - handles[i] = NULL; +#if defined(CONFIG_ION_S5P) - /* Return number of handles to client */ - *num_handles = psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes; - goto err_fput; - } +/* Real ion with sharing (s5pv210) */ + +extern struct ion_device *s5p_ion_device; +struct ion_device *gpsIonDev; + +PVRSRV_ERROR IonInit(IMG_VOID) +{ + gpsIonDev = s5p_ion_device; + return PVRSRV_OK; +} - for (i = 0; (i < psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes) && (i < MAX_HANDLES_PER_FD); i++) - handles[i] = psLinuxMemArea->uData.sIONTilerAlloc.psIONHandle[i]; +IMG_VOID IonDeinit(IMG_VOID) +{ + gpsIonDev = IMG_NULL; +} - *num_handles = i; +#else /* defined(CONFIG_ION_S5P) */ - if(client) - *client = gpsIONClient; +#if defined(CONFIG_ION_SUNXI) - ret = 0; +/* Real ion with sharing (sunxi) */ -err_fput: - fput(psFile); -err_unlock: - /* Allow PVRSRV clients to communicate with srvkm again */ - LinuxUnLockMutex(&gPVRSRVLock); +extern struct ion_device *sunxi_ion_device; +struct ion_device *gpsIonDev; - return ret; +PVRSRV_ERROR IonInit(IMG_VOID) +{ + gpsIonDev = sunxi_ion_device; + return PVRSRV_OK; } -struct ion_handle * -PVRSRVExportFDToIONHandle(int fd, struct ion_client **client) +IMG_VOID IonDeinit(IMG_VOID) { - unsigned int num_handles = 1; - struct ion_handle *psHandle = IMG_NULL; - PVRSRVExportFDToIONHandles(fd, client, &psHandle, &num_handles); - return psHandle; + gpsIonDev = IMG_NULL; } -EXPORT_SYMBOL(PVRSRVExportFDToIONHandles); -EXPORT_SYMBOL(PVRSRVExportFDToIONHandle); -#endif +#else /* defined(CONFIG_ION_SUNXI) */ + +/* "Reference" ion implementation */ -#if defined (SUPPORT_ION) -#include "syscommon.h" -#include "env_data.h" #include "../drivers/gpu/ion/ion_priv.h" -#include "linux/kernel.h" -struct ion_heap **apsIonHeaps; -struct ion_device *psIonDev; +static struct ion_heap **gapsIonHeaps; +struct ion_device *gpsIonDev; -static struct ion_platform_data generic_config = { - .nr = 2, - .heaps = { - { - .type = ION_HEAP_TYPE_SYSTEM_CONTIG, - .name = "System contig", - .id = ION_HEAP_TYPE_SYSTEM_CONTIG, - }, - { - .type = ION_HEAP_TYPE_SYSTEM, - .name = "System", - .id = ION_HEAP_TYPE_SYSTEM, - } - } +#ifndef ION_CARVEOUT_MEM_BASE +#define ION_CARVEOUT_MEM_BASE 0 +#endif + +#ifndef ION_CARVEOUT_MEM_SIZE +#define ION_CARVEOUT_MEM_SIZE 0 +#endif + +static struct ion_platform_data gsGenericConfig = +{ + .nr = 3, + .heaps = + { + { + .type = ION_HEAP_TYPE_SYSTEM_CONTIG, + .name = "system_contig", + .id = ION_HEAP_TYPE_SYSTEM_CONTIG, + }, + { + .type = ION_HEAP_TYPE_SYSTEM, + .name = "system", + .id = ION_HEAP_TYPE_SYSTEM, + }, + { + .type = ION_HEAP_TYPE_CARVEOUT, + .name = "carveout", + .id = ION_HEAP_TYPE_CARVEOUT, + .base = ION_CARVEOUT_MEM_BASE, + .size = ION_CARVEOUT_MEM_SIZE, + }, + } }; PVRSRV_ERROR IonInit(IMG_VOID) { - int uiHeapCount = generic_config.nr; + int uiHeapCount = gsGenericConfig.nr; int uiError; int i; - apsIonHeaps = kzalloc(sizeof(struct ion_heap *) * uiHeapCount, GFP_KERNEL); + gapsIonHeaps = kzalloc(sizeof(struct ion_heap *) * uiHeapCount, GFP_KERNEL); /* Create the ion devicenode */ - psIonDev = ion_device_create(NULL); - if (IS_ERR_OR_NULL(psIonDev)) { - kfree(apsIonHeaps); + gpsIonDev = ion_device_create(NULL); + if (IS_ERR_OR_NULL(gpsIonDev)) { + kfree(gapsIonHeaps); return PVRSRV_ERROR_OUT_OF_MEMORY; } /* Register all the heaps */ - for (i = 0; i < generic_config.nr; i++) + for (i = 0; i < gsGenericConfig.nr; i++) { - struct ion_platform_heap *psPlatHeapData = &generic_config.heaps[i]; + struct ion_platform_heap *psPlatHeapData = &gsGenericConfig.heaps[i]; - apsIonHeaps[i] = ion_heap_create(psPlatHeapData); - if (IS_ERR_OR_NULL(apsIonHeaps[i])) + gapsIonHeaps[i] = ion_heap_create(psPlatHeapData); + if (IS_ERR_OR_NULL(gapsIonHeaps[i])) { - uiError = PTR_ERR(apsIonHeaps[i]); + uiError = PTR_ERR(gapsIonHeaps[i]); goto failHeapCreate; } - ion_device_add_heap(psIonDev, apsIonHeaps[i]); + ion_device_add_heap(gpsIonDev, gapsIonHeaps[i]); } return PVRSRV_OK; failHeapCreate: - for (i = 0; i < uiHeapCount; i++) { - if (apsIonHeaps[i]) + for (i = 0; i < uiHeapCount; i++) + { + if (gapsIonHeaps[i]) { - ion_heap_destroy(apsIonHeaps[i]); + ion_heap_destroy(gapsIonHeaps[i]); } } - kfree(apsIonHeaps); + kfree(gapsIonHeaps); return PVRSRV_ERROR_OUT_OF_MEMORY; } IMG_VOID IonDeinit(IMG_VOID) { - int uiHeapCount = generic_config.nr; + int uiHeapCount = gsGenericConfig.nr; int i; - for (i = 0; i < uiHeapCount; i++) { - if (apsIonHeaps[i]) + for (i = 0; i < uiHeapCount; i++) + { + if (gapsIonHeaps[i]) { - ion_heap_destroy(apsIonHeaps[i]); + ion_heap_destroy(gapsIonHeaps[i]); } } - kfree(apsIonHeaps); - ion_device_destroy(psIonDev); + kfree(gapsIonHeaps); + ion_device_destroy(gpsIonDev); } +#endif /* defined(CONFIG_ION_SUNXI) */ + +#endif /* defined(CONFIG_ION_S5P) */ + +#endif /* defined(CONFIG_ION_OMAP) */ + +#define MAX_IMPORT_ION_FDS 3 + typedef struct _ION_IMPORT_DATA_ { + /* ion client handles are imported into */ struct ion_client *psIonClient; - struct ion_handle *psIonHandle; - IMG_PVOID pvKernAddr; -} ION_IMPORT_DATA; - -PVRSRV_ERROR IonImportBufferAndAquirePhysAddr(IMG_HANDLE hIonDev, - IMG_HANDLE hIonFD, - IMG_UINT32 *pui32PageCount, - IMG_SYS_PHYADDR **ppasSysPhysAddr, - IMG_PVOID *ppvKernAddr, - IMG_HANDLE *phPriv) + + /* Number of ion handles represented by this import */ + IMG_UINT32 ui32NumIonHandles; + + /* Array of ion handles in use by services */ + struct ion_handle *apsIonHandle[MAX_IMPORT_ION_FDS]; + + /* Array of physical addresses represented by these buffers */ + IMG_SYS_PHYADDR *psSysPhysAddr; + +#if defined(PDUMP) + /* If ui32NumBuffers is 1 and ion_map_kernel() is implemented by the + * allocator, this may be non-NULL. Otherwise it will be NULL. + */ + IMG_PVOID pvKernAddr0; +#endif /* defined(PDUMP) */ +} +ION_IMPORT_DATA; + +PVRSRV_ERROR IonImportBufferAndAcquirePhysAddr(IMG_HANDLE hIonDev, + IMG_UINT32 ui32NumFDs, + IMG_INT32 *pai32BufferFDs, + IMG_UINT32 *pui32PageCount, + IMG_SYS_PHYADDR **ppsSysPhysAddr, + IMG_PVOID *ppvKernAddr0, + IMG_HANDLE *phPriv, + IMG_HANDLE *phUnique) { + struct scatterlist *psTemp, *psScatterList[MAX_IMPORT_ION_FDS] = {}; + PVRSRV_ERROR eError = PVRSRV_ERROR_OUT_OF_MEMORY; struct ion_client *psIonClient = hIonDev; - struct ion_handle *psIonHandle; - struct sg_table *psSgTable; - struct scatterlist *psTemp; - IMG_SYS_PHYADDR *pasSysPhysAddr = NULL; + IMG_UINT32 i, k, ui32PageCount = 0; ION_IMPORT_DATA *psImportData; - PVRSRV_ERROR eError; - IMG_UINT32 ui32PageCount = 0; - IMG_UINT32 i; - IMG_PVOID pvKernAddr; - int fd = (int) hIonFD; - psImportData = kmalloc(sizeof(ION_IMPORT_DATA), GFP_KERNEL); - if (psImportData == NULL) + if(ui32NumFDs > MAX_IMPORT_ION_FDS) { - return PVRSRV_ERROR_OUT_OF_MEMORY; + printk(KERN_ERR "%s: More ion export fds passed in than supported " + "(%d provided, %d max)", __func__, ui32NumFDs, + MAX_IMPORT_ION_FDS); + return PVRSRV_ERROR_INVALID_PARAMS; } - /* Get the buffer handle */ - psIonHandle = ion_import_fd(psIonClient, fd); - if (psIonHandle == IMG_NULL) + psImportData = kzalloc(sizeof(ION_IMPORT_DATA), GFP_KERNEL); + if (psImportData == NULL) { - eError = PVRSRV_ERROR_BAD_MAPPING; - goto exitFailImport; + goto exitFailKMallocImportData; } - /* Create data for free callback */ + /* Set up import data for free call */ psImportData->psIonClient = psIonClient; - psImportData->psIonHandle = psIonHandle; + psImportData->ui32NumIonHandles = ui32NumFDs; - psSgTable = ion_sg_table(psIonClient, psIonHandle); - if (psSgTable == NULL) + for(i = 0; i < ui32NumFDs; i++) { - eError = PVRSRV_ERROR_INVALID_PARAMS; - goto exitFailMap; - } + int fd = (int)pai32BufferFDs[i]; + struct sg_table *psSgTable; - /* - We do a two pass process, 1st workout how many pages there - are, 2nd fill in the data. - */ - for (i=0;i<2;i++) - { - psTemp = psSgTable->sgl; - if (i == 1) + psImportData->apsIonHandle[i] = ion_import_dma_buf(psIonClient, fd); + if (psImportData->apsIonHandle[i] == IMG_NULL) { - pasSysPhysAddr = kmalloc(sizeof(IMG_SYS_PHYADDR) * ui32PageCount, GFP_KERNEL); - if (pasSysPhysAddr == NULL) - { - eError = PVRSRV_ERROR_OUT_OF_MEMORY; - goto exitFailAlloc; - } - ui32PageCount = 0; /* Reset the page count a we use if for the index */ + eError = PVRSRV_ERROR_BAD_MAPPING; + goto exitFailImport; } - while(psTemp) + psSgTable = ion_sg_table(psIonClient, psImportData->apsIonHandle[i]); + psScatterList[i] = psSgTable->sgl; + if (psScatterList[i] == NULL) { - IMG_UINT32 j; + eError = PVRSRV_ERROR_INVALID_PARAMS; + goto exitFailImport; + } - for (j=0;j<psTemp->length;j+=PAGE_SIZE) + /* Although all heaps will provide an sg_table, the tables cannot + * always be trusted because sg_lists are just pointers to "struct + * page" values, and some memory e.g. carveout may not have valid + * "struct page" values. In particular, on ARM, carveout is + * generally reserved with memblock_remove(), which leaves the + * "struct page" entries uninitialized when SPARSEMEM is enabled. + * The effect of this is that page_to_pfn(pfn_to_page(pfn)) != pfn. + * + * There's more discussion on this mailing list thread: + * http://lists.linaro.org/pipermail/linaro-mm-sig/2012-August/002440.html + * + * If the heap this buffer comes from implements ->phys(), it's + * probably a contiguous allocator. If the phys() function is + * implemented, we'll use it to check sg_table->sgl[0]. If we find + * they don't agree, we'll assume phys() is more reliable and use + * that. + * + * Some heaps out there will implement phys() even though they are + * not for physically contiguous allocations (so the sg_table must + * be used). Therefore use the sg_table if the phys() and first + * sg_table entry match. This should be reliable because for most + * contiguous allocators, the sg_table should be a single span + * from 'start' to 'start+size'. + * + * Also, ion prints out an error message if the heap doesn't implement + * ->phys(), which we want to avoid, so only use ->phys() if the + * sg_table contains a single span and therefore could plausibly + * be a contiguous allocator. + */ + if(!sg_next(psScatterList[i])) + { + ion_phys_addr_t sPhyAddr; + size_t sLength; + + if(!ion_phys(psIonClient, psImportData->apsIonHandle[i], + &sPhyAddr, &sLength)) { - if (i == 1) + BUG_ON(sLength & ~PAGE_MASK); + + if(sg_phys(psScatterList[i]) != sPhyAddr) { - /* Pass 2: Get the page data */ - pasSysPhysAddr[ui32PageCount].uiAddr = sg_phys(psTemp); + psScatterList[i] = IMG_NULL; + ui32PageCount += sLength / PAGE_SIZE; } + } + } + + for(psTemp = psScatterList[i]; psTemp; psTemp = sg_next(psTemp)) + { + IMG_UINT32 j; + for (j = 0; j < psTemp->length; j += PAGE_SIZE) + { ui32PageCount++; } - psTemp = sg_next(psTemp); } } - pvKernAddr = ion_map_kernel(psIonClient, psIonHandle); - if (IS_ERR(pvKernAddr)) + BUG_ON(ui32PageCount == 0); + + psImportData->psSysPhysAddr = kmalloc(sizeof(IMG_SYS_PHYADDR) * ui32PageCount, GFP_KERNEL); + if (psImportData->psSysPhysAddr == NULL) { - pvKernAddr = IMG_NULL; + goto exitFailImport; } - psImportData->pvKernAddr = pvKernAddr; + for(i = 0, k = 0; i < ui32NumFDs; i++) + { + if(psScatterList[i]) + { + for(psTemp = psScatterList[i]; psTemp; psTemp = sg_next(psTemp)) + { + IMG_UINT32 j; + for (j = 0; j < psTemp->length; j += PAGE_SIZE) + { + psImportData->psSysPhysAddr[k].uiAddr = sg_phys(psTemp) + j; + k++; + } + } + } + else + { + ion_phys_addr_t sPhyAddr; + size_t sLength, j; + + ion_phys(psIonClient, psImportData->apsIonHandle[i], + &sPhyAddr, &sLength); + + for(j = 0; j < sLength; j += PAGE_SIZE) + { + psImportData->psSysPhysAddr[k].uiAddr = sPhyAddr + j; + k++; + } + } + } - *ppvKernAddr = pvKernAddr; *pui32PageCount = ui32PageCount; - *ppasSysPhysAddr = pasSysPhysAddr; + *ppsSysPhysAddr = psImportData->psSysPhysAddr; + +#if defined(PDUMP) + if(ui32NumFDs == 1) + { + IMG_PVOID pvKernAddr0; + + pvKernAddr0 = ion_map_kernel(psIonClient, psImportData->apsIonHandle[0]); + if (IS_ERR(pvKernAddr0)) + { + pvKernAddr0 = IMG_NULL; + } + + psImportData->pvKernAddr0 = pvKernAddr0; + *ppvKernAddr0 = pvKernAddr0; + } + else +#endif /* defined(PDUMP) */ + { + *ppvKernAddr0 = NULL; + } + *phPriv = psImportData; + *phUnique = (IMG_HANDLE)psImportData->psSysPhysAddr[0].uiAddr; + return PVRSRV_OK; -exitFailAlloc: -exitFailMap: - ion_free(psIonClient, psIonHandle); exitFailImport: + for(i = 0; psImportData->apsIonHandle[i] != NULL; i++) + { + ion_free(psIonClient, psImportData->apsIonHandle[i]); + } kfree(psImportData); +exitFailKMallocImportData: return eError; } - IMG_VOID IonUnimportBufferAndReleasePhysAddr(IMG_HANDLE hPriv) { ION_IMPORT_DATA *psImportData = hPriv; + IMG_UINT32 i; + +#if defined(PDUMP) + if (psImportData->pvKernAddr0) + { + ion_unmap_kernel(psImportData->psIonClient, psImportData->apsIonHandle[0]); + } +#endif /* defined(PDUMP) */ - if (psImportData->pvKernAddr) + for(i = 0; i < psImportData->ui32NumIonHandles; i++) { - ion_unmap_kernel(psImportData->psIonClient, psImportData->psIonHandle); + ion_free(psImportData->psIonClient, psImportData->apsIonHandle[i]); } - ion_free(psImportData->psIonClient, psImportData->psIonHandle); + + kfree(psImportData->psSysPhysAddr); kfree(psImportData); } -#endif + +#endif /* defined(SUPPORT_ION) */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/ion.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/ion.h index 1cf385d..042d3c4 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/ion.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/ion.h @@ -42,33 +42,28 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef __IMG_LINUX_ION_H__ #define __IMG_LINUX_ION_H__ +#if defined(SUPPORT_ION) + #include <linux/ion.h> -#if defined (CONFIG_ION_OMAP) -#include <linux/omap_ion.h> -#endif -#if defined (SUPPORT_ION) + #include "img_types.h" #include "servicesext.h" -#endif - -int PVRSRVExportFDToIONHandles(int fd, struct ion_client **client, - struct ion_handle **handles, - unsigned int *num_handles); - -struct ion_handle *PVRSRVExportFDToIONHandle(int fd, - struct ion_client **client); -#if defined (SUPPORT_ION) PVRSRV_ERROR IonInit(IMG_VOID); + IMG_VOID IonDeinit(IMG_VOID); -PVRSRV_ERROR IonImportBufferAndAquirePhysAddr(IMG_HANDLE hIonDev, - IMG_HANDLE hIonFD, - IMG_UINT32 *pui32PageCount, - IMG_SYS_PHYADDR **ppasSysPhysAddr, - IMG_PVOID *ppvKernAddr, - IMG_HANDLE *phPriv); +PVRSRV_ERROR IonImportBufferAndAcquirePhysAddr(IMG_HANDLE hIonDev, + IMG_UINT32 ui32NumFDs, + IMG_INT32 *pi32BufferFDs, + IMG_UINT32 *pui32PageCount, + IMG_SYS_PHYADDR **ppsSysPhysAddr, + IMG_PVOID *ppvKernAddr0, + IMG_HANDLE *phPriv, + IMG_HANDLE *phUnique); IMG_VOID IonUnimportBufferAndReleasePhysAddr(IMG_HANDLE hPriv); -#endif + +#endif /* defined(SUPPORT_ION) */ + #endif /* __IMG_LINUX_ION_H__ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mm.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mm.c index 56cf52c..c5a9b9b 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mm.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mm.c @@ -89,12 +89,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "lists.h" #endif -/* If there is no explicit definition - * for the minimum DMM alignment size, - * then set it to "0" and let ION/DMM - * set the minimum value. */ -#ifndef CONFIG_TILER_GRANULARITY -#define CONFIG_TILER_GRANULARITY 0 +/* Decide whether or not DevMem allocs need __GFP_DMA32 */ +#ifndef SGX_FEATURE_36BIT_MMU +# ifdef CONFIG_ZONE_DMA32 +# if defined CONFIG_X86_PAE || defined CONFIG_ARM_LPAE || defined CONFIG_64BIT +# define PVR_USE_DMA32_FOR_DEVMEM_ALLOCS +# endif +# endif #endif /* @@ -106,7 +107,7 @@ static atomic_t g_sPagePoolEntryCount = ATOMIC_INIT(0); #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) typedef enum { - DEBUG_MEM_ALLOC_TYPE_KMALLOC, + DEBUG_MEM_ALLOC_TYPE_KMALLOC = 0, DEBUG_MEM_ALLOC_TYPE_VMALLOC, DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES, DEBUG_MEM_ALLOC_TYPE_IOREMAP, @@ -122,11 +123,11 @@ typedef enum { typedef struct _DEBUG_MEM_ALLOC_REC { DEBUG_MEM_ALLOC_TYPE eAllocType; - IMG_VOID *pvKey; /* Some unique value (private to the eAllocType) */ + IMG_UINTPTR_T uiKey; /* Some unique value (private to the eAllocType) */ IMG_VOID *pvCpuVAddr; - IMG_UINT32 ulCpuPAddr; + IMG_CPU_PHYADDR sCpuPAddr; IMG_VOID *pvPrivateData; - IMG_UINT32 ui32Bytes; + IMG_SIZE_T uiBytes; pid_t pid; IMG_CHAR *pszFileName; IMG_UINT32 ui32Line; @@ -162,20 +163,20 @@ static IMG_UINT32 g_IOMemWaterMark; static IMG_UINT32 g_IOMemHighWaterMark; static IMG_VOID DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE eAllocType, - IMG_VOID *pvKey, + IMG_UINTPTR_T uiKey, IMG_VOID *pvCpuVAddr, - IMG_UINT32 ulCpuPAddr, + IMG_CPU_PHYADDR sCpuPAddr, IMG_VOID *pvPrivateData, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uiBytes, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line); -static IMG_VOID DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE eAllocType, IMG_VOID *pvKey, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line); +static IMG_VOID DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE eAllocType, IMG_UINTPTR_T uiKey, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line); static IMG_CHAR *DebugMemAllocRecordTypeToString(DEBUG_MEM_ALLOC_TYPE eAllocType); -static struct proc_dir_entry *g_SeqFileMemoryRecords; +static struct pvr_proc_dir_entry *g_SeqFileMemoryRecords; static void* ProcSeqNextMemoryRecords(struct seq_file *sfile,void* el,loff_t off); static void ProcSeqShowMemoryRecords(struct seq_file *sfile,void* el); static void* ProcSeqOff2ElementMemoryRecords(struct seq_file * sfile, loff_t off); @@ -209,12 +210,11 @@ static IMG_UINT32 g_LinuxMemAreaWaterMark; static IMG_UINT32 g_LinuxMemAreaHighWaterMark; -static struct proc_dir_entry *g_SeqFileMemArea; +static struct pvr_proc_dir_entry *g_SeqFileMemArea; static void* ProcSeqNextMemArea(struct seq_file *sfile,void* el,loff_t off); static void ProcSeqShowMemArea(struct seq_file *sfile,void* el); static void* ProcSeqOff2ElementMemArea(struct seq_file *sfile, loff_t off); - #endif #if defined(DEBUG_LINUX_MEM_AREAS) || defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) @@ -240,8 +240,8 @@ static LIST_HEAD(g_sPagePoolList); static int g_iPagePoolMaxEntries; #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)) -static IMG_VOID ReservePages(IMG_VOID *pvAddress, IMG_UINT32 ui32Length); -static IMG_VOID UnreservePages(IMG_VOID *pvAddress, IMG_UINT32 ui32Length); +static IMG_VOID ReservePages(IMG_VOID *pvAddress, IMG_SIZE_T uiLength); +static IMG_VOID UnreservePages(IMG_VOID *pvAddress, IMG_SIZE_T uiLength); #endif static LinuxMemArea *LinuxMemAreaStructAlloc(IMG_VOID); @@ -266,19 +266,22 @@ CanFreeToPool(LinuxMemArea *psLinuxMemArea) } IMG_VOID * -_KMallocWrapper(IMG_UINT32 ui32ByteSize, gfp_t uFlags, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) +_KMallocWrapper(IMG_SIZE_T uiByteSize, gfp_t uFlags, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) { IMG_VOID *pvRet; - pvRet = kmalloc(ui32ByteSize, uFlags); + pvRet = kmalloc(uiByteSize, uFlags); #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) if (pvRet) { + IMG_CPU_PHYADDR sCpuPAddr; + sCpuPAddr.uiAddr = 0; + DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_KMALLOC, + (IMG_UINTPTR_T)pvRet, pvRet, - pvRet, - 0, + sCpuPAddr, NULL, - ui32ByteSize, + uiByteSize, pszFileName, ui32Line ); @@ -295,7 +298,11 @@ IMG_VOID _KFreeWrapper(IMG_VOID *pvCpuVAddr, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) { #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_KMALLOC, pvCpuVAddr, pszFileName, ui32Line); + DebugMemAllocRecordRemove( + DEBUG_MEM_ALLOC_TYPE_KMALLOC, + (IMG_UINTPTR_T)pvCpuVAddr, + pszFileName, + ui32Line); #else PVR_UNREFERENCED_PARAMETER(pszFileName); PVR_UNREFERENCED_PARAMETER(ui32Line); @@ -307,11 +314,11 @@ _KFreeWrapper(IMG_VOID *pvCpuVAddr, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) static IMG_VOID DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE eAllocType, - IMG_VOID *pvKey, + IMG_UINTPTR_T uiKey, IMG_VOID *pvCpuVAddr, - IMG_UINT32 ulCpuPAddr, + IMG_CPU_PHYADDR sCpuPAddr, IMG_VOID *pvPrivateData, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uiBytes, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) { @@ -322,18 +329,18 @@ DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE eAllocType, psRecord = kmalloc(sizeof(DEBUG_MEM_ALLOC_REC), GFP_KERNEL); psRecord->eAllocType = eAllocType; - psRecord->pvKey = pvKey; + psRecord->uiKey = uiKey; psRecord->pvCpuVAddr = pvCpuVAddr; - psRecord->ulCpuPAddr = ulCpuPAddr; + psRecord->sCpuPAddr.uiAddr = sCpuPAddr.uiAddr; psRecord->pvPrivateData = pvPrivateData; psRecord->pid = OSGetCurrentProcessIDKM(); - psRecord->ui32Bytes = ui32Bytes; + psRecord->uiBytes = uiBytes; psRecord->pszFileName = pszFileName; psRecord->ui32Line = ui32Line; List_DEBUG_MEM_ALLOC_REC_Insert(&g_MemoryRecords, psRecord); - g_WaterMarkData[eAllocType] += ui32Bytes; + g_WaterMarkData[eAllocType] += uiBytes; if (g_WaterMarkData[eAllocType] > g_HighWaterMarkData[eAllocType]) { g_HighWaterMarkData[eAllocType] = g_WaterMarkData[eAllocType]; @@ -344,20 +351,20 @@ DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE eAllocType, || eAllocType == DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES || eAllocType == DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE) { - IMG_UINT32 ui32SysRAMTrueWaterMark; + IMG_SIZE_T uSysRAMTrueWaterMark; - g_SysRAMWaterMark += ui32Bytes; - ui32SysRAMTrueWaterMark = SysRAMTrueWaterMark(); + g_SysRAMWaterMark += uiBytes; + uSysRAMTrueWaterMark = SysRAMTrueWaterMark(); - if (ui32SysRAMTrueWaterMark > g_SysRAMHighWaterMark) + if (uSysRAMTrueWaterMark > g_SysRAMHighWaterMark) { - g_SysRAMHighWaterMark = ui32SysRAMTrueWaterMark; + g_SysRAMHighWaterMark = uSysRAMTrueWaterMark; } } else if (eAllocType == DEBUG_MEM_ALLOC_TYPE_IOREMAP || eAllocType == DEBUG_MEM_ALLOC_TYPE_IO) { - g_IOMemWaterMark += ui32Bytes; + g_IOMemWaterMark += uiBytes; if (g_IOMemWaterMark > g_IOMemHighWaterMark) { g_IOMemHighWaterMark = g_IOMemWaterMark; @@ -371,28 +378,28 @@ DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE eAllocType, static IMG_BOOL DebugMemAllocRecordRemove_AnyVaCb(DEBUG_MEM_ALLOC_REC *psCurrentRecord, va_list va) { DEBUG_MEM_ALLOC_TYPE eAllocType; - IMG_VOID *pvKey; + IMG_UINTPTR_T uiKey; eAllocType = va_arg(va, DEBUG_MEM_ALLOC_TYPE); - pvKey = va_arg(va, IMG_VOID*); + uiKey = va_arg(va, IMG_UINTPTR_T); if (psCurrentRecord->eAllocType == eAllocType - && psCurrentRecord->pvKey == pvKey) + && psCurrentRecord->uiKey == uiKey) { eAllocType = psCurrentRecord->eAllocType; - g_WaterMarkData[eAllocType] -= psCurrentRecord->ui32Bytes; + g_WaterMarkData[eAllocType] -= psCurrentRecord->uiBytes; if (eAllocType == DEBUG_MEM_ALLOC_TYPE_KMALLOC || eAllocType == DEBUG_MEM_ALLOC_TYPE_VMALLOC || eAllocType == DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES || eAllocType == DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE) { - g_SysRAMWaterMark -= psCurrentRecord->ui32Bytes; + g_SysRAMWaterMark -= psCurrentRecord->uiBytes; } else if (eAllocType == DEBUG_MEM_ALLOC_TYPE_IOREMAP || eAllocType == DEBUG_MEM_ALLOC_TYPE_IO) { - g_IOMemWaterMark -= psCurrentRecord->ui32Bytes; + g_IOMemWaterMark -= psCurrentRecord->uiBytes; } List_DEBUG_MEM_ALLOC_REC_Remove(psCurrentRecord); @@ -408,7 +415,7 @@ static IMG_BOOL DebugMemAllocRecordRemove_AnyVaCb(DEBUG_MEM_ALLOC_REC *psCurrent static IMG_VOID -DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE eAllocType, IMG_VOID *pvKey, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) +DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE eAllocType, IMG_UINTPTR_T uiKey, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) { /* DEBUG_MEM_ALLOC_REC **ppsCurrentRecord;*/ @@ -418,10 +425,10 @@ DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE eAllocType, IMG_VOID *pvKey, IMG_ if (!List_DEBUG_MEM_ALLOC_REC_IMG_BOOL_Any_va(g_MemoryRecords, DebugMemAllocRecordRemove_AnyVaCb, eAllocType, - pvKey)) + uiKey)) { - PVR_DPF((PVR_DBG_ERROR, "%s: couldn't find an entry for type=%s with pvKey=%p (called from %s, line %d\n", - __FUNCTION__, DebugMemAllocRecordTypeToString(eAllocType), pvKey, + PVR_DPF((PVR_DBG_ERROR, "%s: couldn't find an entry for type=%s with uiKey=" UINTPTR_FMT " (called from %s, line %d\n", + __FUNCTION__, DebugMemAllocRecordTypeToString(eAllocType), uiKey, pszFileName, ui32Line)); } @@ -439,8 +446,9 @@ DebugMemAllocRecordTypeToString(DEBUG_MEM_ALLOC_TYPE eAllocType) "IOREMAP", "IO", "KMEM_CACHE_ALLOC", + "ION", #if defined(PVR_LINUX_MEM_AREA_USE_VMAP) - "VMAP" + "VMAP", #endif }; return apszDebugMemoryRecordTypes[eAllocType]; @@ -478,31 +486,43 @@ AllocFlagsToPGProt(pgprot_t *pPGProtFlags, IMG_UINT32 ui32AllocFlags) } IMG_VOID * -_VMallocWrapper(IMG_UINT32 ui32Bytes, +_VMallocWrapper(IMG_SIZE_T uiBytes, IMG_UINT32 ui32AllocFlags, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) { pgprot_t PGProtFlags; IMG_VOID *pvRet; + gfp_t gfp_mask; if (!AllocFlagsToPGProt(&PGProtFlags, ui32AllocFlags)) { return NULL; } + gfp_mask = GFP_KERNEL; + +#if defined(PVR_USE_DMA32_FOR_DEVMEM_ALLOCS) + gfp_mask |= __GFP_DMA32; +#else + gfp_mask |= __GFP_HIGHMEM; +#endif + /* Allocate virtually contiguous pages */ - pvRet = __vmalloc(ui32Bytes, GFP_KERNEL | __GFP_HIGHMEM, PGProtFlags); + pvRet = __vmalloc(uiBytes, gfp_mask, PGProtFlags); #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) if (pvRet) { + IMG_CPU_PHYADDR sCpuPAddr; + sCpuPAddr.uiAddr = 0; + DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_VMALLOC, + (IMG_UINTPTR_T)pvRet, pvRet, - pvRet, - 0, + sCpuPAddr, NULL, - PAGE_ALIGN(ui32Bytes), + PAGE_ALIGN(uiBytes), pszFileName, ui32Line ); @@ -520,7 +540,11 @@ IMG_VOID _VFreeWrapper(IMG_VOID *pvCpuVAddr, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) { #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_VMALLOC, pvCpuVAddr, pszFileName, ui32Line); + DebugMemAllocRecordRemove( + DEBUG_MEM_ALLOC_TYPE_VMALLOC, + (IMG_UINTPTR_T)pvCpuVAddr, + pszFileName, + ui32Line); #else PVR_UNREFERENCED_PARAMETER(pszFileName); PVR_UNREFERENCED_PARAMETER(ui32Line); @@ -546,10 +570,13 @@ _VMapWrapper(struct page **ppsPageList, IMG_UINT32 ui32NumPages, IMG_UINT32 ui32 #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) if (pvRet) { + IMG_CPU_PHYADDR sCpuPAddr; + sCpuPAddr.uiAddr = 0; + DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_VMAP, + (IMG_UINTPTR_T)pvRet, pvRet, - pvRet, - 0, + sCpuPAddr, NULL, PAGES_TO_BYTES(ui32NumPages), pszFileName, @@ -565,9 +592,9 @@ _VMapWrapper(struct page **ppsPageList, IMG_UINT32 ui32NumPages, IMG_UINT32 ui32 } #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) -#define VMapWrapper(ppsPageList, ui32Bytes, ui32AllocFlags) _VMapWrapper(ppsPageList, ui32Bytes, ui32AllocFlags, __FILE__, __LINE__) +#define VMapWrapper(ppsPageList, uBytes, ui32AllocFlags) _VMapWrapper(ppsPageList, uBytes, ui32AllocFlags, __FILE__, __LINE__) #else -#define VMapWrapper(ppsPageList, ui32Bytes, ui32AllocFlags) _VMapWrapper(ppsPageList, ui32Bytes, ui32AllocFlags, NULL, 0) +#define VMapWrapper(ppsPageList, uBytes, ui32AllocFlags) _VMapWrapper(ppsPageList, uBytes, ui32AllocFlags, NULL, 0) #endif @@ -575,7 +602,8 @@ static IMG_VOID _VUnmapWrapper(IMG_VOID *pvCpuVAddr, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) { #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_VMAP, pvCpuVAddr, pszFileName, ui32Line); + DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_VMAP, + (IMG_UINTPTR_T)pvCpuVAddr, pszFileName, ui32Line); #else PVR_UNREFERENCED_PARAMETER(pszFileName); PVR_UNREFERENCED_PARAMETER(ui32Line); @@ -596,7 +624,11 @@ IMG_VOID _KMemCacheFreeWrapper(LinuxKMemCache *psCache, IMG_VOID *pvObject, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) { #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE, pvObject, pszFileName, ui32Line); + DebugMemAllocRecordRemove( + DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE, + (IMG_UINTPTR_T)pvObject, + pszFileName, + ui32Line); #else PVR_UNREFERENCED_PARAMETER(pszFileName); PVR_UNREFERENCED_PARAMETER(ui32Line); @@ -634,13 +666,22 @@ static struct page * AllocPageFromLinux(void) { struct page *psPage; + gfp_t gfp_mask; - psPage = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, 0); - if (!psPage) - { - return NULL; + gfp_mask = GFP_KERNEL; - } +#if defined(PVR_USE_DMA32_FOR_DEVMEM_ALLOCS) + gfp_mask |= __GFP_DMA32; +#else + gfp_mask |= __GFP_HIGHMEM; +#endif + + psPage = alloc_pages(gfp_mask, 0); + if (!psPage) + { + return NULL; + + } #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)) /* Reserve those pages to allow them to be re-mapped to user space */ #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)) @@ -812,7 +853,7 @@ FreePagePool(IMG_VOID) PagePoolLock(); #if (PVR_LINUX_MEM_AREA_POOL_MAX_PAGES != 0) - PVR_DPF((PVR_DBG_MESSAGE,"%s: Freeing %d pages from pool", __FUNCTION__, atomic_read(&g_sPagePoolEntryCount))); + PVR_TRACE(("%s: Freeing %d pages from pool", __FUNCTION__, atomic_read(&g_sPagePoolEntryCount))); #else PVR_ASSERT(atomic_read(&g_sPagePoolEntryCount) == 0); PVR_ASSERT(list_empty(&g_sPagePoolList)); @@ -848,8 +889,8 @@ ShrinkPagePool(struct shrinker *psShrinker, struct shrink_control *psShrinkContr { LinuxPagePoolEntry *psPagePoolEntry, *psTempPoolEntry; - PVR_DPF((PVR_DBG_MESSAGE,"%s: Number to scan: %ld", __FUNCTION__, uNumToScan)); - PVR_DPF((PVR_DBG_MESSAGE,"%s: Pages in pool before scan: %d", __FUNCTION__, atomic_read(&g_sPagePoolEntryCount))); + PVR_TRACE(("%s: Number to scan: %ld", __FUNCTION__, uNumToScan)); + PVR_TRACE(("%s: Pages in pool before scan: %d", __FUNCTION__, atomic_read(&g_sPagePoolEntryCount))); if (!PagePoolTrylock()) { @@ -877,7 +918,7 @@ ShrinkPagePool(struct shrinker *psShrinker, struct shrink_control *psShrinkContr PagePoolUnlock(); - PVR_DPF((PVR_DBG_MESSAGE,"%s: Pages in pool after scan: %d", __FUNCTION__, atomic_read(&g_sPagePoolEntryCount))); + PVR_TRACE(("%s: Pages in pool after scan: %d", __FUNCTION__, atomic_read(&g_sPagePoolEntryCount))); } return atomic_read(&g_sPagePoolEntryCount); @@ -893,6 +934,10 @@ AllocPages(IMG_UINT32 ui32AreaFlags, struct page ***pppsPageList, IMG_HANDLE *ph PVRSRV_ERROR eError; IMG_BOOL bFromPagePool = IMG_FALSE; +#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) + IMG_CPU_PHYADDR sCpuPAddr; +#endif + eError = OSAllocMem(0, sizeof(*ppsPageList) * ui32NumPages, (IMG_VOID **)&ppsPageList, &hBlockPageList, "Array of pages"); if (eError != PVRSRV_OK) @@ -915,10 +960,12 @@ AllocPages(IMG_UINT32 ui32AreaFlags, struct page ***pppsPageList, IMG_HANDLE *ph *phBlockPageList = hBlockPageList; #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) + sCpuPAddr.uiAddr = 0; + DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES, - ppsPageList, - 0, + (IMG_UINTPTR_T)ppsPageList, 0, + sCpuPAddr, NULL, PAGES_TO_BYTES(ui32NumPages), "unknown", @@ -951,7 +998,11 @@ FreePages(IMG_BOOL bToPagePool, struct page **ppsPageList, IMG_HANDLE hBlockPage } #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES, ppsPageList, __FILE__, __LINE__); + DebugMemAllocRecordRemove( + DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES, + (IMG_UINTPTR_T)ppsPageList, + __FILE__, + __LINE__); #endif (IMG_VOID) OSFreeMem(0, sizeof(*ppsPageList) * ui32NumPages, ppsPageList, hBlockPageList); @@ -959,7 +1010,7 @@ FreePages(IMG_BOOL bToPagePool, struct page **ppsPageList, IMG_HANDLE hBlockPage LinuxMemArea * -NewVMallocLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags) +NewVMallocLinuxMemArea(IMG_SIZE_T uBytes, IMG_UINT32 ui32AreaFlags) { LinuxMemArea *psLinuxMemArea = NULL; IMG_VOID *pvCpuVAddr; @@ -977,7 +1028,7 @@ NewVMallocLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags) } #if defined(PVR_LINUX_MEM_AREA_USE_VMAP) - ui32NumPages = RANGE_TO_PAGES(ui32Bytes); + ui32NumPages = RANGE_TO_PAGES(uBytes); if (!AllocPages(ui32AreaFlags, &ppsPageList, &hBlockPageList, ui32NumPages, &bFromPagePool)) { @@ -986,7 +1037,7 @@ NewVMallocLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags) pvCpuVAddr = VMapWrapper(ppsPageList, ui32NumPages, ui32AreaFlags); #else /* defined(PVR_LINUX_MEM_AREA_USE_VMAP) */ - pvCpuVAddr = VMallocWrapper(ui32Bytes, ui32AreaFlags); + pvCpuVAddr = VMallocWrapper(uBytes, ui32AreaFlags); if (!pvCpuVAddr) { goto failed; @@ -994,7 +1045,7 @@ NewVMallocLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags) /* PG_reserved was deprecated in linux-2.6.15 */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)) /* Reserve those pages to allow them to be re-mapped to user space */ - ReservePages(pvCpuVAddr, ui32Bytes); + ReservePages(pvCpuVAddr, uBytes); #endif #endif /* defined(PVR_LINUX_MEM_AREA_USE_VMAP) */ @@ -1004,7 +1055,7 @@ NewVMallocLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags) psLinuxMemArea->uData.sVmalloc.ppsPageList = ppsPageList; psLinuxMemArea->uData.sVmalloc.hBlockPageList = hBlockPageList; #endif - psLinuxMemArea->ui32ByteSize = ui32Bytes; + psLinuxMemArea->uiByteSize = uBytes; psLinuxMemArea->ui32AreaFlags = ui32AreaFlags; INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList); @@ -1029,7 +1080,7 @@ NewVMallocLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags) */ if (AreaIsUncached(ui32AreaFlags) && !bFromPagePool) { - OSInvalidateCPUCacheRangeKM(psLinuxMemArea, 0, pvCpuVAddr, ui32Bytes); + OSInvalidateCPUCacheRangeKM(psLinuxMemArea, 0, pvCpuVAddr, uBytes); } return psLinuxMemArea; @@ -1074,7 +1125,7 @@ FreeVMallocLinuxMemArea(LinuxMemArea *psLinuxMemArea) #if defined(PVR_LINUX_MEM_AREA_USE_VMAP) VUnmapWrapper(psLinuxMemArea->uData.sVmalloc.pvVmallocAddress); - ui32NumPages = RANGE_TO_PAGES(psLinuxMemArea->ui32ByteSize); + ui32NumPages = RANGE_TO_PAGES(psLinuxMemArea->uiByteSize); ppsPageList = psLinuxMemArea->uData.sVmalloc.ppsPageList; hBlockPageList = psLinuxMemArea->uData.sVmalloc.hBlockPageList; @@ -1083,7 +1134,7 @@ FreeVMallocLinuxMemArea(LinuxMemArea *psLinuxMemArea) /* PG_reserved was deprecated in linux-2.6.15 */ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)) UnreservePages(psLinuxMemArea->uData.sVmalloc.pvVmallocAddress, - psLinuxMemArea->ui32ByteSize); + psLinuxMemArea->uiByteSize); #endif VFreeWrapper(psLinuxMemArea->uData.sVmalloc.pvVmallocAddress); @@ -1097,10 +1148,10 @@ FreeVMallocLinuxMemArea(LinuxMemArea *psLinuxMemArea) /* Reserve pages of memory in order that they're not automatically deallocated after the last user reference dies. */ static IMG_VOID -ReservePages(IMG_VOID *pvAddress, IMG_UINT32 ui32Length) +ReservePages(IMG_VOID *pvAddress, IMG_SIZE_T uLength) { IMG_VOID *pvPage; - IMG_VOID *pvEnd = pvAddress + ui32Length; + IMG_VOID *pvEnd = pvAddress + uLength; for(pvPage = pvAddress; pvPage < pvEnd; pvPage += PAGE_SIZE) { @@ -1115,10 +1166,10 @@ ReservePages(IMG_VOID *pvAddress, IMG_UINT32 ui32Length) /* Un-reserve pages of memory in order that they can be freed. */ static IMG_VOID -UnreservePages(IMG_VOID *pvAddress, IMG_UINT32 ui32Length) +UnreservePages(IMG_VOID *pvAddress, IMG_SIZE_T uLength) { IMG_VOID *pvPage; - IMG_VOID *pvEnd = pvAddress + ui32Length; + IMG_VOID *pvEnd = pvAddress + uLength; for(pvPage = pvAddress; pvPage < pvEnd; pvPage += PAGE_SIZE) { @@ -1134,7 +1185,7 @@ UnreservePages(IMG_VOID *pvAddress, IMG_UINT32 ui32Length) IMG_VOID * _IORemapWrapper(IMG_CPU_PHYADDR BasePAddr, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uBytes, IMG_UINT32 ui32MappingFlags, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) @@ -1144,13 +1195,13 @@ _IORemapWrapper(IMG_CPU_PHYADDR BasePAddr, switch (ui32MappingFlags & PVRSRV_HAP_CACHETYPE_MASK) { case PVRSRV_HAP_CACHED: - pvIORemapCookie = (IMG_VOID *)IOREMAP(BasePAddr.uiAddr, ui32Bytes); + pvIORemapCookie = (IMG_VOID *)IOREMAP(BasePAddr.uiAddr, uBytes); break; case PVRSRV_HAP_WRITECOMBINE: - pvIORemapCookie = (IMG_VOID *)IOREMAP_WC(BasePAddr.uiAddr, ui32Bytes); + pvIORemapCookie = (IMG_VOID *)IOREMAP_WC(BasePAddr.uiAddr, uBytes); break; case PVRSRV_HAP_UNCACHED: - pvIORemapCookie = (IMG_VOID *)IOREMAP_UC(BasePAddr.uiAddr, ui32Bytes); + pvIORemapCookie = (IMG_VOID *)IOREMAP_UC(BasePAddr.uiAddr, uBytes); break; default: PVR_DPF((PVR_DBG_ERROR, "IORemapWrapper: unknown mapping flags")); @@ -1161,11 +1212,11 @@ _IORemapWrapper(IMG_CPU_PHYADDR BasePAddr, if (pvIORemapCookie) { DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_IOREMAP, + (IMG_UINTPTR_T)pvIORemapCookie, pvIORemapCookie, - pvIORemapCookie, - BasePAddr.uiAddr, + BasePAddr, NULL, - ui32Bytes, + uBytes, pszFileName, ui32Line ); @@ -1183,7 +1234,11 @@ IMG_VOID _IOUnmapWrapper(IMG_VOID *pvIORemapCookie, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line) { #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_IOREMAP, pvIORemapCookie, pszFileName, ui32Line); + DebugMemAllocRecordRemove( + DEBUG_MEM_ALLOC_TYPE_IOREMAP, + (IMG_UINTPTR_T)pvIORemapCookie, + pszFileName, + ui32Line); #else PVR_UNREFERENCED_PARAMETER(pszFileName); PVR_UNREFERENCED_PARAMETER(ui32Line); @@ -1194,7 +1249,7 @@ _IOUnmapWrapper(IMG_VOID *pvIORemapCookie, IMG_CHAR *pszFileName, IMG_UINT32 ui3 LinuxMemArea * NewIORemapLinuxMemArea(IMG_CPU_PHYADDR BasePAddr, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uBytes, IMG_UINT32 ui32AreaFlags) { LinuxMemArea *psLinuxMemArea; @@ -1206,7 +1261,7 @@ NewIORemapLinuxMemArea(IMG_CPU_PHYADDR BasePAddr, return NULL; } - pvIORemapCookie = IORemapWrapper(BasePAddr, ui32Bytes, ui32AreaFlags); + pvIORemapCookie = IORemapWrapper(BasePAddr, uBytes, ui32AreaFlags); if (!pvIORemapCookie) { LinuxMemAreaStructFree(psLinuxMemArea); @@ -1216,7 +1271,7 @@ NewIORemapLinuxMemArea(IMG_CPU_PHYADDR BasePAddr, psLinuxMemArea->eAreaType = LINUX_MEM_AREA_IOREMAP; psLinuxMemArea->uData.sIORemap.pvIORemapCookie = pvIORemapCookie; psLinuxMemArea->uData.sIORemap.CPUPhysAddr = BasePAddr; - psLinuxMemArea->ui32ByteSize = ui32Bytes; + psLinuxMemArea->uiByteSize = uBytes; psLinuxMemArea->ui32AreaFlags = ui32AreaFlags; INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList); @@ -1255,11 +1310,11 @@ FreeIORemapLinuxMemArea(LinuxMemArea *psLinuxMemArea) * using memory wrapping, which ends up creating an external KV memory area. */ static IMG_BOOL -TreatExternalPagesAsContiguous(IMG_SYS_PHYADDR *psSysPhysAddr, IMG_UINT32 ui32Bytes, IMG_BOOL bPhysContig) +TreatExternalPagesAsContiguous(IMG_SYS_PHYADDR *psSysPhysAddr, IMG_SIZE_T uBytes, IMG_BOOL bPhysContig) { IMG_UINT32 ui32; IMG_UINT32 ui32AddrChk; - IMG_UINT32 ui32NumPages = RANGE_TO_PAGES(ui32Bytes); + IMG_UINT32 ui32NumPages = RANGE_TO_PAGES(uBytes); /* * If bPhysContig is IMG_TRUE, we must assume psSysPhysAddr points @@ -1296,7 +1351,7 @@ TreatExternalPagesAsContiguous(IMG_SYS_PHYADDR *psSysPhysAddr, IMG_UINT32 ui32By } #endif -LinuxMemArea *NewExternalKVLinuxMemArea(IMG_SYS_PHYADDR *pBasePAddr, IMG_VOID *pvCPUVAddr, IMG_UINT32 ui32Bytes, IMG_BOOL bPhysContig, IMG_UINT32 ui32AreaFlags) +LinuxMemArea *NewExternalKVLinuxMemArea(IMG_SYS_PHYADDR *pBasePAddr, IMG_VOID *pvCPUVAddr, IMG_SIZE_T uBytes, IMG_BOOL bPhysContig, IMG_UINT32 ui32AreaFlags) { LinuxMemArea *psLinuxMemArea; @@ -1310,7 +1365,7 @@ LinuxMemArea *NewExternalKVLinuxMemArea(IMG_SYS_PHYADDR *pBasePAddr, IMG_VOID *p psLinuxMemArea->uData.sExternalKV.pvExternalKV = pvCPUVAddr; psLinuxMemArea->uData.sExternalKV.bPhysContig = #if !defined(PVR_MAKE_ALL_PFNS_SPECIAL) - (bPhysContig || TreatExternalPagesAsContiguous(pBasePAddr, ui32Bytes, bPhysContig)) + (bPhysContig || TreatExternalPagesAsContiguous(pBasePAddr, uBytes, bPhysContig)) ? IMG_TRUE : IMG_FALSE; #else bPhysContig; @@ -1323,7 +1378,7 @@ LinuxMemArea *NewExternalKVLinuxMemArea(IMG_SYS_PHYADDR *pBasePAddr, IMG_VOID *p { psLinuxMemArea->uData.sExternalKV.uPhysAddr.pSysPhysAddr = pBasePAddr; } - psLinuxMemArea->ui32ByteSize = ui32Bytes; + psLinuxMemArea->uiByteSize = uBytes; psLinuxMemArea->ui32AreaFlags = ui32AreaFlags; INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList); @@ -1350,7 +1405,7 @@ FreeExternalKVLinuxMemArea(LinuxMemArea *psLinuxMemArea) LinuxMemArea * NewIOLinuxMemArea(IMG_CPU_PHYADDR BasePAddr, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uBytes, IMG_UINT32 ui32AreaFlags) { LinuxMemArea *psLinuxMemArea = LinuxMemAreaStructAlloc(); @@ -1362,17 +1417,17 @@ NewIOLinuxMemArea(IMG_CPU_PHYADDR BasePAddr, /* Nothing to activly do. We just keep a record of the physical range. */ psLinuxMemArea->eAreaType = LINUX_MEM_AREA_IO; psLinuxMemArea->uData.sIO.CPUPhysAddr.uiAddr = BasePAddr.uiAddr; - psLinuxMemArea->ui32ByteSize = ui32Bytes; + psLinuxMemArea->uiByteSize = uBytes; psLinuxMemArea->ui32AreaFlags = ui32AreaFlags; INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList); #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_IO, - (IMG_VOID *)BasePAddr.uiAddr, - 0, BasePAddr.uiAddr, + 0, + BasePAddr, NULL, - ui32Bytes, + uBytes, "unknown", 0 ); @@ -1397,7 +1452,9 @@ FreeIOLinuxMemArea(LinuxMemArea *psLinuxMemArea) #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_IO, - (IMG_VOID *)psLinuxMemArea->uData.sIO.CPUPhysAddr.uiAddr, __FILE__, __LINE__); + psLinuxMemArea->uData.sIO.CPUPhysAddr.uiAddr, + __FILE__, + __LINE__); #endif /* Nothing more to do than free the LinuxMemArea struct */ @@ -1407,7 +1464,7 @@ FreeIOLinuxMemArea(LinuxMemArea *psLinuxMemArea) LinuxMemArea * -NewAllocPagesLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags) +NewAllocPagesLinuxMemArea(IMG_SIZE_T uBytes, IMG_UINT32 ui32AreaFlags) { LinuxMemArea *psLinuxMemArea; IMG_UINT32 ui32NumPages; @@ -1421,7 +1478,7 @@ NewAllocPagesLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags) goto failed_area_alloc; } - ui32NumPages = RANGE_TO_PAGES(ui32Bytes); + ui32NumPages = RANGE_TO_PAGES(uBytes); if (!AllocPages(ui32AreaFlags, &ppsPageList, &hBlockPageList, ui32NumPages, &bFromPagePool)) { @@ -1431,7 +1488,7 @@ NewAllocPagesLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags) psLinuxMemArea->eAreaType = LINUX_MEM_AREA_ALLOC_PAGES; psLinuxMemArea->uData.sPageList.ppsPageList = ppsPageList; psLinuxMemArea->uData.sPageList.hBlockPageList = hBlockPageList; - psLinuxMemArea->ui32ByteSize = ui32Bytes; + psLinuxMemArea->uiByteSize = uBytes; psLinuxMemArea->ui32AreaFlags = ui32AreaFlags; INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList); @@ -1467,7 +1524,7 @@ FreeAllocPagesLinuxMemArea(LinuxMemArea *psLinuxMemArea) DebugLinuxMemAreaRecordRemove(psLinuxMemArea); #endif - ui32NumPages = RANGE_TO_PAGES(psLinuxMemArea->ui32ByteSize); + ui32NumPages = RANGE_TO_PAGES(psLinuxMemArea->uiByteSize); ppsPageList = psLinuxMemArea->uData.sPageList.ppsPageList; hBlockPageList = psLinuxMemArea->uData.sPageList.hBlockPageList; @@ -1476,316 +1533,29 @@ FreeAllocPagesLinuxMemArea(LinuxMemArea *psLinuxMemArea) LinuxMemAreaStructFree(psLinuxMemArea); } -#if defined(CONFIG_ION_OMAP) - -#include "env_perproc.h" - -#include <linux/ion.h> -#include <linux/omap_ion.h> -#include <linux/scatterlist.h> - -extern struct ion_client *gpsIONClient; - -LinuxMemArea * -NewIONLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags, - IMG_PVOID pvPrivData, IMG_UINT32 ui32PrivDataLength) -{ - const IMG_UINT32 ui32AllocDataLen = - offsetof(struct omap_ion_tiler_alloc_data, handle); - struct omap_ion_tiler_alloc_data asAllocData[PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES]; - u32 *pu32PageAddrs[PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES] = { NULL, NULL, NULL}; - IMG_UINT32 i, j, ui32NumHandlesPerFd; - IMG_BYTE *pbPrivData = pvPrivData; - IMG_CPU_PHYADDR *pCPUPhysAddrs; - IMG_UINT32 iNumPages[PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES] = { 0, 0, 0}; - LinuxMemArea *psLinuxMemArea; - IMG_UINT32 ui32ProcID; - IMG_UINT32 ui32TotalPagesSizeInBytes = 0, ui32TotalPages = 0; - - psLinuxMemArea = LinuxMemAreaStructAlloc(); - if (!psLinuxMemArea) - { - PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate LinuxMemArea struct", __func__)); - goto err_out; - } - - /* Depending on the UM config, userspace might give us info for - * one, two or three ION allocations. Divide the total size of data we - * were given by this ui32AllocDataLen, and check it's 1 or 2. - * Otherwise abort. - */ - BUG_ON(ui32PrivDataLength != ui32AllocDataLen && - ui32PrivDataLength != ui32AllocDataLen * 2 && - ui32PrivDataLength != ui32AllocDataLen * 3); - /* This is bad !- change this logic to pass in the size or - * use uniformed API */ - ui32NumHandlesPerFd = ui32PrivDataLength / ui32AllocDataLen; - - ui32ProcID = OSGetCurrentProcessIDKM(); - - memset(asAllocData, 0x00, sizeof(asAllocData)); - - /* We do not care about what the first (Y) buffer offset would be, - * but we do care for the UV buffers to be co-aligned with Y - * This for SGX to find the UV offset solely based on the height - * and stride of the YUV buffer.This is very important for OMAP4470 - * and later chipsets, where SGX version is 544. 544 and later use - * non-shader based YUV to RGB conversion unit that require - * contiguous GPU virtual space */ - for(i = 0; i < ui32NumHandlesPerFd; i++) - { - memcpy(&asAllocData[i], &pbPrivData[i * ui32AllocDataLen], ui32AllocDataLen); - asAllocData[i].token = ui32ProcID; - -#ifndef SGX_DISABLE_DMM_OFFSET_BUFFER_ALLOCATIONS - if(i == 0) - { - /* Tiler API says: - * Allocate first buffer with the required alignment - * and an offset of 0 ... */ - asAllocData[i].out_align = CONFIG_TILER_GRANULARITY; - asAllocData[i].offset = 0; - } - else - { /* .. Then for the second buffer, use the offset from the first - * buffer with alignment of PAGE_SIZE */ - asAllocData[i].out_align = PAGE_SIZE; - asAllocData[i].offset = asAllocData[0].offset; - } -#else - asAllocData[i].offset = 0; - asAllocData[i].out_align = PAGE_SIZE; -#endif - - if(asAllocData[i].fmt == TILER_PIXEL_FMT_PAGE) - { - /* 1D DMM Buffers */ - struct scatterlist *sg; - struct sg_table *sgtable; - IMG_UINT32 ui32Num1dPages; - - asAllocData[i].handle = ion_alloc (gpsIONClient, - ui32Bytes, - PAGE_SIZE, (1 << OMAP_ION_HEAP_SYSTEM), 0); - - if (asAllocData[i].handle == NULL) - { - PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate via ion_alloc", - __func__)); - goto err_free; - } - - sgtable = ion_sg_table(gpsIONClient, asAllocData[i].handle); - if (sgtable == NULL) - { - PVR_DPF((PVR_DBG_ERROR, "%s: Failed to compute pages", - __func__)); - goto err_free; - } - - ui32Num1dPages = (ui32Bytes >> PAGE_SHIFT); - pu32PageAddrs[i] = kmalloc (sizeof(u32) * ui32Num1dPages, GFP_KERNEL); - if (pu32PageAddrs[i] == NULL) - { - PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate page array", - __func__)); - goto err_free; - } - - for_each_sg (sgtable->sgl, sg, ui32Num1dPages, j) - { - pu32PageAddrs[i][j] = sg_phys (sg); - } - - iNumPages[i] = ui32Num1dPages; - } - else /* 2D DMM Buffers */ - { - if (omap_ion_tiler_alloc(gpsIONClient, &asAllocData[i]) < 0) - { - PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate via ion_tiler", - __func__)); - goto err_free; - } - - if (omap_tiler_pages(gpsIONClient, asAllocData[i].handle, &iNumPages[i], - &pu32PageAddrs[i]) < 0) - { - PVR_DPF((PVR_DBG_ERROR, "%s: Failed to compute tiler pages", - __func__)); - goto err_free; - } - } - } - - /* Basic sanity check on plane co-alignment */ - if((ui32NumHandlesPerFd > 1) && - (asAllocData[0].offset != asAllocData[1].offset)) - { - pr_err("%s: Y and UV offsets do not match for tiler handles " - "%p,%p: %d != %d \n " - "Expect issues with SGX544xx and later chipsets\n", - __func__, asAllocData[0].handle, asAllocData[1].handle, - (int)asAllocData[0].offset, (int)asAllocData[1].offset); - } - - /* Assume the user-allocator has already done the tiler math and that the - * number of tiler pages allocated matches any other allocation type. - */ - for(i = 0; i < ui32NumHandlesPerFd; i++) - { - ui32TotalPages += iNumPages[i]; - } - - BUG_ON(ui32Bytes != (ui32TotalPages * PAGE_SIZE)); - BUG_ON(sizeof(IMG_CPU_PHYADDR) != sizeof(int)); - - /* Glue the page lists together */ - pCPUPhysAddrs = vmalloc(sizeof(IMG_CPU_PHYADDR) * ui32TotalPages); - if (!pCPUPhysAddrs) - { - PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate page list", __func__)); - goto err_free; - } - - j = 0; - for(i = 0; i < ui32NumHandlesPerFd; i++) - { - IMG_UINT32 ui32PageIndx; - for(ui32PageIndx = 0; ui32PageIndx < iNumPages[i]; ui32PageIndx++) - { - pCPUPhysAddrs[j++].uiAddr = pu32PageAddrs[i][ui32PageIndx]; - } - - psLinuxMemArea->uData.sIONTilerAlloc.psIONHandle[i] = - asAllocData[i].handle; - psLinuxMemArea->uData.sIONTilerAlloc.planeOffsets[i] = - ui32TotalPagesSizeInBytes + asAllocData[i].offset; - /* Add the number of pages this plane consists of */ - ui32TotalPagesSizeInBytes += (iNumPages[i] * PAGE_SIZE); - } - - psLinuxMemArea->eAreaType = LINUX_MEM_AREA_ION; - psLinuxMemArea->uData.sIONTilerAlloc.pCPUPhysAddrs = pCPUPhysAddrs; - psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes = - ui32NumHandlesPerFd; - psLinuxMemArea->ui32ByteSize = ui32TotalPagesSizeInBytes; - psLinuxMemArea->ui32AreaFlags = ui32AreaFlags; - INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList); - - /* We defer the cache flush to the first user mapping of this memory */ - psLinuxMemArea->bNeedsCacheInvalidate = AreaIsUncached(ui32AreaFlags); - -#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_ION, - asAllocData[0].handle, - 0, - 0, - NULL, - PAGE_ALIGN(ui32Bytes), - "unknown", - 0 - ); -#endif - -#if defined(DEBUG_LINUX_MEM_AREAS) - DebugLinuxMemAreaRecordAdd(psLinuxMemArea, ui32AreaFlags); -#endif - -err_out: - return psLinuxMemArea; - -err_free: - LinuxMemAreaStructFree(psLinuxMemArea); - psLinuxMemArea = IMG_NULL; - goto err_out; -} - -IMG_INT32 -GetIONLinuxMemAreaInfo(LinuxMemArea *psLinuxMemArea, IMG_UINT32* pui32AddressOffsets, - IMG_UINT32* ui32NumAddrOffsets) -{ - IMG_UINT32 i; - - if(!ui32NumAddrOffsets) - return -1; - - if(*ui32NumAddrOffsets < psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes) - { - *ui32NumAddrOffsets = psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes; - return -1; - } - - if(!pui32AddressOffsets) - return -1; - - for(i = 0; i < psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes; i++) - { - if(psLinuxMemArea->uData.sIONTilerAlloc.psIONHandle[i]) - pui32AddressOffsets[i] = - psLinuxMemArea->uData.sIONTilerAlloc.planeOffsets[i]; - } - - *ui32NumAddrOffsets = psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes; - - return psLinuxMemArea->ui32ByteSize; -} - -IMG_VOID -FreeIONLinuxMemArea(LinuxMemArea *psLinuxMemArea) -{ - IMG_UINT32 i; - -#if defined(DEBUG_LINUX_MEM_AREAS) - DebugLinuxMemAreaRecordRemove(psLinuxMemArea); -#endif - -#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_ION, - psLinuxMemArea->uData.sIONTilerAlloc.psIONHandle[0], - __FILE__, __LINE__); -#endif - - for(i = 0; i < psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes; i++) - { - if (!psLinuxMemArea->uData.sIONTilerAlloc.psIONHandle[i]) - break; - ion_free(gpsIONClient, psLinuxMemArea->uData.sIONTilerAlloc.psIONHandle[i]); - psLinuxMemArea->uData.sIONTilerAlloc.psIONHandle[i] = IMG_NULL; - } - - /* free copy of page list, originals are freed by ion_free */ - vfree(psLinuxMemArea->uData.sIONTilerAlloc.pCPUPhysAddrs); - psLinuxMemArea->uData.sIONTilerAlloc.pCPUPhysAddrs = IMG_NULL; - - LinuxMemAreaStructFree(psLinuxMemArea); -} - -#endif /* defined(CONFIG_ION_OMAP) */ - struct page* LinuxMemAreaOffsetToPage(LinuxMemArea *psLinuxMemArea, - IMG_UINT32 ui32ByteOffset) + IMG_UINTPTR_T uByteOffset) { - IMG_UINT32 ui32PageIndex; + IMG_UINTPTR_T uPageIndex; IMG_CHAR *pui8Addr; switch (psLinuxMemArea->eAreaType) { case LINUX_MEM_AREA_ALLOC_PAGES: - ui32PageIndex = PHYS_TO_PFN(ui32ByteOffset); - return psLinuxMemArea->uData.sPageList.ppsPageList[ui32PageIndex]; + uPageIndex = PHYS_TO_PFN(uByteOffset); + return psLinuxMemArea->uData.sPageList.ppsPageList[uPageIndex]; case LINUX_MEM_AREA_VMALLOC: pui8Addr = psLinuxMemArea->uData.sVmalloc.pvVmallocAddress; - pui8Addr += ui32ByteOffset; + pui8Addr += uByteOffset; return vmalloc_to_page(pui8Addr); case LINUX_MEM_AREA_SUB_ALLOC: /* PRQA S 3670 3 */ /* ignore recursive warning */ return LinuxMemAreaOffsetToPage(psLinuxMemArea->uData.sSubAlloc.psParentLinuxMemArea, - psLinuxMemArea->uData.sSubAlloc.ui32ByteOffset - + ui32ByteOffset); + psLinuxMemArea->uData.sSubAlloc.uiByteOffset + + uByteOffset); default: PVR_DPF((PVR_DBG_ERROR, "%s: Unsupported request for struct page from LinuxMemArea with type=%s", @@ -1830,14 +1600,19 @@ _KMemCacheAllocWrapper(LinuxKMemCache *psCache, IMG_UINT32 ui32Line) { IMG_VOID *pvRet; - + +#if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) + IMG_CPU_PHYADDR sCpuPAddr; +#endif + pvRet = kmem_cache_zalloc(psCache, Flags); #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) + sCpuPAddr.uiAddr = 0; DebugMemAllocRecordAdd(DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE, + (IMG_UINTPTR_T)pvRet, pvRet, - pvRet, - 0, + sCpuPAddr, psCache, kmem_cache_size(psCache), pszFileName, @@ -1854,12 +1629,12 @@ _KMemCacheAllocWrapper(LinuxKMemCache *psCache, LinuxMemArea * NewSubLinuxMemArea(LinuxMemArea *psParentLinuxMemArea, - IMG_UINT32 ui32ByteOffset, - IMG_UINT32 ui32Bytes) + IMG_UINTPTR_T uiByteOffset, + IMG_SIZE_T uBytes) { LinuxMemArea *psLinuxMemArea; - PVR_ASSERT((ui32ByteOffset+ui32Bytes) <= psParentLinuxMemArea->ui32ByteSize); + PVR_ASSERT((uiByteOffset + uBytes) <= psParentLinuxMemArea->uiByteSize); psLinuxMemArea = LinuxMemAreaStructAlloc(); if (!psLinuxMemArea) @@ -1869,8 +1644,8 @@ NewSubLinuxMemArea(LinuxMemArea *psParentLinuxMemArea, psLinuxMemArea->eAreaType = LINUX_MEM_AREA_SUB_ALLOC; psLinuxMemArea->uData.sSubAlloc.psParentLinuxMemArea = psParentLinuxMemArea; - psLinuxMemArea->uData.sSubAlloc.ui32ByteOffset = ui32ByteOffset; - psLinuxMemArea->ui32ByteSize = ui32Bytes; + psLinuxMemArea->uData.sSubAlloc.uiByteOffset = uiByteOffset; + psLinuxMemArea->uiByteSize = uBytes; psLinuxMemArea->ui32AreaFlags = psParentLinuxMemArea->ui32AreaFlags; psLinuxMemArea->bNeedsCacheInvalidate = psParentLinuxMemArea->bNeedsCacheInvalidate; INIT_LIST_HEAD(&psLinuxMemArea->sMMapOffsetStructList); @@ -1950,9 +1725,6 @@ LinuxMemAreaDeepFree(LinuxMemArea *psLinuxMemArea) case LINUX_MEM_AREA_SUB_ALLOC: FreeSubLinuxMemArea(psLinuxMemArea); break; - case LINUX_MEM_AREA_ION: - FreeIONLinuxMemArea(psLinuxMemArea); - break; default: PVR_DPF((PVR_DBG_ERROR, "%s: Unknown are type (%d)\n", __FUNCTION__, psLinuxMemArea->eAreaType)); @@ -1972,7 +1744,7 @@ DebugLinuxMemAreaRecordAdd(LinuxMemArea *psLinuxMemArea, IMG_UINT32 ui32Flags) if (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC) { - g_LinuxMemAreaWaterMark += psLinuxMemArea->ui32ByteSize; + g_LinuxMemAreaWaterMark += psLinuxMemArea->uiByteSize; if (g_LinuxMemAreaWaterMark > g_LinuxMemAreaHighWaterMark) { g_LinuxMemAreaHighWaterMark = g_LinuxMemAreaWaterMark; @@ -2058,7 +1830,7 @@ DebugLinuxMemAreaRecordRemove(LinuxMemArea *psLinuxMemArea) if (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC) { - g_LinuxMemAreaWaterMark -= psLinuxMemArea->ui32ByteSize; + g_LinuxMemAreaWaterMark -= psLinuxMemArea->uiByteSize; } g_LinuxMemAreaCount--; @@ -2102,7 +1874,7 @@ LinuxMemAreaToCpuVAddr(LinuxMemArea *psLinuxMemArea) { return NULL; } - return pAddr + psLinuxMemArea->uData.sSubAlloc.ui32ByteOffset; + return pAddr + psLinuxMemArea->uData.sSubAlloc.uiByteOffset; } default: return NULL; @@ -2111,7 +1883,7 @@ LinuxMemAreaToCpuVAddr(LinuxMemArea *psLinuxMemArea) IMG_CPU_PHYADDR -LinuxMemAreaToCpuPAddr(LinuxMemArea *psLinuxMemArea, IMG_UINT32 ui32ByteOffset) +LinuxMemAreaToCpuPAddr(LinuxMemArea *psLinuxMemArea, IMG_UINTPTR_T uiByteOffset) { IMG_CPU_PHYADDR CpuPAddr; @@ -2122,7 +1894,7 @@ LinuxMemAreaToCpuPAddr(LinuxMemArea *psLinuxMemArea, IMG_UINT32 ui32ByteOffset) case LINUX_MEM_AREA_IOREMAP: { CpuPAddr = psLinuxMemArea->uData.sIORemap.CPUPhysAddr; - CpuPAddr.uiAddr += ui32ByteOffset; + CpuPAddr.uiAddr += uiByteOffset; break; } case LINUX_MEM_AREA_EXTERNAL_KV: @@ -2130,22 +1902,22 @@ LinuxMemAreaToCpuPAddr(LinuxMemArea *psLinuxMemArea, IMG_UINT32 ui32ByteOffset) if (psLinuxMemArea->uData.sExternalKV.bPhysContig) { CpuPAddr = SysSysPAddrToCpuPAddr(psLinuxMemArea->uData.sExternalKV.uPhysAddr.SysPhysAddr); - CpuPAddr.uiAddr += ui32ByteOffset; + CpuPAddr.uiAddr += uiByteOffset; } else { - IMG_UINT32 ui32PageIndex = PHYS_TO_PFN(ui32ByteOffset); - IMG_SYS_PHYADDR SysPAddr = psLinuxMemArea->uData.sExternalKV.uPhysAddr.pSysPhysAddr[ui32PageIndex]; + IMG_UINTPTR_T uiPageIndex = PHYS_TO_PFN(uiByteOffset); + IMG_SYS_PHYADDR SysPAddr = psLinuxMemArea->uData.sExternalKV.uPhysAddr.pSysPhysAddr[uiPageIndex]; CpuPAddr = SysSysPAddrToCpuPAddr(SysPAddr); - CpuPAddr.uiAddr += ADDR_TO_PAGE_OFFSET(ui32ByteOffset); + CpuPAddr.uiAddr += ADDR_TO_PAGE_OFFSET(uiByteOffset); } break; } case LINUX_MEM_AREA_IO: { CpuPAddr = psLinuxMemArea->uData.sIO.CPUPhysAddr; - CpuPAddr.uiAddr += ui32ByteOffset; + CpuPAddr.uiAddr += uiByteOffset; break; } case LINUX_MEM_AREA_VMALLOC: @@ -2153,32 +1925,25 @@ LinuxMemAreaToCpuPAddr(LinuxMemArea *psLinuxMemArea, IMG_UINT32 ui32ByteOffset) IMG_CHAR *pCpuVAddr; pCpuVAddr = (IMG_CHAR *)psLinuxMemArea->uData.sVmalloc.pvVmallocAddress; - pCpuVAddr += ui32ByteOffset; + pCpuVAddr += uiByteOffset; CpuPAddr.uiAddr = VMallocToPhys(pCpuVAddr); break; } - case LINUX_MEM_AREA_ION: - { - IMG_UINT32 ui32PageIndex = PHYS_TO_PFN(ui32ByteOffset); - CpuPAddr = psLinuxMemArea->uData.sIONTilerAlloc.pCPUPhysAddrs[ui32PageIndex]; - CpuPAddr.uiAddr += ADDR_TO_PAGE_OFFSET(ui32ByteOffset); - break; - } case LINUX_MEM_AREA_ALLOC_PAGES: { struct page *page; - IMG_UINT32 ui32PageIndex = PHYS_TO_PFN(ui32ByteOffset); - page = psLinuxMemArea->uData.sPageList.ppsPageList[ui32PageIndex]; + IMG_UINTPTR_T uiPageIndex = PHYS_TO_PFN(uiByteOffset); + page = psLinuxMemArea->uData.sPageList.ppsPageList[uiPageIndex]; CpuPAddr.uiAddr = page_to_phys(page); - CpuPAddr.uiAddr += ADDR_TO_PAGE_OFFSET(ui32ByteOffset); + CpuPAddr.uiAddr += ADDR_TO_PAGE_OFFSET(uiByteOffset); break; } case LINUX_MEM_AREA_SUB_ALLOC: { CpuPAddr = OSMemHandleToCpuPAddr(psLinuxMemArea->uData.sSubAlloc.psParentLinuxMemArea, - psLinuxMemArea->uData.sSubAlloc.ui32ByteOffset - + ui32ByteOffset); + psLinuxMemArea->uData.sSubAlloc.uiByteOffset + + uiByteOffset); break; } default: @@ -2206,7 +1971,6 @@ LinuxMemAreaPhysIsContig(LinuxMemArea *psLinuxMemArea) case LINUX_MEM_AREA_EXTERNAL_KV: return psLinuxMemArea->uData.sExternalKV.bPhysContig; - case LINUX_MEM_AREA_ION: case LINUX_MEM_AREA_VMALLOC: case LINUX_MEM_AREA_ALLOC_PAGES: return IMG_FALSE; @@ -2244,8 +2008,6 @@ LinuxMemAreaTypeToString(LINUX_MEM_AREA_TYPE eMemAreaType) return "LINUX_MEM_AREA_SUB_ALLOC"; case LINUX_MEM_AREA_ALLOC_PAGES: return "LINUX_MEM_AREA_ALLOC_PAGES"; - case LINUX_MEM_AREA_ION: - return "LINUX_MEM_AREA_ION"; default: PVR_ASSERT(0); } @@ -2351,14 +2113,14 @@ static void ProcSeqShowMemArea(struct seq_file *sfile,void* el) seq_printf(sfile, #if !defined(DEBUG_LINUX_XML_PROC_FILES) - "%8p %-24s %8p %08x %-8d %-5u %08x=(%s)\n", + "%p %-24s %p " CPUPADDR_FMT " %" SIZE_T_FMT_LEN "u %-5u %08x=(%s)\n", #else "<linux_mem_area>\n" - "\t<pointer>%8p</pointer>\n" + "\t<pointer>%p</pointer>\n" "\t<type>%s</type>\n" - "\t<cpu_virtual>%8p</cpu_virtual>\n" - "\t<cpu_physical>%08x</cpu_physical>\n" - "\t<bytes>%d</bytes>\n" + "\t<cpu_virtual>%p</cpu_virtual>\n" + "\t<cpu_physical>" CPUPADDR_FMT "</cpu_physical>\n" + "\t<bytes>%" SIZE_T_FMT_LEN "d</bytes>\n" "\t<pid>%u</pid>\n" "\t<flags>%08x</flags>\n" "\t<flags_string>%s</flags_string>\n" @@ -2368,14 +2130,13 @@ static void ProcSeqShowMemArea(struct seq_file *sfile,void* el) LinuxMemAreaTypeToString(psRecord->psLinuxMemArea->eAreaType), LinuxMemAreaToCpuVAddr(psRecord->psLinuxMemArea), LinuxMemAreaToCpuPAddr(psRecord->psLinuxMemArea,0).uiAddr, - psRecord->psLinuxMemArea->ui32ByteSize, + psRecord->psLinuxMemArea->uiByteSize, psRecord->pid, psRecord->ui32Flags, HAPFlagsToString(psRecord->ui32Flags) ); } - #endif /* DEBUG_LINUX_MEM_AREAS */ @@ -2394,7 +2155,6 @@ static IMG_VOID* DecOffMemAllocRec_AnyVaCb(DEBUG_MEM_ALLOC_REC *psNode, va_list } } - /* seq_file version of generating output, for reference check proc.c:CreateProcReadEntrySeq */ static void* ProcSeqNextMemoryRecords(struct seq_file *sfile,void* el,loff_t off) { @@ -2599,13 +2359,13 @@ static void ProcSeqShowMemoryRecords(struct seq_file *sfile,void* el) { seq_printf(sfile, #if !defined(DEBUG_LINUX_XML_PROC_FILES) - "%-16s %-8p %08x %-10d %-5d %-10s %s:%d\n", + "%-16s %p " CPUPADDR_FMT " %" SIZE_T_FMT_LEN "u %-5d %-10s %s:%d\n", #else "<allocation>\n" "\t<type>%s</type>\n" - "\t<cpu_virtual>%-8p</cpu_virtual>\n" - "\t<cpu_physical>%08x</cpu_physical>\n" - "\t<bytes>%d</bytes>\n" + "\t<cpu_virtual>%p</cpu_virtual>\n" + "\t<cpu_physical>" CPUPADDR_FMT "</cpu_physical>\n" + "\t<bytes>%" SIZE_T_FMT_LEN "u</bytes>\n" "\t<pid>%d</pid>\n" "\t<private>%s</private>\n" "\t<filename>%s</filename>\n" @@ -2614,8 +2374,8 @@ static void ProcSeqShowMemoryRecords(struct seq_file *sfile,void* el) #endif DebugMemAllocRecordTypeToString(psRecord->eAllocType), psRecord->pvCpuVAddr, - psRecord->ulCpuPAddr, - psRecord->ui32Bytes, + psRecord->sCpuPAddr.uiAddr, + psRecord->uiBytes, psRecord->pid, "NULL", psRecord->pszFileName, @@ -2625,13 +2385,13 @@ static void ProcSeqShowMemoryRecords(struct seq_file *sfile,void* el) { seq_printf(sfile, #if !defined(DEBUG_LINUX_XML_PROC_FILES) - "%-16s %-8p %08x %-10d %-5d %-10s %s:%d\n", + "%-16s %p " CPUPADDR_FMT " %" SIZE_T_FMT_LEN "u %-5d %-10s %s:%d\n", #else "<allocation>\n" "\t<type>%s</type>\n" - "\t<cpu_virtual>%-8p</cpu_virtual>\n" - "\t<cpu_physical>%08x</cpu_physical>\n" - "\t<bytes>%d</bytes>\n" + "\t<cpu_virtual>%p</cpu_virtual>\n" + "\t<cpu_physical>" CPUPADDR_FMT "</cpu_physical>\n" + "\t<bytes>%" SIZE_T_FMT_LEN "u</bytes>\n" "\t<pid>%d</pid>\n" "\t<private>%s</private>\n" "\t<filename>%s</filename>\n" @@ -2640,15 +2400,14 @@ static void ProcSeqShowMemoryRecords(struct seq_file *sfile,void* el) #endif DebugMemAllocRecordTypeToString(psRecord->eAllocType), psRecord->pvCpuVAddr, - psRecord->ulCpuPAddr, - psRecord->ui32Bytes, + psRecord->sCpuPAddr.uiAddr, + psRecord->uiBytes, psRecord->pid, KMemCacheNameWrapper(psRecord->pvPrivateData), psRecord->pszFileName, psRecord->ui32Line); } } - #endif /* defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) */ @@ -2731,11 +2490,11 @@ static IMG_VOID LinuxMMCleanup_MemAreas_ForEachCb(DEBUG_LINUX_MEM_AREA_REC *psCu LinuxMemArea *psLinuxMemArea; psLinuxMemArea = psCurrentRecord->psLinuxMemArea; - PVR_DPF((PVR_DBG_ERROR, "%s: BUG!: Cleaning up Linux memory area (%p), type=%s, size=%d bytes", + PVR_DPF((PVR_DBG_ERROR, "%s: BUG!: Cleaning up Linux memory area (%p), type=%s, size=%"SIZE_T_FMT_LEN"d bytes", __FUNCTION__, psCurrentRecord->psLinuxMemArea, LinuxMemAreaTypeToString(psCurrentRecord->psLinuxMemArea->eAreaType), - psCurrentRecord->psLinuxMemArea->ui32ByteSize)); + psCurrentRecord->psLinuxMemArea->uiByteSize)); /* Note this will also remove psCurrentRecord from g_LinuxMemAreaRecords * but that's ok since we have already got a pointer to the next area. */ LinuxMemAreaDeepFree(psLinuxMemArea); @@ -2752,12 +2511,12 @@ static IMG_VOID LinuxMMCleanup_MemRecords_ForEachVa(DEBUG_MEM_ALLOC_REC *psCurre PVR_DPF((PVR_DBG_ERROR, "%s: BUG!: Cleaning up memory: " "type=%s " "CpuVAddr=%p " - "CpuPAddr=0x%08x, " + "CpuPAddr=0x" CPUPADDR_FMT ", " "allocated @ file=%s,line=%d", __FUNCTION__, DebugMemAllocRecordTypeToString(psCurrentRecord->eAllocType), psCurrentRecord->pvCpuVAddr, - psCurrentRecord->ulCpuPAddr, + psCurrentRecord->sCpuPAddr.uiAddr, psCurrentRecord->pszFileName, psCurrentRecord->ui32Line)); switch (psCurrentRecord->eAllocType) @@ -2770,13 +2529,13 @@ static IMG_VOID LinuxMMCleanup_MemRecords_ForEachVa(DEBUG_MEM_ALLOC_REC *psCurre break; case DEBUG_MEM_ALLOC_TYPE_IO: /* Nothing needed except to free the record */ - DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_IO, psCurrentRecord->pvKey, __FILE__, __LINE__); + DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_IO, psCurrentRecord->uiKey, __FILE__, __LINE__); break; case DEBUG_MEM_ALLOC_TYPE_VMALLOC: VFreeWrapper(psCurrentRecord->pvCpuVAddr); break; case DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES: - DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES, psCurrentRecord->pvKey, __FILE__, __LINE__); + DebugMemAllocRecordRemove(DEBUG_MEM_ALLOC_TYPE_ALLOC_PAGES, psCurrentRecord->uiKey, __FILE__, __LINE__); break; case DEBUG_MEM_ALLOC_TYPE_KMEM_CACHE: KMemCacheFreeWrapper(psCurrentRecord->pvPrivateData, psCurrentRecord->pvCpuVAddr); diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mm.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mm.h index 5c01322..933420d 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mm.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mm.h @@ -88,7 +88,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif #endif -static inline IMG_UINT32 VMallocToPhys(IMG_VOID *pCpuVAddr) +static inline IMG_UINTPTR_T VMallocToPhys(IMG_VOID *pCpuVAddr) { return (page_to_phys(vmalloc_to_page(pCpuVAddr)) + ADDR_TO_PAGE_OFFSET(pCpuVAddr)); @@ -101,7 +101,6 @@ typedef enum { LINUX_MEM_AREA_VMALLOC, LINUX_MEM_AREA_ALLOC_PAGES, LINUX_MEM_AREA_SUB_ALLOC, - LINUX_MEM_AREA_ION, #if defined(PVR_LINUX_MEM_AREA_USE_VMAP) LINUX_MEM_AREA_VMAP, #endif @@ -161,25 +160,16 @@ struct _LinuxMemArea { struct page **ppsPageList; IMG_HANDLE hBlockPageList; }sPageList; - struct _sIONTilerAlloc - { - /* Note the memory this represents _is_ implicitly - * page aligned _and_ so is its size */ - IMG_CPU_PHYADDR *pCPUPhysAddrs; - IMG_UINT32 ui32NumValidPlanes; - struct ion_handle *psIONHandle[PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES]; - IMG_UINT32 planeOffsets[PVRSRV_MAX_NUMBER_OF_MM_BUFFER_PLANES]; - }sIONTilerAlloc; struct _sSubAlloc { /* Note: The memory this represents is _not_ implicitly * page aligned, neither is its size */ LinuxMemArea *psParentLinuxMemArea; - IMG_UINT32 ui32ByteOffset; + IMG_UINTPTR_T uiByteOffset; }sSubAlloc; }uData; - IMG_UINT32 ui32ByteSize; /* Size of memory area */ + IMG_SIZE_T uiByteSize; /* Size of memory area */ IMG_UINT32 ui32AreaFlags; /* Flags passed at creation time */ @@ -241,16 +231,16 @@ IMG_VOID LinuxMMCleanup(IMG_VOID); * They can also be used as more concise replacements for OSAllocMem * in Linux specific code. * - * @param ui32ByteSize + * @param uByteSize * * @return ******************************************************************************/ #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) -#define KMallocWrapper(ui32ByteSize, uFlags) _KMallocWrapper(ui32ByteSize, uFlags, __FILE__, __LINE__) +#define KMallocWrapper(uByteSize, uFlags) _KMallocWrapper(uByteSize, uFlags, __FILE__, __LINE__) #else -#define KMallocWrapper(ui32ByteSize, uFlags) _KMallocWrapper(ui32ByteSize, uFlags, NULL, 0) +#define KMallocWrapper(uByteSize, uFlags) _KMallocWrapper(uByteSize, uFlags, NULL, 0) #endif -IMG_VOID *_KMallocWrapper(IMG_UINT32 ui32ByteSize, gfp_t uFlags, IMG_CHAR *szFileName, IMG_UINT32 ui32Line); +IMG_VOID *_KMallocWrapper(IMG_SIZE_T uByteSize, gfp_t uFlags, IMG_CHAR *szFileName, IMG_UINT32 ui32Line); /*! @@ -273,17 +263,17 @@ IMG_VOID _KFreeWrapper(IMG_VOID *pvCpuVAddr, IMG_CHAR *pszFileName, IMG_UINT32 u ******************************************************************************* * @brief * - * @param ui32Bytes + * @param uBytes * @param ui32AllocFlags * * @return ******************************************************************************/ #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) -#define VMallocWrapper(ui32Bytes, ui32AllocFlags) _VMallocWrapper(ui32Bytes, ui32AllocFlags, __FILE__, __LINE__) +#define VMallocWrapper(uiBytes, ui32AllocFlags) _VMallocWrapper(uiBytes, ui32AllocFlags, __FILE__, __LINE__) #else -#define VMallocWrapper(ui32Bytes, ui32AllocFlags) _VMallocWrapper(ui32Bytes, ui32AllocFlags, NULL, 0) +#define VMallocWrapper(uiBytes, ui32AllocFlags) _VMallocWrapper(uiBytes, ui32AllocFlags, NULL, 0) #endif -IMG_VOID *_VMallocWrapper(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AllocFlags, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line); +IMG_VOID *_VMallocWrapper(IMG_SIZE_T uiBytes, IMG_UINT32 ui32AllocFlags, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line); /*! @@ -306,12 +296,12 @@ IMG_VOID _VFreeWrapper(IMG_VOID *pvCpuVAddr, IMG_CHAR *pszFileName, IMG_UINT32 u ******************************************************************************* * @brief Allocates virtually contiguous pages * - * @param ui32Bytes number of bytes to reserve + * @param uBytes number of bytes to reserve * @param ui32AreaFlags Heap caching and mapping Flags * * @return Page-aligned address of virtual allocation or NULL on error ******************************************************************************/ -LinuxMemArea *NewVMallocLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags); +LinuxMemArea *NewVMallocLinuxMemArea(IMG_SIZE_T uBytes, IMG_UINT32 ui32AreaFlags); /*! @@ -329,20 +319,20 @@ IMG_VOID FreeVMallocLinuxMemArea(LinuxMemArea *psLinuxMemArea); * @brief Reserve physical IO memory and create a CPU virtual mapping for it * * @param BasePAddr - * @param ui32Bytes + * @param uiBytes * @param ui32MappingFlags * * @return ******************************************************************************/ #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) -#define IORemapWrapper(BasePAddr, ui32Bytes, ui32MappingFlags) \ - _IORemapWrapper(BasePAddr, ui32Bytes, ui32MappingFlags, __FILE__, __LINE__) +#define IORemapWrapper(BasePAddr, uiBytes, ui32MappingFlags) \ + _IORemapWrapper(BasePAddr, uiBytes, ui32MappingFlags, __FILE__, __LINE__) #else -#define IORemapWrapper(BasePAddr, ui32Bytes, ui32MappingFlags) \ - _IORemapWrapper(BasePAddr, ui32Bytes, ui32MappingFlags, NULL, 0) +#define IORemapWrapper(BasePAddr, uiBytes, ui32MappingFlags) \ + _IORemapWrapper(BasePAddr, uiBytes, ui32MappingFlags, NULL, 0) #endif IMG_VOID *_IORemapWrapper(IMG_CPU_PHYADDR BasePAddr, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uiBytes, IMG_UINT32 ui32MappingFlags, IMG_CHAR *pszFileName, IMG_UINT32 ui32Line); @@ -353,12 +343,12 @@ IMG_VOID *_IORemapWrapper(IMG_CPU_PHYADDR BasePAddr, * @brief Reserve physical IO memory and create a CPU virtual mapping for it * * @param BasePAddr - * @param ui32Bytes + * @param uiBytes * @param ui32AreaFlags Heap caching and mapping Flags * * @return ******************************************************************************/ -LinuxMemArea *NewIORemapLinuxMemArea(IMG_CPU_PHYADDR BasePAddr, IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags); +LinuxMemArea *NewIORemapLinuxMemArea(IMG_CPU_PHYADDR BasePAddr, IMG_SIZE_T uiBytes, IMG_UINT32 ui32AreaFlags); /*! @@ -378,12 +368,12 @@ IMG_VOID FreeIORemapLinuxMemArea(LinuxMemArea *psLinuxMemArea); * @param pBasePAddr * @param pvCPUVAddr * @param bPhysContig - * @param ui32Bytes + * @param uBytes * @param ui32AreaFlags Heap caching and mapping Flags * * @return ******************************************************************************/ -LinuxMemArea *NewExternalKVLinuxMemArea(IMG_SYS_PHYADDR *pBasePAddr, IMG_VOID *pvCPUVAddr, IMG_UINT32 ui32Bytes, IMG_BOOL bPhysContig, IMG_UINT32 ui32AreaFlags); +LinuxMemArea *NewExternalKVLinuxMemArea(IMG_SYS_PHYADDR *pBasePAddr, IMG_VOID *pvCPUVAddr, IMG_SIZE_T uBytes, IMG_BOOL bPhysContig, IMG_UINT32 ui32AreaFlags); /*! @@ -420,11 +410,11 @@ IMG_VOID _IOUnmapWrapper(IMG_VOID *pvIORemapCookie, IMG_CHAR *pszFileName, IMG_U * @brief * * @param psLinuxMemArea - * @param ui32ByteOffset + * @param uByteOffset * * @return ******************************************************************************/ -struct page *LinuxMemAreaOffsetToPage(LinuxMemArea *psLinuxMemArea, IMG_UINT32 ui32ByteOffset); +struct page *LinuxMemAreaOffsetToPage(LinuxMemArea *psLinuxMemArea, IMG_UINTPTR_T uByteOffset); /*! @@ -506,12 +496,12 @@ const IMG_CHAR *KMemCacheNameWrapper(LinuxKMemCache *psCache); * @brief * * @param BasePAddr - * @param ui32Bytes + * @param uiBytes * @param ui32AreaFlags Heap caching and mapping Flags * * @return ******************************************************************************/ -LinuxMemArea *NewIOLinuxMemArea(IMG_CPU_PHYADDR BasePAddr, IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags); +LinuxMemArea *NewIOLinuxMemArea(IMG_CPU_PHYADDR BasePAddr, IMG_SIZE_T uiBytes, IMG_UINT32 ui32AreaFlags); /*! @@ -529,12 +519,12 @@ IMG_VOID FreeIOLinuxMemArea(LinuxMemArea *psLinuxMemArea); ******************************************************************************* * @brief * - * @param ui32Bytes + * @param uiBytes * @param ui32AreaFlags E.g Heap caching and mapping Flags * * @return ******************************************************************************/ -LinuxMemArea *NewAllocPagesLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags); +LinuxMemArea *NewAllocPagesLinuxMemArea(IMG_SIZE_T uiBytes, IMG_UINT32 ui32AreaFlags); /*! @@ -548,83 +538,19 @@ LinuxMemArea *NewAllocPagesLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32Are IMG_VOID FreeAllocPagesLinuxMemArea(LinuxMemArea *psLinuxMemArea); -#if defined(CONFIG_ION_OMAP) - -/*! - ******************************************************************************* - * @brief - * - * @param ui32Bytes - * @param ui32AreaFlags E.g Heap caching and mapping Flags - * - * @return - ******************************************************************************/ -LinuxMemArea * -NewIONLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags, - IMG_PVOID pvPrivData, IMG_UINT32 ui32PrivDataLength); - - -/*! - ******************************************************************************* - * @brief - * - * @param psLinuxMemArea - * - * @return - ******************************************************************************/ -IMG_VOID FreeIONLinuxMemArea(LinuxMemArea *psLinuxMemArea); - -IMG_INT32 -GetIONLinuxMemAreaInfo(LinuxMemArea *psLinuxMemArea, IMG_UINT32* ui32AddressOffsets, - IMG_UINT32* ui32NumAddr); - -#else /* defined(CONFIG_ION_OMAP) */ - -static inline LinuxMemArea * -NewIONLinuxMemArea(IMG_UINT32 ui32Bytes, IMG_UINT32 ui32AreaFlags, - IMG_PVOID pvPrivData, IMG_UINT32 ui32PrivDataLength) -{ - PVR_UNREFERENCED_PARAMETER(ui32Bytes); - PVR_UNREFERENCED_PARAMETER(ui32AreaFlags); - PVR_UNREFERENCED_PARAMETER(pvPrivData); - PVR_UNREFERENCED_PARAMETER(ui32PrivDataLength); - BUG(); - return IMG_NULL; -} - -static inline IMG_VOID FreeIONLinuxMemArea(LinuxMemArea *psLinuxMemArea) -{ - PVR_UNREFERENCED_PARAMETER(psLinuxMemArea); - BUG(); -} - -static inline IMG_INT32 -GetIONLinuxMemAreaInfo(LinuxMemArea *psLinuxMemArea, IMG_UINT32* ui32AddressOffsets, - IMG_UINT32* ui32NumAddr); -{ - PVR_UNREFERENCED_PARAMETER(psLinuxMemArea); - PVR_UNREFERENCED_PARAMETER(ui32AddressOffsets); - PVR_UNREFERENCED_PARAMETER(ui32NumAddr); - BUG(); - return -1; -} - -#endif /* defined(CONFIG_ION_OMAP) */ - - /*! ******************************************************************************* * @brief * * @param psParentLinuxMemArea - * @param ui32ByteOffset - * @param ui32Bytes + * @param uByteOffset + * @param uBytes * * @return ******************************************************************************/ LinuxMemArea *NewSubLinuxMemArea(LinuxMemArea *psParentLinuxMemArea, - IMG_UINT32 ui32ByteOffset, - IMG_UINT32 ui32Bytes); + IMG_UINTPTR_T uByteOffset, + IMG_SIZE_T uBytes); /*! @@ -668,14 +594,14 @@ IMG_VOID *LinuxMemAreaToCpuVAddr(LinuxMemArea *psLinuxMemArea); * @brief * * @param psLinuxMemArea - * @param ui32ByteOffset + * @param uByteOffset * * @return ******************************************************************************/ -IMG_CPU_PHYADDR LinuxMemAreaToCpuPAddr(LinuxMemArea *psLinuxMemArea, IMG_UINT32 ui32ByteOffset); +IMG_CPU_PHYADDR LinuxMemAreaToCpuPAddr(LinuxMemArea *psLinuxMemArea, IMG_UINTPTR_T uByteOffset); -#define LinuxMemAreaToCpuPFN(psLinuxMemArea, ui32ByteOffset) PHYS_TO_PFN(LinuxMemAreaToCpuPAddr(psLinuxMemArea, ui32ByteOffset).uiAddr) +#define LinuxMemAreaToCpuPFN(psLinuxMemArea, uByteOffset) PHYS_TO_PFN(LinuxMemAreaToCpuPAddr(psLinuxMemArea, uByteOffset).uiAddr) /*! ******************************************************************************* diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mmap.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mmap.c index e1a0c21..a0b8211 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mmap.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mmap.c @@ -69,6 +69,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <drm/drmP.h> #endif +#ifdef CONFIG_ARCH_OMAP5 +#ifdef CONFIG_DSSCOMP +#include <../drivers/staging/omapdrm/omap_dmm_tiler.h> +#endif +#endif + #include "services_headers.h" #include "pvrmmap.h" @@ -85,7 +91,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "pvr_drm.h" #endif -#if !defined(PVR_SECURE_HANDLES) && !defined (SUPPORT_SID_INTERFACE) +#if !defined(PVR_SECURE_HANDLES) #error "The mmap code requires PVR_SECURE_HANDLES" #endif @@ -108,12 +114,12 @@ static LIST_HEAD(g_sMMapAreaList); static LIST_HEAD(g_sMMapOffsetStructList); #if defined(DEBUG_LINUX_MMAP_AREAS) static IMG_UINT32 g_ui32RegisteredAreas = 0; -static IMG_UINT32 g_ui32TotalByteSize = 0; +static IMG_SIZE_T g_uiTotalByteSize = 0; #endif #if defined(DEBUG_LINUX_MMAP_AREAS) -static struct proc_dir_entry *g_ProcMMap; +static struct pvr_proc_dir_entry *g_ProcMMap; #endif /* defined(DEBUG_LINUX_MMAP_AREAS) */ #if !defined(PVR_MAKE_ALL_PFNS_SPECIAL) @@ -201,14 +207,10 @@ MMapOffsetToHandle(IMG_UINT32 pfn) } #endif -static inline IMG_UINT32 -#if defined (SUPPORT_SID_INTERFACE) -HandleToMMapOffset(IMG_SID hHandle) -#else +static inline IMG_UINTPTR_T HandleToMMapOffset(IMG_HANDLE hHandle) -#endif { - IMG_UINT32 ulHandle = (IMG_UINT32)hHandle; + IMG_UINTPTR_T ulHandle = (IMG_UINTPTR_T)hHandle; #if !defined(PVR_MAKE_ALL_PFNS_SPECIAL) if (PFNIsSpecial(ulHandle)) @@ -255,7 +257,7 @@ GetCurrentThreadID(IMG_VOID) * mmap data. */ static PKV_OFFSET_STRUCT -CreateOffsetStruct(LinuxMemArea *psLinuxMemArea, IMG_UINT32 ui32Offset, IMG_UINT32 ui32RealByteSize) +CreateOffsetStruct(LinuxMemArea *psLinuxMemArea, IMG_UINTPTR_T uiOffset, IMG_SIZE_T uiRealByteSize) { PKV_OFFSET_STRUCT psOffsetStruct; #if defined(DEBUG) || defined(DEBUG_LINUX_MMAP_AREAS) @@ -279,11 +281,11 @@ CreateOffsetStruct(LinuxMemArea *psLinuxMemArea, IMG_UINT32 ui32Offset, IMG_UINT return IMG_NULL; } - psOffsetStruct->ui32MMapOffset = ui32Offset; + psOffsetStruct->uiMMapOffset = uiOffset; psOffsetStruct->psLinuxMemArea = psLinuxMemArea; - psOffsetStruct->ui32RealByteSize = ui32RealByteSize; + psOffsetStruct->uiRealByteSize = uiRealByteSize; /* * We store the TID in case two threads within a process @@ -327,7 +329,8 @@ DestroyOffsetStruct(PKV_OFFSET_STRUCT psOffsetStruct) #ifdef DEBUG PVR_DPF((PVR_DBG_MESSAGE, "%s: Table entry: " - "psLinuxMemArea=%p, CpuPAddr=0x%08X", __FUNCTION__, + "psLinuxMemArea=%p, CpuPAddr=0x" CPUPADDR_FMT, + __FUNCTION__, psOffsetStruct->psLinuxMemArea, CpuPAddr.uiAddr)); #endif @@ -349,18 +352,18 @@ DestroyOffsetStruct(PKV_OFFSET_STRUCT psOffsetStruct) */ static inline IMG_VOID DetermineUsersSizeAndByteOffset(LinuxMemArea *psLinuxMemArea, - IMG_UINT32 *pui32RealByteSize, - IMG_UINT32 *pui32ByteOffset) + IMG_SIZE_T *puiRealByteSize, + IMG_UINTPTR_T *puiByteOffset) { - IMG_UINT32 ui32PageAlignmentOffset; + IMG_UINTPTR_T uiPageAlignmentOffset; IMG_CPU_PHYADDR CpuPAddr; CpuPAddr = LinuxMemAreaToCpuPAddr(psLinuxMemArea, 0); - ui32PageAlignmentOffset = ADDR_TO_PAGE_OFFSET(CpuPAddr.uiAddr); + uiPageAlignmentOffset = ADDR_TO_PAGE_OFFSET(CpuPAddr.uiAddr); - *pui32ByteOffset = ui32PageAlignmentOffset; + *puiByteOffset = uiPageAlignmentOffset; - *pui32RealByteSize = PAGE_ALIGN(psLinuxMemArea->ui32ByteSize + ui32PageAlignmentOffset); + *puiRealByteSize = PAGE_ALIGN(psLinuxMemArea->uiByteSize + uiPageAlignmentOffset); } @@ -376,16 +379,16 @@ DetermineUsersSizeAndByteOffset(LinuxMemArea *psLinuxMemArea, @input psPerProc : Per-process data. @input hMHandle : Memory handle. - @input pui32MMapOffset : pointer to location for returned mmap offset. - @input pui32ByteOffset : pointer to location for returned byte offset. - @input pui32RealByteSize : pointer to location for returned real byte size. - @input pui32UserVaddr : pointer to location for returned user mode address. + @input puiMMapOffset : pointer to location for returned mmap offset. + @input puiByteOffset : pointer to location for returned byte offset. + @input puiRealByteSize : pointer to location for returned real byte size. + @input puiUserVaddr : pointer to location for returned user mode address. - @output pui32MMapOffset : points to mmap offset to be used in mmap2 sys call. - @output pui32ByteOffset : points to byte offset of start of memory + @output puiMMapOffset : points to mmap offset to be used in mmap2 sys call. + @output puiByteOffset : points to byte offset of start of memory within mapped area returned by mmap2. - @output pui32RealByteSize : points to size of area to be mapped. - @output pui32UserVAddr : points to user mode address of start of + @output puiRealByteSize : points to size of area to be mapped. + @output puiUserVAddr : points to user mode address of start of mapping, or 0 if it hasn't been mapped yet. @Return PVRSRV_ERROR : PVRSRV_OK, or error code. @@ -393,15 +396,11 @@ DetermineUsersSizeAndByteOffset(LinuxMemArea *psLinuxMemArea, ******************************************************************************/ PVRSRV_ERROR PVRMMapOSMemHandleToMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hMHandle, -#else IMG_HANDLE hMHandle, -#endif - IMG_UINT32 *pui32MMapOffset, - IMG_UINT32 *pui32ByteOffset, - IMG_UINT32 *pui32RealByteSize, - IMG_UINT32 *pui32UserVAddr) + IMG_UINTPTR_T *puiMMapOffset, + IMG_UINTPTR_T *puiByteOffset, + IMG_SIZE_T *puiRealByteSize, + IMG_UINTPTR_T *puiUserVAddr) { LinuxMemArea *psLinuxMemArea; PKV_OFFSET_STRUCT psOffsetStruct; @@ -415,42 +414,25 @@ PVRMMapOSMemHandleToMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, eError = PVRSRVLookupOSMemHandle(psPerProc->psHandleBase, &hOSMemHandle, hMHandle); if (eError != PVRSRV_OK) { -#if defined (SUPPORT_SID_INTERFACE) - PVR_DPF((PVR_DBG_ERROR, "%s: Lookup of handle %x failed", __FUNCTION__, hMHandle)); -#else PVR_DPF((PVR_DBG_ERROR, "%s: Lookup of handle %p failed", __FUNCTION__, hMHandle)); -#endif goto exit_unlock; } psLinuxMemArea = (LinuxMemArea *)hOSMemHandle; - if (psLinuxMemArea && (psLinuxMemArea->eAreaType == LINUX_MEM_AREA_ION)) - { - *pui32RealByteSize = psLinuxMemArea->ui32ByteSize; - *pui32ByteOffset = psLinuxMemArea->uData.sIONTilerAlloc.planeOffsets[0]; - /* The offsets for the subsequent planes must be co-aligned for user - * space mapping and sgx 544 and later. I.e. - * psLinuxMemArea->uData.sIONTilerAlloc.planeOffsets[n]; - */ - } - else - { - /* Sparse mappings have to ask the BM for the virtual size */ if (psLinuxMemArea->hBMHandle) { - *pui32RealByteSize = BM_GetVirtualSize(psLinuxMemArea->hBMHandle); - *pui32ByteOffset = 0; + *puiRealByteSize = BM_GetVirtualSize(psLinuxMemArea->hBMHandle); + *puiByteOffset = 0; } else { DetermineUsersSizeAndByteOffset(psLinuxMemArea, - pui32RealByteSize, - pui32ByteOffset); + puiRealByteSize, + puiByteOffset); } - } /* Check whether this memory area has already been mapped */ list_for_each_entry(psOffsetStruct, &psLinuxMemArea->sMMapOffsetStructList, sAreaItem) @@ -459,7 +441,7 @@ PVRMMapOSMemHandleToMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, { if (!psLinuxMemArea->hBMHandle) { - PVR_ASSERT(*pui32RealByteSize == psOffsetStruct->ui32RealByteSize); + PVR_ASSERT(*puiRealByteSize == psOffsetStruct->uiRealByteSize); } /* * User mode locking is required to stop two threads racing to @@ -469,8 +451,8 @@ PVRMMapOSMemHandleToMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, * Without locking, both threads may attempt the mmap, * and one of them will fail. */ - *pui32MMapOffset = psOffsetStruct->ui32MMapOffset; - *pui32UserVAddr = psOffsetStruct->ui32UserVAddr; + *puiMMapOffset = psOffsetStruct->uiMMapOffset; + *puiUserVAddr = psOffsetStruct->uiUserVAddr; PVRSRVOffsetStructIncRef(psOffsetStruct); eError = PVRSRV_OK; @@ -479,24 +461,24 @@ PVRMMapOSMemHandleToMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, } /* Memory area won't have been mapped yet */ - *pui32UserVAddr = 0; + *puiUserVAddr = 0; #if !defined(PVR_MAKE_ALL_PFNS_SPECIAL) if (LinuxMemAreaUsesPhysicalMap(psLinuxMemArea)) { - *pui32MMapOffset = LinuxMemAreaToCpuPFN(psLinuxMemArea, 0); - PVR_ASSERT(PFNIsPhysical(*pui32MMapOffset)); + *puiMMapOffset = LinuxMemAreaToCpuPFN(psLinuxMemArea, 0); + PVR_ASSERT(PFNIsPhysical(*puiMMapOffset)); } else #endif { - *pui32MMapOffset = HandleToMMapOffset(hMHandle); + *puiMMapOffset = HandleToMMapOffset(hMHandle); #if !defined(PVR_MAKE_ALL_PFNS_SPECIAL) - PVR_ASSERT(PFNIsSpecial(*pui32MMapOffset)); + PVR_ASSERT(PFNIsSpecial(*puiMMapOffset)); #endif } - psOffsetStruct = CreateOffsetStruct(psLinuxMemArea, *pui32MMapOffset, *pui32RealByteSize); + psOffsetStruct = CreateOffsetStruct(psLinuxMemArea, *puiMMapOffset, *puiRealByteSize); if (psOffsetStruct == IMG_NULL) { eError = PVRSRV_ERROR_OUT_OF_MEMORY; @@ -519,7 +501,7 @@ PVRMMapOSMemHandleToMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, is done in the mmap2() syscall, as it expects the pgoff argument to be in units of 4,096 bytes irrespective of page size */ - *pui32MMapOffset = *pui32MMapOffset << (PAGE_SHIFT - 12); + *puiMMapOffset = *puiMMapOffset << (PAGE_SHIFT - 12); exit_unlock: LinuxUnLockMutex(&g_sMMapMutex); @@ -540,26 +522,22 @@ exit_unlock: @input psPerProc : Per-process data. @input hMHandle : Memory handle. @input pbMUnmap : pointer to location for munmap flag. - @input pui32UserVAddr : pointer to location for user mode address of mapping. - @input pui32ByteSize : pointer to location for size of mapping. + @input puiUserVAddr : pointer to location for user mode address of mapping. + @input puiByteSize : pointer to location for size of mapping. @Output pbMUnmap : points to flag that indicates whether an munmap is required. - @output pui32UserVAddr : points to user mode address to munmap. + @output puiUserVAddr : points to user mode address to munmap. @Return PVRSRV_ERROR : PVRSRV_OK, or error code. ******************************************************************************/ PVRSRV_ERROR PVRMMapReleaseMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hMHandle, -#else IMG_HANDLE hMHandle, -#endif IMG_BOOL *pbMUnmap, - IMG_UINT32 *pui32RealByteSize, - IMG_UINT32 *pui32UserVAddr) + IMG_SIZE_T *puiRealByteSize, + IMG_UINTPTR_T *puiUserVAddr) { LinuxMemArea *psLinuxMemArea; PKV_OFFSET_STRUCT psOffsetStruct; @@ -574,11 +552,7 @@ PVRMMapReleaseMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, eError = PVRSRVLookupOSMemHandle(psPerProc->psHandleBase, &hOSMemHandle, hMHandle); if (eError != PVRSRV_OK) { -#if defined (SUPPORT_SID_INTERFACE) - PVR_DPF((PVR_DBG_ERROR, "%s: Lookup of handle %x failed", __FUNCTION__, hMHandle)); -#else PVR_DPF((PVR_DBG_ERROR, "%s: Lookup of handle %p failed", __FUNCTION__, hMHandle)); -#endif goto exit_unlock; } @@ -599,10 +573,10 @@ PVRMMapReleaseMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, PVRSRVOffsetStructDecRef(psOffsetStruct); - *pbMUnmap = (IMG_BOOL)((psOffsetStruct->ui32RefCount == 0) && (psOffsetStruct->ui32UserVAddr != 0)); + *pbMUnmap = (IMG_BOOL)((psOffsetStruct->ui32RefCount == 0) && (psOffsetStruct->uiUserVAddr != 0)); - *pui32UserVAddr = (*pbMUnmap) ? psOffsetStruct->ui32UserVAddr : 0; - *pui32RealByteSize = (*pbMUnmap) ? psOffsetStruct->ui32RealByteSize : 0; + *puiUserVAddr = (*pbMUnmap) ? psOffsetStruct->uiUserVAddr : 0; + *puiRealByteSize = (*pbMUnmap) ? psOffsetStruct->uiRealByteSize : 0; eError = PVRSRV_OK; goto exit_unlock; @@ -610,11 +584,7 @@ PVRMMapReleaseMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, } /* MMap data not found */ -#if defined (SUPPORT_SID_INTERFACE) - PVR_DPF((PVR_DBG_ERROR, "%s: Mapping data not found for handle %x (memory area %p)", __FUNCTION__, hMHandle, psLinuxMemArea)); -#else PVR_DPF((PVR_DBG_ERROR, "%s: Mapping data not found for handle %p (memory area %p)", __FUNCTION__, hMHandle, psLinuxMemArea)); -#endif eError = PVRSRV_ERROR_MAPPING_NOT_FOUND; @@ -625,7 +595,7 @@ exit_unlock: } static inline PKV_OFFSET_STRUCT -FindOffsetStructByOffset(IMG_UINT32 ui32Offset, IMG_UINT32 ui32RealByteSize) +FindOffsetStructByOffset(IMG_UINTPTR_T uiOffset, IMG_SIZE_T uiRealByteSize) { PKV_OFFSET_STRUCT psOffsetStruct; #if !defined(PVR_MAKE_ALL_PFNS_SPECIAL) @@ -635,7 +605,7 @@ FindOffsetStructByOffset(IMG_UINT32 ui32Offset, IMG_UINT32 ui32RealByteSize) list_for_each_entry(psOffsetStruct, &g_sMMapOffsetStructList, sMMapItem) { - if (ui32Offset == psOffsetStruct->ui32MMapOffset && ui32RealByteSize == psOffsetStruct->ui32RealByteSize && psOffsetStruct->ui32PID == ui32PID) + if (uiOffset == psOffsetStruct->uiMMapOffset && uiRealByteSize == psOffsetStruct->uiRealByteSize && psOffsetStruct->ui32PID == ui32PID) { #if !defined(PVR_MAKE_ALL_PFNS_SPECIAL) /* @@ -643,7 +613,7 @@ FindOffsetStructByOffset(IMG_UINT32 ui32Offset, IMG_UINT32 ui32RealByteSize) * as different threads may be mapping different memory areas * with the same offset. */ - if (!PFNIsPhysical(ui32Offset) || psOffsetStruct->ui32TID == ui32TID) + if (!PFNIsPhysical(uiOffset) || psOffsetStruct->ui32TID == ui32TID) #endif { return psOffsetStruct; @@ -663,11 +633,11 @@ FindOffsetStructByOffset(IMG_UINT32 ui32Offset, IMG_UINT32 ui32RealByteSize) static IMG_BOOL DoMapToUser(LinuxMemArea *psLinuxMemArea, struct vm_area_struct* ps_vma, - IMG_UINT32 ui32ByteOffset) + IMG_UINTPTR_T uiByteOffset) { - IMG_UINT32 ui32ByteSize; + IMG_SIZE_T uiByteSize; - if ((psLinuxMemArea->hBMHandle) && (ui32ByteOffset != 0)) + if ((psLinuxMemArea->hBMHandle) && (uiByteOffset != 0)) { /* Partial mapping of sparse allocations should never happen */ return IMG_FALSE; @@ -677,15 +647,15 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, { return DoMapToUser(LinuxMemAreaRoot(psLinuxMemArea), /* PRQA S 3670 */ /* allow recursion */ ps_vma, - psLinuxMemArea->uData.sSubAlloc.ui32ByteOffset + ui32ByteOffset); + psLinuxMemArea->uData.sSubAlloc.uiByteOffset + uiByteOffset); } /* * Note that ui32ByteSize may be larger than the size of the memory * area being mapped, as the former is a multiple of the page size. */ - ui32ByteSize = ps_vma->vm_end - ps_vma->vm_start; - PVR_ASSERT(ADDR_TO_PAGE_OFFSET(ui32ByteSize) == 0); + uiByteSize = ps_vma->vm_end - ps_vma->vm_start; + PVR_ASSERT(ADDR_TO_PAGE_OFFSET(uiByteSize) == 0); #if defined (__sparc__) /* @@ -700,10 +670,10 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, #if !defined(PVR_MAKE_ALL_PFNS_SPECIAL) if (PFNIsPhysical(ps_vma->vm_pgoff)) { - IMG_INT result; + IMG_INT result; - PVR_ASSERT(LinuxMemAreaPhysIsContig(psLinuxMemArea)); - PVR_ASSERT(LinuxMemAreaToCpuPFN(psLinuxMemArea, ui32ByteOffset) == ps_vma->vm_pgoff); + PVR_ASSERT(LinuxMemAreaPhysIsContig(psLinuxMemArea)); + PVR_ASSERT(LinuxMemAreaToCpuPFN(psLinuxMemArea, uiByteOffset) == ps_vma->vm_pgoff); /* * Since the memory is contiguous, we can map the whole range in one * go . @@ -711,7 +681,7 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, PVR_ASSERT(psLinuxMemArea->hBMHandle == IMG_NULL); - result = IO_REMAP_PFN_RANGE(ps_vma, ps_vma->vm_start, ps_vma->vm_pgoff, ui32ByteSize, ps_vma->vm_page_prot); + result = IO_REMAP_PFN_RANGE(ps_vma, ps_vma->vm_start, ps_vma->vm_pgoff, uiByteSize, ps_vma->vm_page_prot); if(result == 0) { @@ -723,7 +693,7 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, #endif { - /* + /* * Memory may be non-contiguous, so we map the range page, * by page. Since VM_PFNMAP mappings are assumed to be physically * contiguous, we can't legally use REMAP_PFN_RANGE (that is, we @@ -733,22 +703,22 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, * finding the page structure corresponding to each page, or * if mixed maps are supported (VM_MIXEDMAP), vm_insert_mixed. */ - IMG_UINT32 ulVMAPos; - IMG_UINT32 ui32ByteEnd = ui32ByteOffset + ui32ByteSize; - IMG_UINT32 ui32PA; - IMG_UINT32 ui32AdjustedPA = ui32ByteOffset; + IMG_UINTPTR_T ulVMAPos; + IMG_UINTPTR_T uiByteEnd = uiByteOffset + uiByteSize; + IMG_UINTPTR_T uiPA; + IMG_UINTPTR_T uiAdjustedPA = uiByteOffset; #if defined(PVR_MAKE_ALL_PFNS_SPECIAL) - IMG_BOOL bMixedMap = IMG_FALSE; + IMG_BOOL bMixedMap = IMG_FALSE; #endif /* First pass, validate the page frame numbers */ - for(ui32PA = ui32ByteOffset; ui32PA < ui32ByteEnd; ui32PA += PAGE_SIZE) + for(uiPA = uiByteOffset; uiPA < uiByteEnd; uiPA += PAGE_SIZE) { - IMG_UINT32 pfn; + IMG_UINTPTR_T pfn; IMG_BOOL bMapPage = IMG_TRUE; if (psLinuxMemArea->hBMHandle) { - if (!BM_MapPageAtOffset(psLinuxMemArea->hBMHandle, ui32PA)) + if (!BM_MapPageAtOffset(psLinuxMemArea->hBMHandle, uiPA)) { bMapPage = IMG_FALSE; } @@ -756,39 +726,45 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, if (bMapPage) { - pfn = LinuxMemAreaToCpuPFN(psLinuxMemArea, ui32AdjustedPA); + pfn = LinuxMemAreaToCpuPFN(psLinuxMemArea, uiAdjustedPA); if (!pfn_valid(pfn)) { #if !defined(PVR_MAKE_ALL_PFNS_SPECIAL) - PVR_DPF((PVR_DBG_ERROR,"%s: Error - PFN invalid: 0x%x", __FUNCTION__, pfn)); + PVR_DPF((PVR_DBG_ERROR,"%s: Error - PFN invalid: 0x" UINTPTR_FMT, __FUNCTION__, pfn)); return IMG_FALSE; #else bMixedMap = IMG_TRUE; #endif } - ui32AdjustedPA += PAGE_SIZE; + else if (0 == page_count(pfn_to_page(pfn))) + { +#if defined(PVR_MAKE_ALL_PFNS_SPECIAL) + bMixedMap = IMG_TRUE; +#endif + } + uiAdjustedPA += PAGE_SIZE; } } #if defined(PVR_MAKE_ALL_PFNS_SPECIAL) - if (bMixedMap) - { - ps_vma->vm_flags |= VM_MIXEDMAP; - } + if (bMixedMap) + { + ps_vma->vm_flags |= VM_MIXEDMAP; + } #endif /* Second pass, get the page structures and insert the pages */ ulVMAPos = ps_vma->vm_start; - ui32AdjustedPA = ui32ByteOffset; - for(ui32PA = ui32ByteOffset; ui32PA < ui32ByteEnd; ui32PA += PAGE_SIZE) + uiAdjustedPA = uiByteOffset; + for(uiPA = uiByteOffset; uiPA < uiByteEnd; uiPA += PAGE_SIZE) { - IMG_UINT32 pfn; + IMG_UINTPTR_T pfn; IMG_INT result; IMG_BOOL bMapPage = IMG_TRUE; if (psLinuxMemArea->hBMHandle) { /* We have a sparse allocation, check if this page should be mapped */ - if (!BM_MapPageAtOffset(psLinuxMemArea->hBMHandle, ui32PA)) + if (!BM_MapPageAtOffset(psLinuxMemArea->hBMHandle, uiPA)) { bMapPage = IMG_FALSE; } @@ -796,7 +772,7 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, if (bMapPage) { - pfn = LinuxMemAreaToCpuPFN(psLinuxMemArea, ui32AdjustedPA); + pfn = LinuxMemAreaToCpuPFN(psLinuxMemArea, uiAdjustedPA); #if defined(PVR_MAKE_ALL_PFNS_SPECIAL) if (bMixedMap) @@ -811,7 +787,7 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, else #endif { - struct page *psPage; + struct page *psPage; PVR_ASSERT(pfn_valid(pfn)); @@ -824,11 +800,11 @@ DoMapToUser(LinuxMemArea *psLinuxMemArea, return IMG_FALSE; } } - ui32AdjustedPA += PAGE_SIZE; + uiAdjustedPA += PAGE_SIZE; + } + ulVMAPos += PAGE_SIZE; } - ulVMAPos += PAGE_SIZE; - } - } + } return IMG_TRUE; } @@ -853,11 +829,11 @@ MMapVOpenNoLock(struct vm_area_struct* ps_vma) #if defined(DEBUG_LINUX_MMAP_AREAS) PVR_DPF((PVR_DBG_MESSAGE, - "%s: psLinuxMemArea 0x%p, KVAddress 0x%p MMapOffset %d, ui32Mapped %d", + "%s: psLinuxMemArea 0x%p, KVAddress 0x%p MMapOffset " UINTPTR_FMT ", ui32Mapped %d", __FUNCTION__, psOffsetStruct->psLinuxMemArea, LinuxMemAreaToCpuVAddr(psOffsetStruct->psLinuxMemArea), - psOffsetStruct->ui32MMapOffset, + psOffsetStruct->uiMMapOffset, psOffsetStruct->ui32Mapped)); #endif } @@ -885,11 +861,11 @@ MMapVCloseNoLock(struct vm_area_struct* ps_vma) #if defined(DEBUG_LINUX_MMAP_AREAS) PVR_DPF((PVR_DBG_MESSAGE, - "%s: psLinuxMemArea %p, CpuVAddr %p ui32MMapOffset %d, ui32Mapped %d", + "%s: psLinuxMemArea %p, CpuVAddr %p uiMMapOffset " UINTPTR_FMT ", ui32Mapped %d", __FUNCTION__, psOffsetStruct->psLinuxMemArea, LinuxMemAreaToCpuVAddr(psOffsetStruct->psLinuxMemArea), - psOffsetStruct->ui32MMapOffset, + psOffsetStruct->uiMMapOffset, psOffsetStruct->ui32Mapped)); #endif @@ -899,7 +875,13 @@ MMapVCloseNoLock(struct vm_area_struct* ps_vma) { if (psOffsetStruct->ui32RefCount != 0) { - PVR_DPF((PVR_DBG_MESSAGE, "%s: psOffsetStruct %p has non-zero reference count (ui32RefCount = %u). User mode address of start of mapping: 0x%x", __FUNCTION__, psOffsetStruct, psOffsetStruct->ui32RefCount, psOffsetStruct->ui32UserVAddr)); + PVR_DPF(( + PVR_DBG_MESSAGE, + "%s: psOffsetStruct %p has non-zero reference count (ui32RefCount = %u). User mode address of start of mapping: 0x" UINTPTR_FMT, + __FUNCTION__, + psOffsetStruct, + psOffsetStruct->ui32RefCount, + psOffsetStruct->uiUserVAddr)); } DestroyOffsetStruct(psOffsetStruct); @@ -942,7 +924,7 @@ static int MMapVAccess(struct vm_area_struct *ps_vma, unsigned long addr, psLinuxMemArea = psOffsetStruct->psLinuxMemArea; ulOffset = addr - ps_vma->vm_start; - if (ulOffset+len > psLinuxMemArea->ui32ByteSize) + if (ulOffset+len > psLinuxMemArea->uiByteSize) /* Out of range. We shouldn't get here, because the kernel will do the necessary checks before calling access_process_vm. */ goto exit_unlock; @@ -956,7 +938,7 @@ static int MMapVAccess(struct vm_area_struct *ps_vma, unsigned long addr, } else { - IMG_UINT32 pfn, ui32OffsetInPage; + IMG_UINTPTR_T pfn, uiOffsetInPage; struct page *page; pfn = LinuxMemAreaToCpuPFN(psLinuxMemArea, ulOffset); @@ -965,14 +947,14 @@ static int MMapVAccess(struct vm_area_struct *ps_vma, unsigned long addr, goto exit_unlock; page = pfn_to_page(pfn); - ui32OffsetInPage = ADDR_TO_PAGE_OFFSET(ulOffset); + uiOffsetInPage = ADDR_TO_PAGE_OFFSET(ulOffset); - if (ui32OffsetInPage+len > PAGE_SIZE) + if (uiOffsetInPage + len > PAGE_SIZE) /* The region crosses a page boundary */ goto exit_unlock; pvKernelAddr = kmap(page); - memcpy(buf, pvKernelAddr+ui32OffsetInPage, len); + memcpy(buf, pvKernelAddr + uiOffsetInPage, len); kunmap(page); iRetVal = len; @@ -1014,34 +996,35 @@ PVRMMap(struct file* pFile, struct vm_area_struct* ps_vma) { LinuxMemArea *psFlushMemArea = IMG_NULL; PKV_OFFSET_STRUCT psOffsetStruct; - IMG_UINT32 ui32ByteSize; + IMG_SIZE_T uiByteSize; IMG_VOID *pvBase = IMG_NULL; int iRetVal = 0; - IMG_UINT32 ui32ByteOffset = 0; /* Keep compiler happy */ - IMG_UINT32 ui32FlushSize = 0; + IMG_UINTPTR_T uiByteOffset = 0; /* Keep compiler happy */ + IMG_SIZE_T uiFlushSize = 0; PVR_UNREFERENCED_PARAMETER(pFile); LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); - ui32ByteSize = ps_vma->vm_end - ps_vma->vm_start; + uiByteSize = ps_vma->vm_end - ps_vma->vm_start; - PVR_DPF((PVR_DBG_MESSAGE, "%s: Received mmap(2) request with ui32MMapOffset 0x%08lx," - " and ui32ByteSize %d(0x%08x)", + PVR_DPF((PVR_DBG_MESSAGE, "%s: Received mmap(2) request with ui32MMapOffset 0x" UINTPTR_FMT "," + " and uiByteSize %" SIZE_T_FMT_LEN "u(0x%" SIZE_T_FMT_LEN "x)", __FUNCTION__, ps_vma->vm_pgoff, - ui32ByteSize, ui32ByteSize)); + uiByteSize, + uiByteSize)); - psOffsetStruct = FindOffsetStructByOffset(ps_vma->vm_pgoff, ui32ByteSize); + psOffsetStruct = FindOffsetStructByOffset(ps_vma->vm_pgoff, uiByteSize); if (psOffsetStruct == IMG_NULL) { #if defined(SUPPORT_DRI_DRM) - LinuxUnLockMutex(&g_sMMapMutex); + LinuxUnLockMutex(&g_sMMapMutex); #if !defined(SUPPORT_DRI_DRM_EXT) - /* Pass unknown requests onto the DRM module */ - return drm_mmap(pFile, ps_vma); + /* Pass unknown requests onto the DRM module */ + return drm_mmap(pFile, ps_vma); #else /* * Indicate to caller that the request is not for us. @@ -1077,8 +1060,11 @@ PVRMMap(struct file* pFile, struct vm_area_struct* ps_vma) PVR_DPF((PVR_DBG_MESSAGE, "%s: Mapped psLinuxMemArea 0x%p\n", __FUNCTION__, psOffsetStruct->psLinuxMemArea)); -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)) + /* This is probably superfluous and implied by VM_IO */ ps_vma->vm_flags |= VM_RESERVED; +#else + ps_vma->vm_flags |= VM_DONTDUMP; #endif ps_vma->vm_flags |= VM_IO; @@ -1110,16 +1096,22 @@ PVRMMap(struct file* pFile, struct vm_area_struct* ps_vma) goto unlock_and_return; } -#if defined(SGX544) && defined(SGX_FEATURE_MP) - /* In OMAP5, the A15 no longer masks an issue with the interconnect. - writecombined access to the Tiler 2D memory will encounter errors due to - interconect bus accesses. This will result in a SIGBUS error with a - "non-line fetch abort". The workaround is to use a shared device - access. */ - if (psOffsetStruct->psLinuxMemArea->eAreaType == LINUX_MEM_AREA_ION) - ps_vma->vm_page_prot = __pgprot_modify(ps_vma->vm_page_prot, - L_PTE_MT_MASK, L_PTE_MT_DEV_SHARED); -#endif +#ifdef CONFIG_ARCH_OMAP5 + { + IMG_BOOL bModPageProt = IMG_FALSE; + +#ifdef CONFIG_DSSCOMP + bModPageProt |= is_tiler_addr(LinuxMemAreaToCpuPAddr(psOffsetStruct->psLinuxMemArea, 0).uiAddr); +#endif /* CONFIG_DSSCOMP */ + + if (bModPageProt) + { + ps_vma->vm_page_prot = __pgprot_modify(ps_vma->vm_page_prot, + L_PTE_MT_MASK, + L_PTE_MT_DEV_SHARED); + } + } +#endif /* CONFIG_ARCH_OMAP5 */ /* Install open and close handlers for ref-counting */ ps_vma->vm_ops = &MMapIOOps; @@ -1130,13 +1122,9 @@ PVRMMap(struct file* pFile, struct vm_area_struct* ps_vma) goto unlock_and_return; } - PVR_ASSERT(psOffsetStruct->ui32UserVAddr == 0); + PVR_ASSERT(psOffsetStruct->uiUserVAddr == 0); - psOffsetStruct->ui32UserVAddr = ps_vma->vm_start; - - /* Invalidate for the ION memory is performed during the mapping */ - if(psOffsetStruct->psLinuxMemArea->eAreaType == LINUX_MEM_AREA_ION) - psOffsetStruct->psLinuxMemArea->bNeedsCacheInvalidate = IMG_FALSE; + psOffsetStruct->uiUserVAddr = ps_vma->vm_start; /* Compute the flush region (if necessary) inside the mmap mutex */ if(psOffsetStruct->psLinuxMemArea->bNeedsCacheInvalidate) @@ -1147,19 +1135,19 @@ PVRMMap(struct file* pFile, struct vm_area_struct* ps_vma) if (psFlushMemArea->hBMHandle) { pvBase = (IMG_VOID *)ps_vma->vm_start; - ui32ByteOffset = 0; - ui32FlushSize = BM_GetVirtualSize(psFlushMemArea->hBMHandle); + uiByteOffset = 0; + uiFlushSize = BM_GetVirtualSize(psFlushMemArea->hBMHandle); } else { - IMG_UINT32 ui32DummyByteSize; + IMG_SIZE_T uiDummyByteSize; DetermineUsersSizeAndByteOffset(psFlushMemArea, - &ui32DummyByteSize, - &ui32ByteOffset); + &uiDummyByteSize, + &uiByteOffset); - pvBase = (IMG_VOID *)ps_vma->vm_start + ui32ByteOffset; - ui32FlushSize = psFlushMemArea->ui32ByteSize; + pvBase = (IMG_VOID *)ps_vma->vm_start + uiByteOffset; + uiFlushSize = psFlushMemArea->uiByteSize; } psFlushMemArea->bNeedsCacheInvalidate = IMG_FALSE; @@ -1168,8 +1156,8 @@ PVRMMap(struct file* pFile, struct vm_area_struct* ps_vma) /* Call the open routine to increment the usage count */ MMapVOpenNoLock(ps_vma); - PVR_DPF((PVR_DBG_MESSAGE, "%s: Mapped area at offset 0x%08lx\n", - __FUNCTION__, ps_vma->vm_pgoff)); + PVR_DPF((PVR_DBG_MESSAGE, "%s: Mapped area at offset 0x" UINTPTR_FMT "\n", + __FUNCTION__, (IMG_UINTPTR_T)ps_vma->vm_pgoff)); unlock_and_return: if (iRetVal != 0 && psOffsetStruct != IMG_NULL) @@ -1181,8 +1169,8 @@ unlock_and_return: if(psFlushMemArea) { - OSInvalidateCPUCacheRangeKM(psFlushMemArea, ui32ByteOffset, pvBase, - ui32FlushSize); + OSInvalidateCPUCacheRangeKM(psFlushMemArea, uiByteOffset, pvBase, + uiFlushSize); } return iRetVal; @@ -1260,7 +1248,6 @@ static void* ProcSeqNextMMapRegistrations(struct seq_file *sfile,void* el,loff_t return ProcSeqOff2ElementMMapRegistrations(sfile,off); } - /* * Show MMap element (called when reading /proc/mmap file) @@ -1272,15 +1259,15 @@ static void ProcSeqShowMMapRegistrations(struct seq_file *sfile, void *el) { KV_OFFSET_STRUCT *psOffsetStruct = (KV_OFFSET_STRUCT*)el; LinuxMemArea *psLinuxMemArea; - IMG_UINT32 ui32RealByteSize; - IMG_UINT32 ui32ByteOffset; + IMG_SIZE_T uiRealByteSize; + IMG_UINTPTR_T uiByteOffset; if(el == PVR_PROC_SEQ_START_TOKEN) { seq_printf( sfile, #if !defined(DEBUG_LINUX_XML_PROC_FILES) "Allocations registered for mmap: %u\n" - "In total these areas correspond to %u bytes\n" + "In total these areas correspond to %" SIZE_T_FMT_LEN "u bytes\n" "psLinuxMemArea " "UserVAddr " "KernelVAddr " @@ -1292,11 +1279,11 @@ static void ProcSeqShowMMapRegistrations(struct seq_file *sfile, void *el) #else "<mmap_header>\n" "\t<count>%u</count>\n" - "\t<bytes>%u</bytes>\n" + "\t<bytes>%" SIZE_T_FMT_LEN "u</bytes>\n" "</mmap_header>\n", #endif g_ui32RegisteredAreas, - g_ui32TotalByteSize + g_uiTotalByteSize ); return; } @@ -1304,20 +1291,20 @@ static void ProcSeqShowMMapRegistrations(struct seq_file *sfile, void *el) psLinuxMemArea = psOffsetStruct->psLinuxMemArea; DetermineUsersSizeAndByteOffset(psLinuxMemArea, - &ui32RealByteSize, - &ui32ByteOffset); + &uiRealByteSize, + &uiByteOffset); seq_printf( sfile, #if !defined(DEBUG_LINUX_XML_PROC_FILES) - "%-8p %08x %-8p %08x %08x %-8d %-24s %-5u %-8s %08x(%s)\n", + "%p %p %p " CPUPADDR_FMT " " UINTPTR_FMT " %" SIZE_T_FMT_LEN "u %-24s %-5u %-8s %08x(%s)\n", #else "<mmap_record>\n" - "\t<pointer>%-8p</pointer>\n" - "\t<user_virtual>%-8x</user_virtual>\n" - "\t<kernel_virtual>%-8p</kernel_virtual>\n" - "\t<cpu_physical>%08x</cpu_physical>\n" - "\t<mmap_offset>%08x</mmap_offset>\n" - "\t<bytes>%-8d</bytes>\n" + "\t<pointer>%p</pointer>\n" + "\t<user_virtual>%p</user_virtual>\n" + "\t<kernel_virtual>%p</kernel_virtual>\n" + "\t<cpu_physical>" CPUPADDR_FMT "</cpu_physical>\n" + "\t<mmap_offset>" UINTPTR_FMT "</mmap_offset>\n" + "\t<bytes>%" SIZE_T_FMT_LEN "u</bytes>\n" "\t<linux_mem_area_type>%-24s</linux_mem_area_type>\n" "\t<pid>%-5u</pid>\n" "\t<name>%-8s</name>\n" @@ -1326,11 +1313,11 @@ static void ProcSeqShowMMapRegistrations(struct seq_file *sfile, void *el) "</mmap_record>\n", #endif psLinuxMemArea, - psOffsetStruct->ui32UserVAddr + ui32ByteOffset, + (IMG_PVOID)(psOffsetStruct->uiUserVAddr + uiByteOffset), LinuxMemAreaToCpuVAddr(psLinuxMemArea), LinuxMemAreaToCpuPAddr(psLinuxMemArea,0).uiAddr, - psOffsetStruct->ui32MMapOffset, - psLinuxMemArea->ui32ByteSize, + (IMG_UINTPTR_T)psOffsetStruct->uiMMapOffset, + psLinuxMemArea->uiByteSize, LinuxMemAreaTypeToString(psLinuxMemArea->eAreaType), psOffsetStruct->ui32PID, psOffsetStruct->pszName, @@ -1395,7 +1382,7 @@ PVRMMapRegisterArea(LinuxMemArea *psLinuxMemArea) */ if (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC) { - g_ui32TotalByteSize += psLinuxMemArea->ui32ByteSize; + g_uiTotalByteSize += psLinuxMemArea->uiByteSize; } #endif @@ -1466,7 +1453,7 @@ PVRMMapRemoveRegisteredArea(LinuxMemArea *psLinuxMemArea) g_ui32RegisteredAreas--; if (psLinuxMemArea->eAreaType != LINUX_MEM_AREA_SUB_ALLOC) { - g_ui32TotalByteSize -= psLinuxMemArea->ui32ByteSize; + g_uiTotalByteSize -= psLinuxMemArea->uiByteSize; } #endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mmap.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mmap.h index 7140c13..72640e3 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mmap.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mmap.h @@ -77,9 +77,9 @@ typedef struct KV_OFFSET_STRUCT_TAG * contiguous), or it may represent the secure handle associated * with the area. */ - IMG_UINT32 ui32MMapOffset; - - IMG_UINT32 ui32RealByteSize; + IMG_UINTPTR_T uiMMapOffset; + + IMG_SIZE_T uiRealByteSize; /* Memory area associated with this offset structure */ LinuxMemArea *psLinuxMemArea; @@ -107,7 +107,7 @@ typedef struct KV_OFFSET_STRUCT_TAG * User mode address of start of mapping. This is not necessarily the * first user mode address of the memory area. */ - IMG_UINT32 ui32UserVAddr; + IMG_UINTPTR_T uiUserVAddr; /* Extra entries to support proc filesystem debug info */ #if defined(DEBUG_LINUX_MMAP_AREAS) @@ -187,15 +187,11 @@ PVRSRV_ERROR PVRMMapRemoveRegisteredArea(LinuxMemArea *psLinuxMemArea); * @Return PVRSRV_ERROR ******************************************************************************/ PVRSRV_ERROR PVRMMapOSMemHandleToMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hMHandle, -#else IMG_HANDLE hMHandle, -#endif - IMG_UINT32 *pui32MMapOffset, - IMG_UINT32 *pui32ByteOffset, - IMG_UINT32 *pui32RealByteSize, - IMG_UINT32 *pui32UserVAddr); + IMG_UINTPTR_T *puiMMapOffset, + IMG_UINTPTR_T *puiByteOffset, + IMG_SIZE_T *puiRealByteSize, + IMG_UINTPTR_T *puiUserVAddr); /*! ******************************************************************************* @@ -214,14 +210,10 @@ PVRSRV_ERROR PVRMMapOSMemHandleToMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, ******************************************************************************/ PVRSRV_ERROR PVRMMapReleaseMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hMHandle, -#else IMG_HANDLE hMHandle, -#endif IMG_BOOL *pbMUnmap, - IMG_UINT32 *pui32RealByteSize, - IMG_UINT32 *pui32UserVAddr); + IMG_SIZE_T *puiRealByteSize, + IMG_UINTPTR_T *puiUserVAddr); /*! ******************************************************************************* diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/module.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/module.c index 6d50cdb..a86de68 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/module.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/module.c @@ -83,7 +83,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> -#include <linux/proc_fs.h> #ifdef CONFIG_OF #include <linux/of.h> @@ -133,6 +132,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "lock.h" #include "linkage.h" #include "buffer_manager.h" +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) +#include "pvr_sync.h" +#endif + +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) +#include "systrace.h" +#endif #if defined(SUPPORT_DRI_DRM) #include "pvr_drm.h" @@ -164,19 +170,16 @@ module_param(gPVRDebugLevel, uint, 0644); MODULE_PARM_DESC(gPVRDebugLevel, "Sets the level of debug output (default 0x7)"); #endif /* defined(PVRSRV_NEED_PVR_DPF) */ -#if defined(CONFIG_ION_OMAP) -#include <linux/ion.h> -#include <linux/omap_ion.h> -#include "ion.h" -extern void omap_ion_register_pvr_export(void *); -extern struct ion_device *omap_ion_device; -struct ion_client *gpsIONClient; -EXPORT_SYMBOL(gpsIONClient); -#endif /* defined(CONFIG_ION_OMAP) */ +/* Newer kernels no longer support __devinitdata */ +#if !defined(__devinitdata) +#define __devinitdata +#endif +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) /* PRQA S 3207 2 */ /* ignore 'not used' warning */ EXPORT_SYMBOL(PVRGetDisplayClassJTable); EXPORT_SYMBOL(PVRGetBufferClassJTable); +#endif /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ #if defined(PVR_LDM_DEVICE_CLASS) && !defined(SUPPORT_DRI_DRM) /* @@ -260,11 +263,7 @@ MODULE_DEVICE_TABLE(pci, powervr_id_table); #endif #if defined(PVR_USE_PRE_REGISTERED_PLATFORM_DEV) -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) static struct platform_device_id powervr_id_table[] __devinitdata = { -#else -static struct platform_device_id powervr_id_table[] = { -#endif {SYS_SGX_DEV_NAME, 0}, {} }; @@ -374,17 +373,6 @@ static int __devinit PVRSRVDriverProbe(LDM_DEV *pDevice, const struct pci_device } } -#if defined(CONFIG_ION_OMAP) - gpsIONClient = ion_client_create(omap_ion_device, - "pvr"); - if (IS_ERR_OR_NULL(gpsIONClient)) - { - PVR_DPF((PVR_DBG_ERROR, "PVRSRVDriverProbe: Couldn't create ion client")); - return PTR_ERR(gpsIONClient); - } - omap_ion_register_pvr_export(&PVRSRVExportFDToIONHandles); -#endif /* defined(CONFIG_ION_OMAP) */ - return 0; } @@ -419,11 +407,6 @@ static void __devexit PVRSRVDriverRemove(LDM_DEV *pDevice) PVR_TRACE(("PVRSRVDriverRemove(pDevice=%p)", pDevice)); -#if defined(CONFIG_ION_OMAP) - ion_client_destroy(gpsIONClient); - gpsIONClient = IMG_NULL; -#endif - SysAcquireData(&psSysData); #if defined(DEBUG) && defined(PVR_MANUAL_POWER_CONTROL) @@ -725,10 +708,10 @@ void ProcSeqShowPowerLevel(struct seq_file *sfile,void* el) @Description - Release access the PVR services node - called when a file is closed, whether - at exit or using close(2) system call. + Open the PVR services node - called when the relevant device node is open()ed. @input pInode - the inode for the file being openeded + @input dev - the DRM device corresponding to this driver. @input pFile - the file handle data for the actual file being opened @@ -775,11 +758,7 @@ static int PVRSRVOpen(struct inode unref__ * pInode, struct file *pFile) if(eError != PVRSRV_OK) goto err_unlock; -#if defined (SUPPORT_SID_INTERFACE) - psPrivateData->hKernelMemInfo = 0; -#else psPrivateData->hKernelMemInfo = NULL; -#endif #if defined(SUPPORT_DRI_DRM) && defined(PVR_SECURE_DRM_AUTH_EXPORT) psPrivateData->psDRMFile = pFile; @@ -941,6 +920,8 @@ static int __init PVRCore_Init(void) struct device *psDev; #endif + + #if !defined(SUPPORT_DRI_DRM) /* * Must come before attempting to print anything via Services. @@ -976,6 +957,7 @@ static int __init PVRCore_Init(void) } LinuxBridgeInit(); + PVRMMapInit(); @@ -1070,6 +1052,13 @@ static int __init PVRCore_Init(void) #endif /* defined(PVR_LDM_DEVICE_CLASS) */ #endif /* !defined(SUPPORT_DRI_DRM) */ +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) + SystraceCreateFS(); +#endif + +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + PVRSyncDeviceInit(); +#endif return 0; #if !defined(SUPPORT_DRI_DRM) @@ -1079,6 +1068,8 @@ destroy_class: unregister_device: unregister_chrdev((IMG_UINT)AssignedMajorNumber, DEVNAME); #endif +#endif +#if !defined(SUPPORT_DRI_DRM) sys_deinit: #endif #if defined(PVR_LDM_MODULE) @@ -1111,7 +1102,6 @@ init_failed: LinuxBridgeDeInit(); PVROSFuncDeInit(); RemoveProcEntries(); - return error; } /*PVRCore_Init*/ @@ -1157,6 +1147,10 @@ static void __exit PVRCore_Cleanup(void) SysAcquireData(&psSysData); #endif +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + PVRSyncDeviceDeInit(); +#endif + #if !defined(SUPPORT_DRI_DRM) #if defined(PVR_LDM_DEVICE_CLASS) @@ -1215,6 +1209,10 @@ static void __exit PVRCore_Cleanup(void) RemoveProcEntries(); +#if defined(SUPPORT_PVRSRV_ANDROID_SYSTRACE) + SystraceDestroyFS(); +#endif + PVR_TRACE(("PVRCore_Cleanup: unloading")); } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mutex.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mutex.c index a7e6c12..56422d6 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mutex.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mutex.c @@ -141,7 +141,7 @@ IMG_INT32 LinuxTryLockMutex(PVRSRV_LINUX_MUTEX *psPVRSRVMutex) atomic_dec(&psPVRSRVMutex->Count); } - return Status; + return Status == 0; } IMG_VOID LinuxUnLockMutex(PVRSRV_LINUX_MUTEX *psPVRSRVMutex) diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mutils.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mutils.h index 891598c..6bcee26 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mutils.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/mutils.h @@ -63,13 +63,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #else #if defined(__arm__) || defined(__sh__) #define PGPROT_WC(pv) pgprot_writecombine(pv) + #elif defined(__mips__) + #define PGPROT_WC(pv) pgprot_noncached_wa(pv) + #elif defined(__i386__) || defined(__x86_64) + /* PAT support supersedes this */ + #define PGPROT_WC(pv) pgprot_noncached(pv) #else - #if defined(__i386__) || defined(__mips__) - #define PGPROT_WC(pv) pgprot_noncached(pv) - #else - #define PGPROT_WC(pv) pgprot_noncached(pv) - #error Unsupported architecture! - #endif + #define PGPROT_WC(pv) pgprot_noncached(pv) + #error Unsupported architecture! #endif #endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/osfunc.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/osfunc.c index c508b09..f2803ab 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/osfunc.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/osfunc.c @@ -49,7 +49,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <asm/io.h> #include <asm/page.h> -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)) && (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) #include <asm/system.h> #endif #include <asm/cacheflush.h> @@ -66,6 +66,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <linux/interrupt.h> #include <asm/hardirq.h> #include <linux/timer.h> +#if defined(MEM_TRACK_INFO_DEBUG) +#include <linux/time.h> +#endif #include <linux/capability.h> #include <asm/uaccess.h> #include <linux/spinlock.h> @@ -83,22 +86,19 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "pvrmmap.h" #include "mmap.h" #include "env_data.h" -#include "proc.h" #include "mutex.h" #include "event.h" #include "linkage.h" #include "pvr_uaccess.h" #include "lock.h" -#include <syslocal.h> +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) +#include "pvr_sync.h" +#endif #if defined (SUPPORT_ION) #include "ion.h" #endif -#if defined (CONFIG_X86_PAE) -#error Physical Address Extension not supported with the driver -#endif - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) #define ON_EACH_CPU(func, info, wait) on_each_cpu(func, info, wait) #else @@ -123,21 +123,21 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif /* EMULATOR */ #if !defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) -PVRSRV_ERROR OSAllocMem_Impl(IMG_UINT32 ui32Flags, IMG_UINT32 ui32Size, IMG_PVOID *ppvCpuVAddr, IMG_HANDLE *phBlockAlloc) +PVRSRV_ERROR OSAllocMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T uiSize, IMG_PVOID *ppvCpuVAddr, IMG_HANDLE *phBlockAlloc) #else -PVRSRV_ERROR OSAllocMem_Impl(IMG_UINT32 ui32Flags, IMG_UINT32 ui32Size, IMG_PVOID *ppvCpuVAddr, IMG_HANDLE *phBlockAlloc, IMG_CHAR *pszFilename, IMG_UINT32 ui32Line) +PVRSRV_ERROR OSAllocMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T uiSize, IMG_PVOID *ppvCpuVAddr, IMG_HANDLE *phBlockAlloc, IMG_CHAR *pszFilename, IMG_UINT32 ui32Line) #endif { PVR_UNREFERENCED_PARAMETER(ui32Flags); PVR_UNREFERENCED_PARAMETER(phBlockAlloc); - if (ui32Size > PAGE_SIZE) + if (uiSize > PAGE_SIZE) { /* Try to allocate the memory using vmalloc */ #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - *ppvCpuVAddr = _VMallocWrapper(ui32Size, PVRSRV_HAP_CACHED, pszFilename, ui32Line); + *ppvCpuVAddr = _VMallocWrapper(uiSize, PVRSRV_HAP_CACHED, pszFilename, ui32Line); #else - *ppvCpuVAddr = VMallocWrapper(ui32Size, PVRSRV_HAP_CACHED); + *ppvCpuVAddr = VMallocWrapper(uiSize, PVRSRV_HAP_CACHED); #endif if (*ppvCpuVAddr) { @@ -146,9 +146,9 @@ PVRSRV_ERROR OSAllocMem_Impl(IMG_UINT32 ui32Flags, IMG_UINT32 ui32Size, IMG_PVOI } #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - *ppvCpuVAddr = _KMallocWrapper(ui32Size, GFP_KERNEL | __GFP_NOWARN, pszFilename, ui32Line); + *ppvCpuVAddr = _KMallocWrapper(uiSize, GFP_KERNEL | __GFP_NOWARN, pszFilename, ui32Line); #else - *ppvCpuVAddr = KMallocWrapper(ui32Size, GFP_KERNEL | __GFP_NOWARN); + *ppvCpuVAddr = KMallocWrapper(uiSize, GFP_KERNEL | __GFP_NOWARN); #endif if (!*ppvCpuVAddr) { @@ -169,13 +169,13 @@ static inline int is_vmalloc_addr(const void *pvCpuVAddr) #endif /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,24)) */ #if !defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) -PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_UINT32 ui32Size, IMG_PVOID pvCpuVAddr, IMG_HANDLE hBlockAlloc) +PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T uiSize, IMG_PVOID pvCpuVAddr, IMG_HANDLE hBlockAlloc) #else -PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_UINT32 ui32Size, IMG_PVOID pvCpuVAddr, IMG_HANDLE hBlockAlloc, IMG_CHAR *pszFilename, IMG_UINT32 ui32Line) +PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T uiSize, IMG_PVOID pvCpuVAddr, IMG_HANDLE hBlockAlloc, IMG_CHAR *pszFilename, IMG_UINT32 ui32Line) #endif { PVR_UNREFERENCED_PARAMETER(ui32Flags); - PVR_UNREFERENCED_PARAMETER(ui32Size); + PVR_UNREFERENCED_PARAMETER(uiSize); PVR_UNREFERENCED_PARAMETER(hBlockAlloc); if (is_vmalloc_addr(pvCpuVAddr)) @@ -201,7 +201,7 @@ PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_UINT32 ui32Size, IMG_PVOID PVRSRV_ERROR OSAllocPages_Impl(IMG_UINT32 ui32AllocFlags, - IMG_UINT32 ui32Size, + IMG_SIZE_T uiSize, IMG_UINT32 ui32PageSize, IMG_PVOID pvPrivData, IMG_UINT32 ui32PrivDataLength, @@ -223,27 +223,11 @@ OSAllocPages_Impl(IMG_UINT32 ui32AllocFlags, } #endif - if(ui32AllocFlags & PVRSRV_MEM_ION) - { - /* We'll only see HAP_SINGLE_PROCESS with MEM_ION */ - BUG_ON((ui32AllocFlags & PVRSRV_HAP_MAPTYPE_MASK) != PVRSRV_HAP_SINGLE_PROCESS); - - psLinuxMemArea = NewIONLinuxMemArea(ui32Size, ui32AllocFlags, - pvPrivData, ui32PrivDataLength); - if(!psLinuxMemArea) - { - return PVRSRV_ERROR_OUT_OF_MEMORY; - } - - PVRMMapRegisterArea(psLinuxMemArea); - goto ExitSkipSwitch; - } - switch(ui32AllocFlags & PVRSRV_HAP_MAPTYPE_MASK) { case PVRSRV_HAP_KERNEL_ONLY: { - psLinuxMemArea = NewVMallocLinuxMemArea(ui32Size, ui32AllocFlags); + psLinuxMemArea = NewVMallocLinuxMemArea(uiSize, ui32AllocFlags); if(!psLinuxMemArea) { return PVRSRV_ERROR_OUT_OF_MEMORY; @@ -255,7 +239,7 @@ OSAllocPages_Impl(IMG_UINT32 ui32AllocFlags, /* Currently PVRSRV_HAP_SINGLE_PROCESS implies that we dont need a * kernel virtual mapping, but will need a user space virtual mapping */ - psLinuxMemArea = NewAllocPagesLinuxMemArea(ui32Size, ui32AllocFlags); + psLinuxMemArea = NewAllocPagesLinuxMemArea(uiSize, ui32AllocFlags); if(!psLinuxMemArea) { return PVRSRV_ERROR_OUT_OF_MEMORY; @@ -279,7 +263,7 @@ OSAllocPages_Impl(IMG_UINT32 ui32AllocFlags, * VIPT architectures. */ ui32AllocFlags &= ~PVRSRV_HAP_CACHED; #endif - psLinuxMemArea = NewVMallocLinuxMemArea(ui32Size, ui32AllocFlags); + psLinuxMemArea = NewVMallocLinuxMemArea(uiSize, ui32AllocFlags); if(!psLinuxMemArea) { return PVRSRV_ERROR_OUT_OF_MEMORY; @@ -303,7 +287,6 @@ OSAllocPages_Impl(IMG_UINT32 ui32AllocFlags, psLinuxMemArea->hBMHandle = hBMHandle; } -ExitSkipSwitch: *ppvCpuVAddr = LinuxMemAreaToCpuVAddr(psLinuxMemArea); *phOSMemHandle = psLinuxMemArea; @@ -314,12 +297,12 @@ ExitSkipSwitch: PVRSRV_ERROR -OSFreePages(IMG_UINT32 ui32AllocFlags, IMG_UINT32 ui32Bytes, IMG_VOID *pvCpuVAddr, IMG_HANDLE hOSMemHandle) +OSFreePages(IMG_UINT32 ui32AllocFlags, IMG_SIZE_T uiBytes, IMG_VOID *pvCpuVAddr, IMG_HANDLE hOSMemHandle) { LinuxMemArea *psLinuxMemArea; PVRSRV_ERROR eError; - PVR_UNREFERENCED_PARAMETER(ui32Bytes); + PVR_UNREFERENCED_PARAMETER(uiBytes); PVR_UNREFERENCED_PARAMETER(pvCpuVAddr); psLinuxMemArea = (LinuxMemArea *)hOSMemHandle; @@ -334,9 +317,9 @@ OSFreePages(IMG_UINT32 ui32AllocFlags, IMG_UINT32 ui32Bytes, IMG_VOID *pvCpuVAdd if (eError != PVRSRV_OK) { PVR_DPF((PVR_DBG_ERROR, - "OSFreePages(ui32AllocFlags=0x%08X, ui32Bytes=%d, " + "OSFreePages(ui32AllocFlags=0x%08X, ui32Bytes=%" SIZE_T_FMT_LEN "u, " "pvCpuVAddr=%p, hOSMemHandle=%p) FAILED!", - ui32AllocFlags, ui32Bytes, pvCpuVAddr, hOSMemHandle)); + ui32AllocFlags, uiBytes, pvCpuVAddr, hOSMemHandle)); return eError; } break; @@ -351,31 +334,11 @@ OSFreePages(IMG_UINT32 ui32AllocFlags, IMG_UINT32 ui32Bytes, IMG_VOID *pvCpuVAdd return PVRSRV_OK; } -IMG_INT32 -OSGetMemMultiPlaneInfo(IMG_HANDLE hOSMemHandle, IMG_UINT32* pui32AddressOffsets, - IMG_UINT32* ui32NumAddrOffsets) -{ - LinuxMemArea *psLinuxMemArea = (LinuxMemArea *)hOSMemHandle; - - if(!ui32NumAddrOffsets) - return -1; - - if(psLinuxMemArea->eAreaType == LINUX_MEM_AREA_ION) - return GetIONLinuxMemAreaInfo(psLinuxMemArea, pui32AddressOffsets, ui32NumAddrOffsets); - - if(!pui32AddressOffsets) - return -1; - - *pui32AddressOffsets = 0; - *ui32NumAddrOffsets = 1; - - return psLinuxMemArea->ui32ByteSize; -} PVRSRV_ERROR OSGetSubMemHandle(IMG_HANDLE hOSMemHandle, - IMG_UINT32 ui32ByteOffset, - IMG_UINT32 ui32Bytes, + IMG_UINTPTR_T uiByteOffset, + IMG_SIZE_T uiBytes, IMG_UINT32 ui32Flags, IMG_HANDLE *phOSMemHandleRet) { @@ -384,7 +347,7 @@ OSGetSubMemHandle(IMG_HANDLE hOSMemHandle, psParentLinuxMemArea = (LinuxMemArea *)hOSMemHandle; - psLinuxMemArea = NewSubLinuxMemArea(psParentLinuxMemArea, ui32ByteOffset, ui32Bytes); + psLinuxMemArea = NewSubLinuxMemArea(psParentLinuxMemArea, uiByteOffset, uiBytes); if(!psLinuxMemArea) { *phOSMemHandleRet = NULL; @@ -436,11 +399,11 @@ OSReleaseSubMemHandle(IMG_VOID *hOSMemHandle, IMG_UINT32 ui32Flags) IMG_CPU_PHYADDR -OSMemHandleToCpuPAddr(IMG_VOID *hOSMemHandle, IMG_UINT32 ui32ByteOffset) +OSMemHandleToCpuPAddr(IMG_VOID *hOSMemHandle, IMG_UINTPTR_T uiByteOffset) { PVR_ASSERT(hOSMemHandle); - return LinuxMemAreaToCpuPAddr(hOSMemHandle, ui32ByteOffset); + return LinuxMemAreaToCpuPAddr(hOSMemHandle, uiByteOffset); } @@ -471,7 +434,7 @@ IMG_BOOL OSMemHandleIsPhysContig(IMG_VOID *hOSMemHandle) @Return none ******************************************************************************/ -IMG_VOID OSMemCopy(IMG_VOID *pvDst, IMG_VOID *pvSrc, IMG_UINT32 ui32Size) +IMG_VOID OSMemCopy(IMG_VOID *pvDst, IMG_VOID *pvSrc, IMG_SIZE_T uiSize) { #if defined(USE_UNOPTIMISED_MEMCPY) IMG_UINT8 *Src,*Dst; @@ -479,12 +442,12 @@ IMG_VOID OSMemCopy(IMG_VOID *pvDst, IMG_VOID *pvSrc, IMG_UINT32 ui32Size) Src=(IMG_UINT8 *)pvSrc; Dst=(IMG_UINT8 *)pvDst; - for(i=0;i<ui32Size;i++) + for(i=0;i<uiSize;i++) { Dst[i]=Src[i]; } #else - memcpy(pvDst, pvSrc, ui32Size); + memcpy(pvDst, pvSrc, uiSize); #endif } @@ -505,19 +468,19 @@ IMG_VOID OSMemCopy(IMG_VOID *pvDst, IMG_VOID *pvSrc, IMG_UINT32 ui32Size) @Return IMG_VOID ******************************************************************************/ -IMG_VOID OSMemSet(IMG_VOID *pvDest, IMG_UINT8 ui8Value, IMG_UINT32 ui32Size) +IMG_VOID OSMemSet(IMG_VOID *pvDest, IMG_UINT8 ui8Value, IMG_SIZE_T uiSize) { #if defined(USE_UNOPTIMISED_MEMSET) IMG_UINT8 *Buff; IMG_INT i; Buff=(IMG_UINT8 *)pvDest; - for(i=0;i<ui32Size;i++) + for(i=0;i<uiSize;i++) { Buff[i]=ui8Value; } #else - memset(pvDest, (IMG_INT) ui8Value, (size_t) ui32Size); + memset(pvDest, (IMG_INT) ui8Value, (size_t) uiSize); #endif } @@ -537,13 +500,13 @@ IMG_CHAR *OSStringCopy(IMG_CHAR *pszDest, const IMG_CHAR *pszSrc) @Function OSSNPrintf @Description snprintf ******************************************************************************/ -IMG_INT32 OSSNPrintf(IMG_CHAR *pStr, IMG_UINT32 ui32Size, const IMG_CHAR *pszFormat, ...) +IMG_INT32 OSSNPrintf(IMG_CHAR *pStr, IMG_SIZE_T uiSize, const IMG_CHAR *pszFormat, ...) { va_list argList; IMG_INT32 iCount; va_start(argList, pszFormat); - iCount = vsnprintf(pStr, (size_t)ui32Size, pszFormat, argList); + iCount = vsnprintf(pStr, (size_t)uiSize, pszFormat, argList); va_end(argList); return iCount; @@ -839,61 +802,24 @@ IMG_UINT32 OSGetCurrentProcessIDKM(IMG_VOID) #endif } +#if defined(MEM_TRACK_INFO_DEBUG) +/*! +****************************************************************************** -int OSGetProcCmdline(IMG_UINT32 ui32PID, char * buffer, int buff_size) -{ - int res = 0; - unsigned int len; - struct task_struct *task = pid_task(find_vpid(ui32PID), PIDTYPE_PID); - struct mm_struct *mm = task ? get_task_mm(task) : IMG_NULL; - if (!mm) - goto out; - if (!mm->arg_end) - goto out_mm; /* Shh! No looking before we're done */ - - len = mm->arg_end - mm->arg_start; - - if (len > buff_size) - len = buff_size; - - res = pvr_access_process_vm(task, mm->arg_start, buffer, len, 0); + @Function OSGetCurrentTimeInUSecsKM + + @Description Returns current time in usecs - // If the nul at the end of args has been overwritten, then - // assume application is using setproctitle(3). - if (res > 0 && buffer[res-1] != '\0' && len < buff_size) { - len = strnlen(buffer, res); - if (len < res) { - res = len; - } else { - len = mm->env_end - mm->env_start; - if (len > buff_size - res) - len = buff_size - res; - res += pvr_access_process_vm(task, mm->env_start, buffer+res, len, 0); - res = strnlen(buffer, res); - } - } -out_mm: - mmput(mm); -out: - return res; -} + @Return ID of current process -const char* OSGetPathBaseName(char * buffer, int buff_size) +*****************************************************************************/ +IMG_UINT32 OSGetCurrentTimeInUSecsKM(IMG_VOID) { - const char *base_name = buffer; - while (1) - { - const char *next = strnchr(base_name, buff_size, '/'); - if (!next) - break; - - buff_size -= (next - base_name -1); - base_name = (next + 1); - - } - return base_name; + struct timeval tv; + do_gettimeofday(&tv); + return (tv.tv_sec * 1000000 + tv.tv_usec); } - +#endif /*! ****************************************************************************** @@ -1197,6 +1123,10 @@ static void MISRWrapper( SYS_DATA *psSysData = (SYS_DATA *)psEnvData->pvMISRData; PVRSRVMISR(psSysData); + +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + PVRSyncUpdateAllSyncs(); +#endif } @@ -1703,7 +1633,7 @@ IMG_CPU_PHYADDR OSMapLinToCPUPhys(IMG_HANDLE hOSMemHandle, ******************************************************************************/ IMG_VOID * OSMapPhysToLin(IMG_CPU_PHYADDR BasePAddr, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uiBytes, IMG_UINT32 ui32MappingFlags, IMG_HANDLE *phOSMemHandle) { @@ -1717,7 +1647,7 @@ OSMapPhysToLin(IMG_CPU_PHYADDR BasePAddr, if(phOSMemHandle == IMG_NULL) { IMG_VOID *pvIORemapCookie; - pvIORemapCookie = IORemapWrapper(BasePAddr, ui32Bytes, ui32MappingFlags); + pvIORemapCookie = IORemapWrapper(BasePAddr, uiBytes, ui32MappingFlags); if(pvIORemapCookie == IMG_NULL) { return IMG_NULL; @@ -1726,7 +1656,7 @@ OSMapPhysToLin(IMG_CPU_PHYADDR BasePAddr, } else { - LinuxMemArea *psLinuxMemArea = NewIORemapLinuxMemArea(BasePAddr, ui32Bytes, ui32MappingFlags); + LinuxMemArea *psLinuxMemArea = NewIORemapLinuxMemArea(BasePAddr, uiBytes, ui32MappingFlags); if(psLinuxMemArea == IMG_NULL) { @@ -1752,9 +1682,9 @@ OSMapPhysToLin(IMG_CPU_PHYADDR BasePAddr, @Return TRUE on success, else FALSE ******************************************************************************/ IMG_BOOL -OSUnMapPhysToLin(IMG_VOID *pvLinAddr, IMG_UINT32 ui32Bytes, IMG_UINT32 ui32MappingFlags, IMG_HANDLE hOSMemHandle) +OSUnMapPhysToLin(IMG_VOID *pvLinAddr, IMG_SIZE_T uiBytes, IMG_UINT32 ui32MappingFlags, IMG_HANDLE hOSMemHandle) { - PVR_UNREFERENCED_PARAMETER(ui32Bytes); + PVR_UNREFERENCED_PARAMETER(uiBytes); if(ui32MappingFlags & PVRSRV_HAP_KERNEL_ONLY) { @@ -1868,19 +1798,19 @@ RegisterExternalMem(IMG_SYS_PHYADDR *pBasePAddr, PVRSRV_ERROR OSRegisterMem(IMG_CPU_PHYADDR BasePAddr, IMG_VOID *pvCPUVAddr, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uiBytes, IMG_UINT32 ui32MappingFlags, IMG_HANDLE *phOSMemHandle) { IMG_SYS_PHYADDR SysPAddr = SysCpuPAddrToSysPAddr(BasePAddr); - return RegisterExternalMem(&SysPAddr, pvCPUVAddr, ui32Bytes, IMG_TRUE, ui32MappingFlags, phOSMemHandle); + return RegisterExternalMem(&SysPAddr, pvCPUVAddr, uiBytes, IMG_TRUE, ui32MappingFlags, phOSMemHandle); } -PVRSRV_ERROR OSRegisterDiscontigMem(IMG_SYS_PHYADDR *pBasePAddr, IMG_VOID *pvCPUVAddr, IMG_UINT32 ui32Bytes, IMG_UINT32 ui32MappingFlags, IMG_HANDLE *phOSMemHandle) +PVRSRV_ERROR OSRegisterDiscontigMem(IMG_SYS_PHYADDR *pBasePAddr, IMG_VOID *pvCPUVAddr, IMG_SIZE_T uBytes, IMG_UINT32 ui32MappingFlags, IMG_HANDLE *phOSMemHandle) { - return RegisterExternalMem(pBasePAddr, pvCPUVAddr, ui32Bytes, IMG_FALSE, ui32MappingFlags, phOSMemHandle); + return RegisterExternalMem(pBasePAddr, pvCPUVAddr, uBytes, IMG_FALSE, ui32MappingFlags, phOSMemHandle); } @@ -1892,7 +1822,7 @@ PVRSRV_ERROR OSRegisterDiscontigMem(IMG_SYS_PHYADDR *pBasePAddr, IMG_VOID *pvCPU ******************************************************************************/ PVRSRV_ERROR OSUnRegisterMem (IMG_VOID *pvCpuVAddr, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uiBytes, IMG_UINT32 ui32MappingFlags, IMG_HANDLE hOSMemHandle) { @@ -1900,7 +1830,7 @@ OSUnRegisterMem (IMG_VOID *pvCpuVAddr, PVRSRV_ERROR eError; PVR_UNREFERENCED_PARAMETER(pvCpuVAddr); - PVR_UNREFERENCED_PARAMETER(ui32Bytes); + PVR_UNREFERENCED_PARAMETER(uiBytes); switch(ui32MappingFlags & PVRSRV_HAP_MAPTYPE_MASK) { @@ -1912,8 +1842,8 @@ OSUnRegisterMem (IMG_VOID *pvCpuVAddr, eError = PVRMMapRemoveRegisteredArea(psLinuxMemArea); if (eError != PVRSRV_OK) { - PVR_DPF((PVR_DBG_ERROR, "%s(%p, %d, 0x%08X, %p) FAILED!", - __FUNCTION__, pvCpuVAddr, ui32Bytes, + PVR_DPF((PVR_DBG_ERROR, "%s(%p, %" SIZE_T_FMT_LEN "u, 0x%08X, %p) FAILED!", + __FUNCTION__, pvCpuVAddr, uiBytes, ui32MappingFlags, hOSMemHandle)); return eError; } @@ -1931,9 +1861,9 @@ OSUnRegisterMem (IMG_VOID *pvCpuVAddr, return PVRSRV_OK; } -PVRSRV_ERROR OSUnRegisterDiscontigMem(IMG_VOID *pvCpuVAddr, IMG_UINT32 ui32Bytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle) +PVRSRV_ERROR OSUnRegisterDiscontigMem(IMG_VOID *pvCpuVAddr, IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle) { - return OSUnRegisterMem(pvCpuVAddr, ui32Bytes, ui32Flags, hOSMemHandle); + return OSUnRegisterMem(pvCpuVAddr, uBytes, ui32Flags, hOSMemHandle); } /*! @@ -1946,7 +1876,7 @@ PVRSRV_ERROR OSUnRegisterDiscontigMem(IMG_VOID *pvCpuVAddr, IMG_UINT32 ui32Bytes ******************************************************************************/ PVRSRV_ERROR OSReservePhys(IMG_CPU_PHYADDR BasePAddr, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uiBytes, IMG_UINT32 ui32MappingFlags, IMG_HANDLE hBMHandle, IMG_VOID **ppvCpuVAddr, @@ -1972,7 +1902,7 @@ OSReservePhys(IMG_CPU_PHYADDR BasePAddr, * mapping is required for the allocation and no user virtual * mappings are allowed: Note these eat into our limited kernel * virtual address space */ - psLinuxMemArea = NewIORemapLinuxMemArea(BasePAddr, ui32Bytes, ui32MappingFlags); + psLinuxMemArea = NewIORemapLinuxMemArea(BasePAddr, uiBytes, ui32MappingFlags); if(!psLinuxMemArea) { return PVRSRV_ERROR_BAD_MAPPING; @@ -1983,7 +1913,7 @@ OSReservePhys(IMG_CPU_PHYADDR BasePAddr, { /* Currently this implies that we dont need a kernel virtual * mapping, but will need a user space virtual mapping */ - psLinuxMemArea = NewIOLinuxMemArea(BasePAddr, ui32Bytes, ui32MappingFlags); + psLinuxMemArea = NewIOLinuxMemArea(BasePAddr, uiBytes, ui32MappingFlags); if(!psLinuxMemArea) { return PVRSRV_ERROR_BAD_MAPPING; @@ -2007,7 +1937,7 @@ OSReservePhys(IMG_CPU_PHYADDR BasePAddr, */ ui32MappingFlags &= ~PVRSRV_HAP_CACHED; #endif - psLinuxMemArea = NewIORemapLinuxMemArea(BasePAddr, ui32Bytes, ui32MappingFlags); + psLinuxMemArea = NewIORemapLinuxMemArea(BasePAddr, uiBytes, ui32MappingFlags); if(!psLinuxMemArea) { return PVRSRV_ERROR_BAD_MAPPING; @@ -2048,7 +1978,7 @@ OSReservePhys(IMG_CPU_PHYADDR BasePAddr, ******************************************************************************/ PVRSRV_ERROR OSUnReservePhys(IMG_VOID *pvCpuVAddr, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uiBytes, IMG_UINT32 ui32MappingFlags, IMG_HANDLE hOSMemHandle) { @@ -2056,7 +1986,7 @@ OSUnReservePhys(IMG_VOID *pvCpuVAddr, PVRSRV_ERROR eError; PVR_UNREFERENCED_PARAMETER(pvCpuVAddr); - PVR_UNREFERENCED_PARAMETER(ui32Bytes); + PVR_UNREFERENCED_PARAMETER(uiBytes); psLinuxMemArea = (LinuxMemArea *)hOSMemHandle; @@ -2070,8 +2000,8 @@ OSUnReservePhys(IMG_VOID *pvCpuVAddr, eError = PVRMMapRemoveRegisteredArea(psLinuxMemArea); if (eError != PVRSRV_OK) { - PVR_DPF((PVR_DBG_ERROR, "%s(%p, %d, 0x%08X, %p) FAILED!", - __FUNCTION__, pvCpuVAddr, ui32Bytes, + PVR_DPF((PVR_DBG_ERROR, "%s(%p, %" SIZE_T_FMT_LEN "u, 0x%08X, %p) FAILED!", + __FUNCTION__, pvCpuVAddr, uiBytes, ui32MappingFlags, hOSMemHandle)); return eError; } @@ -2098,10 +2028,10 @@ OSUnReservePhys(IMG_VOID *pvCpuVAddr, @Output ppvLinAddr - pointer to variable that will receive the linear address of buffer @Return PVRSRV_OK if allocation successed else returns PVRSRV_ERROR_OUT_OF_MEMORY **************************************************************************/ -PVRSRV_ERROR OSBaseAllocContigMemory(IMG_UINT32 ui32Size, IMG_CPU_VIRTADDR *pvLinAddr, IMG_CPU_PHYADDR *psPhysAddr) +PVRSRV_ERROR OSBaseAllocContigMemory(IMG_SIZE_T uiSize, IMG_CPU_VIRTADDR *pvLinAddr, IMG_CPU_PHYADDR *psPhysAddr) { #if !defined(NO_HARDWARE) - PVR_UNREFERENCED_PARAMETER(ui32Size); + PVR_UNREFERENCED_PARAMETER(uiSize); PVR_UNREFERENCED_PARAMETER(pvLinAddr); PVR_UNREFERENCED_PARAMETER(psPhysAddr); PVR_DPF((PVR_DBG_ERROR, "%s: Not available", __FUNCTION__)); @@ -2118,9 +2048,9 @@ PVRSRV_ERROR OSBaseAllocContigMemory(IMG_UINT32 ui32Size, IMG_CPU_VIRTADDR *pvLi IMG_VOID *pvKernLinAddr; #if defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - pvKernLinAddr = _KMallocWrapper(ui32Size, GFP_KERNEL, __FILE__, __LINE__); + pvKernLinAddr = _KMallocWrapper(uiSize, GFP_KERNEL, __FILE__, __LINE__); #else - pvKernLinAddr = KMallocWrapper(ui32Size, GFP_KERNEL); + pvKernLinAddr = KMallocWrapper(uiSize, GFP_KERNEL); #endif if (!pvKernLinAddr) { @@ -2142,16 +2072,16 @@ PVRSRV_ERROR OSBaseAllocContigMemory(IMG_UINT32 ui32Size, IMG_CPU_VIRTADDR *pvLi @Description Frees memory allocated with OSBaseAllocContigMemory @Input LinAddr - pointer to buffer allocated with OSBaseAllocContigMemory **************************************************************************/ -PVRSRV_ERROR OSBaseFreeContigMemory(IMG_UINT32 ui32Size, IMG_CPU_VIRTADDR pvLinAddr, IMG_CPU_PHYADDR psPhysAddr) +PVRSRV_ERROR OSBaseFreeContigMemory(IMG_SIZE_T uiSize, IMG_CPU_VIRTADDR pvLinAddr, IMG_CPU_PHYADDR psPhysAddr) { #if !defined(NO_HARDWARE) - PVR_UNREFERENCED_PARAMETER(ui32Size); + PVR_UNREFERENCED_PARAMETER(uiSize); PVR_UNREFERENCED_PARAMETER(pvLinAddr); PVR_UNREFERENCED_PARAMETER(psPhysAddr.uiAddr); PVR_DPF((PVR_DBG_WARNING, "%s: Not available", __FUNCTION__)); #else - PVR_UNREFERENCED_PARAMETER(ui32Size); + PVR_UNREFERENCED_PARAMETER(uiSize); PVR_UNREFERENCED_PARAMETER(psPhysAddr.uiAddr); KFreeWrapper(pvLinAddr); @@ -2762,9 +2692,9 @@ static void OSTimerCallbackBody(TIMER_CALLBACK_DATA *psTimerCBData) @Return NONE ******************************************************************************/ -static IMG_VOID OSTimerCallbackWrapper(IMG_UINT32 ui32Data) +static IMG_VOID OSTimerCallbackWrapper(IMG_UINTPTR_T uiData) { - TIMER_CALLBACK_DATA *psTimerCBData = (TIMER_CALLBACK_DATA*)ui32Data; + TIMER_CALLBACK_DATA *psTimerCBData = (TIMER_CALLBACK_DATA*)uiData; #if defined(PVR_LINUX_TIMERS_USING_WORKQUEUES) || defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE) int res; @@ -2814,7 +2744,7 @@ static void OSTimerWorkQueueCallBack(struct work_struct *psWork) IMG_HANDLE OSAddTimer(PFN_TIMER_FUNC pfnTimerFunc, IMG_VOID *pvData, IMG_UINT32 ui32MsTimeout) { TIMER_CALLBACK_DATA *psTimerCBData; - IMG_UINT32 ui32i; + IMG_UINTPTR_T ui; #if !(defined(PVR_LINUX_TIMERS_USING_WORKQUEUES) || defined(PVR_LINUX_TIMERS_USING_SHARED_WORKQUEUE)) unsigned long ulLockFlags; #endif @@ -2832,9 +2762,9 @@ IMG_HANDLE OSAddTimer(PFN_TIMER_FUNC pfnTimerFunc, IMG_VOID *pvData, IMG_UINT32 #else spin_lock_irqsave(&sTimerStructLock, ulLockFlags); #endif - for (ui32i = 0; ui32i < OS_MAX_TIMERS; ui32i++) + for (ui = 0; ui < OS_MAX_TIMERS; ui++) { - psTimerCBData = &sTimers[ui32i]; + psTimerCBData = &sTimers[ui]; if (!psTimerCBData->bInUse) { psTimerCBData->bInUse = IMG_TRUE; @@ -2846,7 +2776,7 @@ IMG_HANDLE OSAddTimer(PFN_TIMER_FUNC pfnTimerFunc, IMG_VOID *pvData, IMG_UINT32 #else spin_unlock_irqrestore(&sTimerStructLock, ulLockFlags); #endif - if (ui32i >= OS_MAX_TIMERS) + if (ui >= OS_MAX_TIMERS) { PVR_DPF((PVR_DBG_ERROR, "OSAddTimer: all timers are in use")); return IMG_NULL; @@ -2870,19 +2800,19 @@ IMG_HANDLE OSAddTimer(PFN_TIMER_FUNC pfnTimerFunc, IMG_VOID *pvData, IMG_UINT32 /* setup timer object */ /* PRQA S 0307,0563 1 */ /* ignore warning about inconpartible ptr casting */ psTimerCBData->sTimer.function = (IMG_VOID *)OSTimerCallbackWrapper; - psTimerCBData->sTimer.data = (IMG_UINT32)psTimerCBData; + psTimerCBData->sTimer.data = (IMG_UINTPTR_T)psTimerCBData; - return (IMG_HANDLE)(ui32i + 1); + return (IMG_HANDLE)(ui + 1); } static inline TIMER_CALLBACK_DATA *GetTimerStructure(IMG_HANDLE hTimer) { - IMG_UINT32 ui32i = ((IMG_UINT32)hTimer) - 1; + IMG_UINTPTR_T ui = ((IMG_UINTPTR_T)hTimer) - 1; - PVR_ASSERT(ui32i < OS_MAX_TIMERS); + PVR_ASSERT(ui < OS_MAX_TIMERS); - return &sTimers[ui32i]; + return &sTimers[ui]; } /*! @@ -3016,11 +2946,7 @@ PVRSRV_ERROR OSDisableTimer (IMG_HANDLE hTimer) @Return PVRSRV_ERROR : ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR OSEventObjectCreateKM(const IMG_CHAR *pszName, PVRSRV_EVENTOBJECT_KM *psEventObject) -#else PVRSRV_ERROR OSEventObjectCreateKM(const IMG_CHAR *pszName, PVRSRV_EVENTOBJECT *psEventObject) -#endif { PVRSRV_ERROR eError = PVRSRV_OK; @@ -3036,11 +2962,7 @@ PVRSRV_ERROR OSEventObjectCreateKM(const IMG_CHAR *pszName, PVRSRV_EVENTOBJECT * { /* autogenerate a name */ static IMG_UINT16 ui16NameIndex = 0; -#if defined (SUPPORT_SID_INTERFACE) - snprintf(psEventObject->szName, EVENTOBJNAME_MAXLENGTH, "PVRSRV_EVENTOBJECT_KM_%d", ui16NameIndex++); -#else snprintf(psEventObject->szName, EVENTOBJNAME_MAXLENGTH, "PVRSRV_EVENTOBJECT_%d", ui16NameIndex++); -#endif } if(LinuxEventObjectListCreate(&psEventObject->hOSEventKM) != PVRSRV_OK) @@ -3074,11 +2996,7 @@ PVRSRV_ERROR OSEventObjectCreateKM(const IMG_CHAR *pszName, PVRSRV_EVENTOBJECT * @Return PVRSRV_ERROR : ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR OSEventObjectDestroyKM(PVRSRV_EVENTOBJECT_KM *psEventObject) -#else PVRSRV_ERROR OSEventObjectDestroyKM(PVRSRV_EVENTOBJECT *psEventObject) -#endif { PVRSRV_ERROR eError = PVRSRV_OK; @@ -3149,11 +3067,7 @@ PVRSRV_ERROR OSEventObjectWaitKM(IMG_HANDLE hOSEventKM) @Return PVRSRV_ERROR : ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR OSEventObjectOpenKM(PVRSRV_EVENTOBJECT_KM *psEventObject, -#else PVRSRV_ERROR OSEventObjectOpenKM(PVRSRV_EVENTOBJECT *psEventObject, -#endif IMG_HANDLE *phOSEvent) { PVRSRV_ERROR eError = PVRSRV_OK; @@ -3192,11 +3106,7 @@ PVRSRV_ERROR OSEventObjectOpenKM(PVRSRV_EVENTOBJECT *psEventObject, @Return PVRSRV_ERROR : ******************************************************************************/ -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR OSEventObjectCloseKM(PVRSRV_EVENTOBJECT_KM *psEventObject, -#else PVRSRV_ERROR OSEventObjectCloseKM(PVRSRV_EVENTOBJECT *psEventObject, -#endif IMG_HANDLE hOSEventKM) { PVRSRV_ERROR eError = PVRSRV_OK; @@ -3291,11 +3201,11 @@ IMG_BOOL OSProcHasPrivSrvInit(IMG_VOID) PVRSRV_ERROR OSCopyToUser(IMG_PVOID pvProcess, IMG_VOID *pvDest, IMG_VOID *pvSrc, - IMG_UINT32 ui32Bytes) + IMG_SIZE_T uiBytes) { PVR_UNREFERENCED_PARAMETER(pvProcess); - if(pvr_copy_to_user(pvDest, pvSrc, ui32Bytes)==0) + if(pvr_copy_to_user(pvDest, pvSrc, uiBytes)==0) return PVRSRV_OK; else return PVRSRV_ERROR_FAILED_TO_COPY_VIRT_MEMORY; @@ -3322,11 +3232,11 @@ PVRSRV_ERROR OSCopyToUser(IMG_PVOID pvProcess, PVRSRV_ERROR OSCopyFromUser( IMG_PVOID pvProcess, IMG_VOID *pvDest, IMG_VOID *pvSrc, - IMG_UINT32 ui32Bytes) + IMG_SIZE_T uiBytes) { PVR_UNREFERENCED_PARAMETER(pvProcess); - if(pvr_copy_from_user(pvDest, pvSrc, ui32Bytes)==0) + if(pvr_copy_from_user(pvDest, pvSrc, uiBytes)==0) return PVRSRV_OK; else return PVRSRV_ERROR_FAILED_TO_COPY_VIRT_MEMORY; @@ -3350,7 +3260,7 @@ PVRSRV_ERROR OSCopyFromUser( IMG_PVOID pvProcess, @Return IMG_BOOL : ******************************************************************************/ -IMG_BOOL OSAccessOK(IMG_VERIFY_TEST eVerification, IMG_VOID *pvUserPtr, IMG_UINT32 ui32Bytes) +IMG_BOOL OSAccessOK(IMG_VERIFY_TEST eVerification, IMG_VOID *pvUserPtr, IMG_SIZE_T uiBytes) { IMG_INT linuxType; @@ -3364,7 +3274,7 @@ IMG_BOOL OSAccessOK(IMG_VERIFY_TEST eVerification, IMG_VOID *pvUserPtr, IMG_UINT linuxType = VERIFY_WRITE; } - return access_ok(linuxType, pvUserPtr, ui32Bytes); + return access_ok(linuxType, pvUserPtr, uiBytes); } typedef enum _eWrapMemType_ @@ -3383,8 +3293,8 @@ typedef struct _sWrapMemInfo_ IMG_SYS_PHYADDR *psPhysAddr; IMG_INT iPageOffset; #if defined(DEBUG) - IMG_UINT32 ulStartAddr; - IMG_UINT32 ulBeyondEndAddr; + IMG_UINTPTR_T uStartAddr; + IMG_UINTPTR_T uBeyondEndAddr; struct vm_area_struct *psVMArea; #endif } sWrapMemInfo; @@ -3403,16 +3313,16 @@ typedef struct _sWrapMemInfo_ and must be writable. A get_page is done on the returned page structure. @Input psVMArea - pointer to VM area structure - ulCPUVAddr - CPU virtual address - pulPFN - Pointer to returned PFN. + uCPUVAddr - CPU virtual address + pui32PFN - Pointer to returned PFN. ppsPAge - Pointer to returned page structure pointer. - @Output *pulPFN - Set to PFN + @Output *pui32PFN - Set to PFN *ppsPage - Pointer to the page structure if present, else NULL. @Return IMG_TRUE if PFN lookup was succesful. ******************************************************************************/ -static IMG_BOOL CPUVAddrToPFN(struct vm_area_struct *psVMArea, IMG_UINT32 ulCPUVAddr, IMG_UINT32 *pulPFN, struct page **ppsPage) +static IMG_BOOL CPUVAddrToPFN(struct vm_area_struct *psVMArea, IMG_UINTPTR_T uCPUVAddr, IMG_UINT32 *pui32PFN, struct page **ppsPage) { #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10)) pgd_t *psPGD; @@ -3423,31 +3333,31 @@ static IMG_BOOL CPUVAddrToPFN(struct vm_area_struct *psVMArea, IMG_UINT32 ulCPUV spinlock_t *psPTLock; IMG_BOOL bRet = IMG_FALSE; - *pulPFN = 0; + *pui32PFN = 0; *ppsPage = NULL; - psPGD = pgd_offset(psMM, ulCPUVAddr); + psPGD = pgd_offset(psMM, uCPUVAddr); if (pgd_none(*psPGD) || pgd_bad(*psPGD)) return bRet; - psPUD = pud_offset(psPGD, ulCPUVAddr); + psPUD = pud_offset(psPGD, uCPUVAddr); if (pud_none(*psPUD) || pud_bad(*psPUD)) return bRet; - psPMD = pmd_offset(psPUD, ulCPUVAddr); + psPMD = pmd_offset(psPUD, uCPUVAddr); if (pmd_none(*psPMD) || pmd_bad(*psPMD)) return bRet; - psPTE = (pte_t *)pte_offset_map_lock(psMM, psPMD, ulCPUVAddr, &psPTLock); + psPTE = (pte_t *)pte_offset_map_lock(psMM, psPMD, uCPUVAddr, &psPTLock); if ((pte_none(*psPTE) == 0) && (pte_present(*psPTE) != 0) && (pte_write(*psPTE) != 0)) { - *pulPFN = pte_pfn(*psPTE); + *pui32PFN = pte_pfn(*psPTE); bRet = IMG_TRUE; - if (pfn_valid(*pulPFN)) + if (pfn_valid(*pui32PFN)) { - *ppsPage = pfn_to_page(*pulPFN); + *ppsPage = pfn_to_page(*pui32PFN); get_page(*ppsPage); } @@ -3600,7 +3510,7 @@ err_out: return ui32PhysAddr; } -#endif /* defined(CONFIG_TI_TILER) || defined(CONFIG_DRM_OMAP_DMM_TILER) */ +#endif /* defined(CONFIG_TI_TILER) && defined(CONFIG_DRM_OMAP_DMM_TILER) */ /*! ****************************************************************************** @@ -3613,17 +3523,17 @@ err_out: ******************************************************************************/ PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID *pvCPUVAddr, - IMG_UINT32 ui32Bytes, + IMG_SIZE_T uiBytes, IMG_SYS_PHYADDR *psSysPAddr, IMG_HANDLE *phOSWrapMem) { - IMG_UINT32 ulStartAddrOrig = (IMG_UINT32) pvCPUVAddr; - IMG_UINT32 ulAddrRangeOrig = (IMG_UINT32) ui32Bytes; - IMG_UINT32 ulBeyondEndAddrOrig = ulStartAddrOrig + ulAddrRangeOrig; - IMG_UINT32 ulStartAddr; - IMG_UINT32 ulAddrRange; - IMG_UINT32 ulBeyondEndAddr; - IMG_UINT32 ulAddr; + IMG_UINTPTR_T uStartAddrOrig = (IMG_UINTPTR_T) pvCPUVAddr; + IMG_SIZE_T uAddrRangeOrig = uiBytes; + IMG_UINTPTR_T uBeyondEndAddrOrig = uStartAddrOrig + uAddrRangeOrig; + IMG_UINTPTR_T uStartAddr; + IMG_SIZE_T uAddrRange; + IMG_UINTPTR_T uBeyondEndAddr; + IMG_UINTPTR_T uAddr; IMG_INT i; struct vm_area_struct *psVMArea; sWrapMemInfo *psInfo = NULL; @@ -3633,19 +3543,19 @@ PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID *pvCPUVAddr, PVRSRV_ERROR eError = PVRSRV_ERROR_OUT_OF_MEMORY; /* Align start and end addresses to page boundaries */ - ulStartAddr = ulStartAddrOrig & PAGE_MASK; - ulBeyondEndAddr = PAGE_ALIGN(ulBeyondEndAddrOrig); - ulAddrRange = ulBeyondEndAddr - ulStartAddr; + uStartAddr = uStartAddrOrig & PAGE_MASK; + uBeyondEndAddr = PAGE_ALIGN(uBeyondEndAddrOrig); + uAddrRange = uBeyondEndAddr - uStartAddr; /* * Check for address range calculation overflow, and attempts to wrap * zero bytes. */ - if (ulBeyondEndAddr <= ulStartAddr) + if (uBeyondEndAddr <= uStartAddr) { PVR_DPF((PVR_DBG_ERROR, - "OSAcquirePhysPageAddr: Invalid address range (start %x, length %x)", - ulStartAddrOrig, ulAddrRangeOrig)); + "OSAcquirePhysPageAddr: Invalid address range (start " UINTPTR_FMT ", length %" SIZE_T_FMT_LEN "x)", + uStartAddrOrig, uAddrRangeOrig)); goto error; } @@ -3660,12 +3570,12 @@ PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID *pvCPUVAddr, memset(psInfo, 0, sizeof(*psInfo)); #if defined(DEBUG) - psInfo->ulStartAddr = ulStartAddrOrig; - psInfo->ulBeyondEndAddr = ulBeyondEndAddrOrig; + psInfo->uStartAddr = uStartAddrOrig; + psInfo->uBeyondEndAddr = uBeyondEndAddrOrig; #endif - psInfo->iNumPages = (IMG_INT)(ulAddrRange >> PAGE_SHIFT); - psInfo->iPageOffset = (IMG_INT)(ulStartAddrOrig & ~PAGE_MASK); + psInfo->iNumPages = (IMG_INT)(uAddrRange >> PAGE_SHIFT); + psInfo->iPageOffset = (IMG_INT)(uStartAddrOrig & ~PAGE_MASK); /* Allocate physical address array */ psInfo->psPhysAddr = kmalloc((size_t)psInfo->iNumPages * sizeof(*psInfo->psPhysAddr), GFP_KERNEL); @@ -3698,7 +3608,7 @@ PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID *pvCPUVAddr, bMMapSemHeld = IMG_TRUE; /* Get page list */ - psInfo->iNumPagesMapped = get_user_pages(current, current->mm, ulStartAddr, psInfo->iNumPages, 1, 0, psInfo->ppsPages, NULL); + psInfo->iNumPagesMapped = get_user_pages(current, current->mm, uStartAddr, psInfo->iNumPages, 1, 0, psInfo->ppsPages, NULL); if (psInfo->iNumPagesMapped >= 0) { @@ -3714,14 +3624,14 @@ PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID *pvCPUVAddr, for (i = 0; i < psInfo->iNumPages; i++) { IMG_CPU_PHYADDR CPUPhysAddr; - IMG_UINT32 ulPFN; + IMG_UINT32 ui32PFN; - ulPFN = page_to_pfn(psInfo->ppsPages[i]); - CPUPhysAddr.uiAddr = ulPFN << PAGE_SHIFT; - if ((CPUPhysAddr.uiAddr >> PAGE_SHIFT) != ulPFN) + ui32PFN = page_to_pfn(psInfo->ppsPages[i]); + CPUPhysAddr.uiAddr = ui32PFN << PAGE_SHIFT; + if ((CPUPhysAddr.uiAddr >> PAGE_SHIFT) != ui32PFN) { PVR_DPF((PVR_DBG_ERROR, - "OSAcquirePhysPageAddr: Page frame number out of range (%x)", ulPFN)); + "OSAcquirePhysPageAddr: Page frame number out of range (%x)", ui32PFN)); goto error; } @@ -3749,11 +3659,12 @@ PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID *pvCPUVAddr, /* Set the mapping type to aid clean up */ psInfo->eType = WRAP_TYPE_FIND_VMA; - psVMArea = find_vma(current->mm, ulStartAddrOrig); + psVMArea = find_vma(current->mm, uStartAddrOrig); if (psVMArea == NULL) { PVR_DPF((PVR_DBG_ERROR, - "OSAcquirePhysPageAddr: Couldn't find memory region containing start address %x", ulStartAddrOrig)); + "OSAcquirePhysPageAddr: Couldn't find memory region containing start address " UINTPTR_FMT, + uStartAddrOrig)); goto error; } @@ -3765,27 +3676,24 @@ PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID *pvCPUVAddr, * find_vma locates a region with an end point past a given * virtual address. So check the address is actually in the region. */ - if (ulStartAddrOrig < psVMArea->vm_start) + if (uStartAddrOrig < psVMArea->vm_start) { PVR_DPF((PVR_DBG_ERROR, - "OSAcquirePhysPageAddr: Start address %x is outside of the region returned by find_vma", ulStartAddrOrig)); + "OSAcquirePhysPageAddr: Start address " UINTPTR_FMT " is outside of the region returned by find_vma", + uStartAddrOrig)); goto error; } /* Now check the end address is in range */ - if (ulBeyondEndAddrOrig > psVMArea->vm_end) + if (uBeyondEndAddrOrig > psVMArea->vm_end) { PVR_DPF((PVR_DBG_ERROR, - "OSAcquirePhysPageAddr: End address %x is outside of the region returned by find_vma", ulBeyondEndAddrOrig)); + "OSAcquirePhysPageAddr: End address " UINTPTR_FMT " is outside of the region returned by find_vma", uBeyondEndAddrOrig)); goto error; } /* Does the region represent memory mapped I/O? */ -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)) - if ((psVMArea->vm_flags & (VM_IO | VM_RESERVED)) != (VM_IO | VM_RESERVED)) -#else - if ((psVMArea->vm_flags & (VM_IO)) != (VM_IO)) -#endif + if (!(psVMArea->vm_flags & VM_IO)) { PVR_DPF((PVR_DBG_ERROR, "OSAcquirePhysPageAddr: Memory region does not represent memory mapped I/O (VMA flags: 0x%lx)", psVMArea->vm_flags)); @@ -3800,14 +3708,14 @@ PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID *pvCPUVAddr, goto error; } - for (ulAddr = ulStartAddrOrig, i = 0; ulAddr < ulBeyondEndAddrOrig; ulAddr += PAGE_SIZE, i++) + for (uAddr = uStartAddrOrig, i = 0; uAddr < uBeyondEndAddrOrig; uAddr += PAGE_SIZE, i++) { IMG_CPU_PHYADDR CPUPhysAddr; - IMG_UINT32 ulPFN = 0; + IMG_UINT32 ui32PFN = 0; PVR_ASSERT(i < psInfo->iNumPages); - if (!CPUVAddrToPFN(psVMArea, ulAddr, &ulPFN, &psInfo->ppsPages[i])) + if (!CPUVAddrToPFN(psVMArea, uAddr, &ui32PFN, &psInfo->ppsPages[i])) { PVR_DPF((PVR_DBG_ERROR, "OSAcquirePhysPageAddr: Invalid CPU virtual address")); @@ -3818,7 +3726,7 @@ PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID *pvCPUVAddr, { #if defined(CONFIG_TI_TILER) || defined(CONFIG_DRM_OMAP_DMM_TILER) /* This could be tiler memory.*/ - IMG_UINT32 ui32TilerAddr = CPUAddrToTilerPhy(ulAddr); + IMG_UINT32 ui32TilerAddr = CPUAddrToTilerPhy(uAddr); if (ui32TilerAddr) { bHavePageStructs = IMG_TRUE; @@ -3837,14 +3745,14 @@ PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID *pvCPUVAddr, psInfo->iNumPagesMapped++; - PVR_ASSERT(ulPFN == page_to_pfn(psInfo->ppsPages[i])); + PVR_ASSERT(ui32PFN == page_to_pfn(psInfo->ppsPages[i])); } - CPUPhysAddr.uiAddr = ulPFN << PAGE_SHIFT; - if ((CPUPhysAddr.uiAddr >> PAGE_SHIFT) != ulPFN) + CPUPhysAddr.uiAddr = ui32PFN << PAGE_SHIFT; + if ((CPUPhysAddr.uiAddr >> PAGE_SHIFT) != ui32PFN) { PVR_DPF((PVR_DBG_ERROR, - "OSAcquirePhysPageAddr: Page frame number out of range (%x)", ulPFN)); + "OSAcquirePhysPageAddr: Page frame number out of range (%x)", ui32PFN)); goto error; } @@ -3912,64 +3820,105 @@ error: return eError; } -typedef void (*InnerCacheOp_t)(const void *pvStart, const void *pvEnd); - -#if defined(__arm__) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) -typedef void (*OuterCacheOp_t)(phys_addr_t uStart, phys_addr_t uEnd); +#if ! defined(__arm__) +# define USE_VIRTUAL_CACHE_OP +#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0) +# define USE_VIRTUAL_CACHE_OP +# if defined(CONFIG_OUTER_CACHE) +# define USE_PHYSICAL_CACHE_OP +# endif #else -typedef void (*OuterCacheOp_t)(unsigned long ulStart, unsigned long ulEnd); +# define USE_PHYSICAL_CACHE_OP #endif -#if defined(CONFIG_OUTER_CACHE) +extern PVRSRV_LINUX_MUTEX g_sMMapMutex; + +/* g_sMMapMutex must be held while this function is called */ +static +IMG_VOID *FindMMapBaseVAddr(struct list_head *psMMapOffsetStructList, + IMG_VOID *pvRangeAddrStart, IMG_UINT32 ui32Length) +{ + PKV_OFFSET_STRUCT psOffsetStruct; + IMG_VOID *pvMinVAddr; + + /* There's no kernel-virtual for this type of allocation, so if + * we're flushing it, it must be user-virtual, and therefore + * have a mapping. + */ + list_for_each_entry(psOffsetStruct, psMMapOffsetStructList, sAreaItem) + { + if(OSGetCurrentProcessIDKM() != psOffsetStruct->ui32PID) + continue; + + pvMinVAddr = (IMG_VOID *)psOffsetStruct->uiUserVAddr; + + /* Within permissible range */ + if(pvRangeAddrStart >= pvMinVAddr && + ui32Length <= psOffsetStruct->uiRealByteSize) + return pvMinVAddr; + } + + return IMG_NULL; +} +#if defined(USE_PHYSICAL_CACHE_OP) + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39) +typedef void (*PhysicalCacheOp_t)(phys_addr_t uStart, phys_addr_t uEnd); +#else +typedef void (*PhysicalCacheOp_t)(unsigned long ulStart, unsigned long ulEnd); +#endif + +/* + Note: use IMG_CPU_PHYADDR to return CPU Phys Addresses, and not just 'unsigned long', + as this is not big enough to hold physical addresses on 32-bit PAE devices. +*/ typedef IMG_BOOL (*MemAreaToPhys_t)(LinuxMemArea *psLinuxMemArea, - IMG_VOID *pvRangeAddrStart, - IMG_UINT32 ui32PageNumOffset, - IMG_UINT32 ui32PageNum, - unsigned long *pulStart); + IMG_VOID *pvRangeAddrStart, + IMG_UINT32 ui32PageNumOffset, + IMG_UINT32 ui32PageNum, + IMG_CPU_PHYADDR *psStart); static IMG_BOOL VMallocAreaToPhys(LinuxMemArea *psLinuxMemArea, - IMG_VOID *pvRangeAddrStart, - IMG_UINT32 ui32PageNumOffset, - IMG_UINT32 ui32PageNum, - unsigned long *pulStart) + IMG_VOID *pvRangeAddrStart, + IMG_UINT32 ui32PageNumOffset, + IMG_UINT32 ui32PageNum, + IMG_CPU_PHYADDR *psStart) { - *pulStart = vmalloc_to_pfn(pvRangeAddrStart + ui32PageNum * PAGE_SIZE) << PAGE_SHIFT; + psStart->uiAddr = vmalloc_to_pfn(pvRangeAddrStart + ui32PageNum * PAGE_SIZE) << PAGE_SHIFT; return IMG_TRUE; } static IMG_BOOL ExternalKVAreaToPhys(LinuxMemArea *psLinuxMemArea, - IMG_VOID *pvRangeAddrStart, - IMG_UINT32 ui32PageNumOffset, - IMG_UINT32 ui32PageNum, - unsigned long *pulStart) + IMG_VOID *pvRangeAddrStart, + IMG_UINT32 ui32PageNumOffset, + IMG_UINT32 ui32PageNum, + IMG_CPU_PHYADDR *psStart) { IMG_SYS_PHYADDR SysPAddr; - IMG_CPU_PHYADDR CpuPAddr; SysPAddr = psLinuxMemArea->uData.sExternalKV.uPhysAddr.pSysPhysAddr[ui32PageNumOffset + ui32PageNum]; - CpuPAddr = SysSysPAddrToCpuPAddr(SysPAddr); - *pulStart = CpuPAddr.uiAddr; + *psStart = SysSysPAddrToCpuPAddr(SysPAddr); return IMG_TRUE; } static IMG_BOOL AllocPagesAreaToPhys(LinuxMemArea *psLinuxMemArea, - IMG_VOID *pvRangeAddrStart, - IMG_UINT32 ui32PageNumOffset, - IMG_UINT32 ui32PageNum, - unsigned long *pulStart) + IMG_VOID *pvRangeAddrStart, + IMG_UINT32 ui32PageNumOffset, + IMG_UINT32 ui32PageNum, + IMG_CPU_PHYADDR *psStart) { struct page *pPage; pPage = psLinuxMemArea->uData.sPageList.ppsPageList[ui32PageNumOffset + ui32PageNum]; - *pulStart = page_to_pfn(pPage) << PAGE_SHIFT; + psStart->uiAddr = page_to_pfn(pPage) << PAGE_SHIFT; return IMG_TRUE; } static IMG_BOOL AllocPagesSparseAreaToPhys(LinuxMemArea *psLinuxMemArea, - IMG_VOID *pvRangeAddrStart, - IMG_UINT32 ui32PageNumOffset, - IMG_UINT32 ui32PageNum, - unsigned long *pulStart) + IMG_VOID *pvRangeAddrStart, + IMG_UINT32 ui32PageNumOffset, + IMG_UINT32 ui32PageNum, + IMG_CPU_PHYADDR *psStart) { IMG_UINT32 ui32VirtOffset = (ui32PageNumOffset + ui32PageNum) << PAGE_SHIFT; IMG_UINT32 ui32PhysOffset; @@ -3979,82 +3928,80 @@ static IMG_BOOL AllocPagesSparseAreaToPhys(LinuxMemArea *psLinuxMemArea, { PVR_ASSERT(ui32PhysOffset <= ui32VirtOffset); pPage = psLinuxMemArea->uData.sPageList.ppsPageList[ui32PhysOffset >> PAGE_SHIFT]; - *pulStart = page_to_pfn(pPage) << PAGE_SHIFT; + psStart->uiAddr = page_to_pfn(pPage) << PAGE_SHIFT; return IMG_TRUE; } return IMG_FALSE; } - -static IMG_BOOL IONAreaToPhys(LinuxMemArea *psLinuxMemArea, - IMG_VOID *pvRangeAddrStart, - IMG_UINT32 ui32PageNumOffset, - IMG_UINT32 ui32PageNum, - unsigned long *pulStart) +static inline void DoPhysicalCacheOp(LinuxMemArea *psLinuxMemArea, + IMG_VOID *pvRangeAddrStart, + IMG_SIZE_T uiLength, + IMG_UINTPTR_T uPageNumOffset, + MemAreaToPhys_t pfnMemAreaToPhys, + PhysicalCacheOp_t pfnPhysicalCacheOp) { - IMG_CPU_PHYADDR CpuPAddr; - CpuPAddr = psLinuxMemArea->uData.sIONTilerAlloc.pCPUPhysAddrs[ui32PageNumOffset + ui32PageNum]; - *pulStart = CpuPAddr.uiAddr; - return IMG_TRUE; -} + IMG_CPU_PHYADDR sStart, sEnd; + unsigned long ulLength, ulStartOffset, ulEndOffset; + IMG_UINT32 i, ui32NumPages; + IMG_BOOL bValidPage; -#endif /* defined(CONFIG_OUTER_CACHE) */ + /* Length and offsets of flush region WRT page alignment */ + ulLength = (unsigned long)uiLength; + ulStartOffset = ((unsigned long)pvRangeAddrStart) & (PAGE_SIZE - 1); + ulEndOffset = ((unsigned long)pvRangeAddrStart + ulLength) & (PAGE_SIZE - 1); -/* g_sMMapMutex must be held while this function is called */ + /* The affected pages, rounded up */ + ui32NumPages = (ulStartOffset + ulLength + PAGE_SIZE - 1) >> PAGE_SHIFT; -static -IMG_VOID *FindMMapBaseVAddr(struct list_head *psMMapOffsetStructList, - IMG_VOID *pvRangeAddrStart, IMG_UINT32 ui32Length) -{ - PKV_OFFSET_STRUCT psOffsetStruct; - IMG_VOID *pvMinVAddr; - - /* There's no kernel-virtual for this type of allocation, so if - * we're flushing it, it must be user-virtual, and therefore - * have a mapping. - */ - list_for_each_entry(psOffsetStruct, psMMapOffsetStructList, sAreaItem) + for(i = 0; i < ui32NumPages; i++) { - if(OSGetCurrentProcessIDKM() != psOffsetStruct->ui32PID) - continue; + bValidPage = pfnMemAreaToPhys(psLinuxMemArea, pvRangeAddrStart, + uPageNumOffset, i, &sStart); + if (bValidPage) + { + sEnd.uiAddr = sStart.uiAddr + PAGE_SIZE; - pvMinVAddr = (IMG_VOID *)psOffsetStruct->ui32UserVAddr; + if(i == ui32NumPages - 1 && ulEndOffset != 0) + sEnd.uiAddr = sStart.uiAddr + ulEndOffset; - /* Within permissible range */ - if(pvRangeAddrStart >= pvMinVAddr && - ui32Length <= psOffsetStruct->ui32RealByteSize) - return pvMinVAddr; - } + if(i == 0) + sStart.uiAddr += ulStartOffset; - return IMG_NULL; + pfnPhysicalCacheOp(sStart.uiAddr, sEnd.uiAddr); + } + } } -extern PVRSRV_LINUX_MUTEX g_sMMapMutex; +#endif /* defined(USE_PHYSICAL_CACHE_OP) */ + +#if defined(USE_VIRTUAL_CACHE_OP) +typedef void (*VirtualCacheOp_t)(const void *pvStart, const void *pvEnd); -static inline void DoInnerCacheOp(IMG_HANDLE hOSMemHandle, - IMG_UINT32 ui32ByteOffset, - IMG_VOID *pvRangeAddrStart, - IMG_UINT32 ui32Length, - InnerCacheOp_t pfnInnerCacheOp) +static inline void DoVirtualCacheOp(IMG_HANDLE hOSMemHandle, + IMG_UINT32 ui32ByteOffset, + IMG_VOID *pvRangeAddrStart, + IMG_UINT32 ui32Length, + VirtualCacheOp_t pfnVirtualCacheOp) { LinuxMemArea *psLinuxMemArea = hOSMemHandle; if (!psLinuxMemArea->hBMHandle) { - pfnInnerCacheOp(pvRangeAddrStart, pvRangeAddrStart + ui32Length); + pfnVirtualCacheOp(pvRangeAddrStart, pvRangeAddrStart + ui32Length); } else { IMG_UINT32 ui32ByteRemain = ui32Length; - IMG_UINT32 ui32BytesToDo = PAGE_SIZE - (((IMG_UINT32) pvRangeAddrStart) & (~PAGE_MASK)); + IMG_UINT32 ui32BytesToDo = PAGE_SIZE - (((IMG_UINTPTR_T) pvRangeAddrStart) & (~PAGE_MASK)); IMG_UINT8 *pbDo = (IMG_UINT8 *) pvRangeAddrStart; while(ui32ByteRemain) { if (BM_MapPageAtOffset(psLinuxMemArea->hBMHandle, ui32ByteOffset + (ui32Length - ui32ByteRemain))) { - pfnInnerCacheOp(pbDo, pbDo + ui32BytesToDo); + pfnVirtualCacheOp(pbDo, pbDo + ui32BytesToDo); } pbDo += ui32BytesToDo; ui32ByteRemain -= ui32BytesToDo; @@ -4062,23 +4009,29 @@ static inline void DoInnerCacheOp(IMG_HANDLE hOSMemHandle, } } } +#endif /* defined(USE_VIRTUAL_CACHE_OP) */ static IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle, - IMG_UINT32 ui32ByteOffset, - IMG_VOID *pvRangeAddrStart, - IMG_UINT32 ui32Length, - InnerCacheOp_t pfnInnerCacheOp, - OuterCacheOp_t pfnOuterCacheOp) + IMG_UINT32 ui32ByteOffset, + IMG_VOID *pvVirtRangeStart, + IMG_SIZE_T uiLength +#if defined(USE_VIRTUAL_CACHE_OP) + , VirtualCacheOp_t pfnVirtualCacheOp +#endif +#if defined(USE_PHYSICAL_CACHE_OP) + , PhysicalCacheOp_t pfnPhysicalCacheOp +#endif + ) { LinuxMemArea *psLinuxMemArea = (LinuxMemArea *)hOSMemHandle; - IMG_UINT32 ui32AreaLength, ui32AreaOffset = 0; + IMG_UINTPTR_T uiAreaOffset = 0; struct list_head *psMMapOffsetStructList; IMG_VOID *pvMinVAddr; - -#if defined(CONFIG_OUTER_CACHE) +#if defined(USE_PHYSICAL_CACHE_OP) MemAreaToPhys_t pfnMemAreaToPhys = IMG_NULL; - IMG_UINT32 ui32PageNumOffset = 0; + IMG_UINTPTR_T uPageNumOffset = 0; + IMG_VOID *pvPhysRangeStart = pvVirtRangeStart; #endif PVR_ASSERT(psLinuxMemArea != IMG_NULL); @@ -4086,7 +4039,6 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle, LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); psMMapOffsetStructList = &psLinuxMemArea->sMMapOffsetStructList; - ui32AreaLength = psLinuxMemArea->ui32ByteSize; /* Don't check the length in the case of sparse mappings as @@ -4094,12 +4046,12 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle, */ if (!psLinuxMemArea->hBMHandle) { - PVR_ASSERT(ui32Length <= ui32AreaLength); + PVR_ASSERT(uiLength <= psLinuxMemArea->uiByteSize); } if(psLinuxMemArea->eAreaType == LINUX_MEM_AREA_SUB_ALLOC) { - ui32AreaOffset = psLinuxMemArea->uData.sSubAlloc.ui32ByteOffset; + uiAreaOffset = psLinuxMemArea->uData.sSubAlloc.uiByteOffset; psLinuxMemArea = psLinuxMemArea->uData.sSubAlloc.psParentLinuxMemArea; } @@ -4110,19 +4062,13 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle, { case LINUX_MEM_AREA_VMALLOC: { - if(is_vmalloc_addr(pvRangeAddrStart)) + if(is_vmalloc_addr(pvVirtRangeStart)) { - pvMinVAddr = psLinuxMemArea->uData.sVmalloc.pvVmallocAddress + ui32AreaOffset; + pvMinVAddr = psLinuxMemArea->uData.sVmalloc.pvVmallocAddress + uiAreaOffset; /* Outside permissible range */ - if(pvRangeAddrStart < pvMinVAddr) + if(pvVirtRangeStart < pvMinVAddr) goto err_blocked; - - DoInnerCacheOp(hOSMemHandle, - ui32ByteOffset, - pvRangeAddrStart, - ui32Length, - pfnInnerCacheOp); } else { @@ -4132,17 +4078,11 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle, */ pvMinVAddr = FindMMapBaseVAddr(psMMapOffsetStructList, - pvRangeAddrStart, ui32Length); + pvVirtRangeStart, uiLength); if(!pvMinVAddr) goto err_blocked; - DoInnerCacheOp(hOSMemHandle, - ui32ByteOffset, - pvRangeAddrStart, - ui32Length, - pfnInnerCacheOp); - -#if defined(CONFIG_OUTER_CACHE) +#if defined(USE_PHYSICAL_CACHE_OP) /* * We don't need to worry about cache aliasing here because * we have already flushed the virtually-indexed caches (L1 @@ -4151,14 +4091,10 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle, * The vmalloc address will only be used to determine * affected physical pages for outer cache flushing. */ - pvRangeAddrStart = psLinuxMemArea->uData.sVmalloc.pvVmallocAddress + - (ui32AreaOffset & PAGE_MASK) + (pvRangeAddrStart - pvMinVAddr); - } - - pfnMemAreaToPhys = VMallocAreaToPhys; -#else /* defined(CONFIG_OUTER_CACHE) */ + pvPhysRangeStart = psLinuxMemArea->uData.sVmalloc.pvVmallocAddress + + (uiAreaOffset & PAGE_MASK) + (pvVirtRangeStart - pvMinVAddr); +#endif } -#endif /* defined(CONFIG_OUTER_CACHE) */ break; } @@ -4183,111 +4119,80 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle, } pvMinVAddr = FindMMapBaseVAddr(psMMapOffsetStructList, - pvRangeAddrStart, ui32Length); + pvVirtRangeStart, uiLength); if(!pvMinVAddr) goto err_blocked; - DoInnerCacheOp(hOSMemHandle, - ui32ByteOffset, - pvRangeAddrStart, - ui32Length, - pfnInnerCacheOp); - -#if defined(CONFIG_OUTER_CACHE) - ui32PageNumOffset = ((ui32AreaOffset & PAGE_MASK) + (pvRangeAddrStart - pvMinVAddr)) >> PAGE_SHIFT; - pfnMemAreaToPhys = ExternalKVAreaToPhys; -#endif break; } - case LINUX_MEM_AREA_ION: + case LINUX_MEM_AREA_ALLOC_PAGES: { pvMinVAddr = FindMMapBaseVAddr(psMMapOffsetStructList, - pvRangeAddrStart, ui32Length); + pvVirtRangeStart, uiLength); if(!pvMinVAddr) goto err_blocked; - DoInnerCacheOp(hOSMemHandle, - ui32ByteOffset, - pvRangeAddrStart, - ui32Length, - pfnInnerCacheOp); + break; + } -#if defined(CONFIG_OUTER_CACHE) - ui32PageNumOffset = ((ui32AreaOffset & PAGE_MASK) + (pvRangeAddrStart - pvMinVAddr)) >> PAGE_SHIFT; - pfnMemAreaToPhys = IONAreaToPhys; -#endif + default: + PVR_DBG_BREAK; + goto err_blocked; + } + +#if defined(USE_PHYSICAL_CACHE_OP) + switch(psLinuxMemArea->eAreaType) + { + case LINUX_MEM_AREA_VMALLOC: + { + pfnMemAreaToPhys = VMallocAreaToPhys; break; } - case LINUX_MEM_AREA_ALLOC_PAGES: + case LINUX_MEM_AREA_EXTERNAL_KV: { - pvMinVAddr = FindMMapBaseVAddr(psMMapOffsetStructList, - pvRangeAddrStart, ui32Length); - if(!pvMinVAddr) - goto err_blocked; + uPageNumOffset = ((uiAreaOffset & PAGE_MASK) + (pvPhysRangeStart - pvMinVAddr)) >> PAGE_SHIFT; + pfnMemAreaToPhys = ExternalKVAreaToPhys; + break; + } - DoInnerCacheOp(hOSMemHandle, - ui32ByteOffset, - pvRangeAddrStart, - ui32Length, - pfnInnerCacheOp); + case LINUX_MEM_AREA_ALLOC_PAGES: + { + uPageNumOffset = ((uiAreaOffset & PAGE_MASK) + (pvPhysRangeStart - pvMinVAddr)) >> PAGE_SHIFT; -#if defined(CONFIG_OUTER_CACHE) - ui32PageNumOffset = ((ui32AreaOffset & PAGE_MASK) + (pvRangeAddrStart - pvMinVAddr)) >> PAGE_SHIFT; if (psLinuxMemArea->hBMHandle) - { pfnMemAreaToPhys = AllocPagesSparseAreaToPhys; - } else - { pfnMemAreaToPhys = AllocPagesAreaToPhys; - } -#endif + break; } default: PVR_DBG_BREAK; } +#endif + +#if defined(USE_VIRTUAL_CACHE_OP) + DoVirtualCacheOp(hOSMemHandle, + ui32ByteOffset, + pvVirtRangeStart, + uiLength, + pfnVirtualCacheOp); +#endif LinuxUnLockMutex(&g_sMMapMutex); -#if defined(CONFIG_OUTER_CACHE) +#if defined(USE_PHYSICAL_CACHE_OP) PVR_ASSERT(pfnMemAreaToPhys != IMG_NULL); - /* Outer caches need some more work, to get a list of physical addresses */ - { - unsigned long ulStart, ulEnd, ulLength, ulStartOffset, ulEndOffset; - IMG_UINT32 i, ui32NumPages; - IMG_BOOL bValidPage; - - /* Length and offsets of flush region WRT page alignment */ - ulLength = (unsigned long)ui32Length; - ulStartOffset = ((unsigned long)pvRangeAddrStart) & (PAGE_SIZE - 1); - ulEndOffset = ((unsigned long)pvRangeAddrStart + ulLength) & (PAGE_SIZE - 1); - - /* The affected pages, rounded up */ - ui32NumPages = (ulStartOffset + ulLength + PAGE_SIZE - 1) >> PAGE_SHIFT; - - for(i = 0; i < ui32NumPages; i++) - { - bValidPage = pfnMemAreaToPhys(psLinuxMemArea, pvRangeAddrStart, - ui32PageNumOffset, i, &ulStart); - if (bValidPage) - { - ulEnd = ulStart + PAGE_SIZE; - - if(i == ui32NumPages - 1 && ulEndOffset != 0) - ulEnd = ulStart + ulEndOffset; - - if(i == 0) - ulStart += ulStartOffset; - - pfnOuterCacheOp(ulStart, ulEnd); - } - } - } + DoPhysicalCacheOp(psLinuxMemArea, + pvPhysRangeStart, + uiLength, + uPageNumOffset, + pfnMemAreaToPhys, + pfnPhysicalCacheOp); #endif return IMG_TRUE; @@ -4295,13 +4200,13 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle, err_blocked: PVR_DPF((PVR_DBG_WARNING, "%s: Blocked cache op on virtual range " "%p-%p (type %d)", __func__, - pvRangeAddrStart, pvRangeAddrStart + ui32Length, + pvVirtRangeStart, pvVirtRangeStart + uiLength, psLinuxMemArea->eAreaType)); LinuxUnLockMutex(&g_sMMapMutex); return IMG_FALSE; } -#if defined(__i386__) +#if defined(__i386__) || defined (__x86_64__) #define ROUND_UP(x,a) (((x) + (a) - 1) & ~((a) - 1)) @@ -4346,7 +4251,7 @@ IMG_BOOL OSFlushCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, { /* Write-back and invalidate */ return CheckExecuteCacheOp(hOSMemHandle, ui32ByteOffset, pvRangeAddrStart, ui32Length, - x86_flush_cache_range, IMG_NULL); + x86_flush_cache_range); } IMG_BOOL OSCleanCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, @@ -4356,7 +4261,7 @@ IMG_BOOL OSCleanCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, { /* No clean feature on x86 */ return CheckExecuteCacheOp(hOSMemHandle, ui32ByteOffset, pvRangeAddrStart, ui32Length, - x86_flush_cache_range, IMG_NULL); + x86_flush_cache_range); } IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, @@ -4366,12 +4271,10 @@ IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, { /* No invalidate-only support */ return CheckExecuteCacheOp(hOSMemHandle, ui32ByteOffset, pvRangeAddrStart, ui32Length, - x86_flush_cache_range, IMG_NULL); + x86_flush_cache_range); } -#else /* defined(__i386__) */ - -#if defined(__arm__) +#elif defined(__arm__) static void per_cpu_cache_flush(void *arg) { @@ -4411,6 +4314,8 @@ static inline size_t pvr_dmac_range_len(const void *pvStart, const void *pvEnd) } #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0) + static void pvr_dmac_inv_range(const void *pvStart, const void *pvEnd) { #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)) @@ -4429,14 +4334,41 @@ static void pvr_dmac_clean_range(const void *pvStart, const void *pvEnd) #endif } +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0) */ + +static void pvr_flush_range(phys_addr_t pStart, phys_addr_t pEnd) +{ + arm_dma_ops.sync_single_for_device(NULL, pStart, pEnd - pStart, DMA_TO_DEVICE); + arm_dma_ops.sync_single_for_cpu(NULL, pStart, pEnd - pStart, DMA_FROM_DEVICE); +} + +static void pvr_clean_range(phys_addr_t pStart, phys_addr_t pEnd) +{ + arm_dma_ops.sync_single_for_device(NULL, pStart, pEnd - pStart, DMA_TO_DEVICE); +} + +static void pvr_invalidate_range(phys_addr_t pStart, phys_addr_t pEnd) +{ + arm_dma_ops.sync_single_for_cpu(NULL, pStart, pEnd - pStart, DMA_FROM_DEVICE); +} + +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0) */ + IMG_BOOL OSFlushCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, IMG_UINT32 ui32ByteOffset, IMG_VOID *pvRangeAddrStart, IMG_UINT32 ui32Length) { return CheckExecuteCacheOp(hOSMemHandle, ui32ByteOffset, - pvRangeAddrStart, ui32Length, - dmac_flush_range, outer_flush_range); + pvRangeAddrStart, ui32Length, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0) + pvr_flush_range +#elif defined(CONFIG_OUTER_CACHE) + dmac_flush_range, outer_flush_range +#else + dmac_flush_range +#endif + ); } IMG_BOOL OSCleanCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, @@ -4445,8 +4377,15 @@ IMG_BOOL OSCleanCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, IMG_UINT32 ui32Length) { return CheckExecuteCacheOp(hOSMemHandle, ui32ByteOffset, - pvRangeAddrStart, ui32Length, - pvr_dmac_clean_range, outer_clean_range); + pvRangeAddrStart, ui32Length, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0) + pvr_clean_range +#elif defined(CONFIG_OUTER_CACHE) + pvr_dmac_clean_range, outer_clean_range +#else + pvr_dmac_clean_range +#endif + ); } IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, @@ -4455,13 +4394,18 @@ IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, IMG_UINT32 ui32Length) { return CheckExecuteCacheOp(hOSMemHandle, ui32ByteOffset, - pvRangeAddrStart, ui32Length, - pvr_dmac_inv_range, outer_inv_range); + pvRangeAddrStart, ui32Length, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0) + pvr_invalidate_range +#elif defined(CONFIG_OUTER_CACHE) + pvr_dmac_inv_range, outer_inv_range +#else + pvr_dmac_inv_range +#endif + ); } -#else /* defined(__arm__) */ - -#if defined(__mips__) +#elif defined(__mips__) /* * dmac cache functions are supposed to be used for dma * memory which comes from dma-able memory. However examining @@ -4524,7 +4468,7 @@ IMG_BOOL OSFlushCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, { return CheckExecuteCacheOp(hOSMemHandle, ui32ByteOffset, pvRangeAddrStart, ui32Length, - pvr_dma_cache_wback_inv, IMG_NULL); + pvr_dma_cache_wback_inv); } IMG_BOOL OSCleanCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, @@ -4534,7 +4478,7 @@ IMG_BOOL OSCleanCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, { return CheckExecuteCacheOp(hOSMemHandle, ui32ByteOffset, pvRangeAddrStart, ui32Length, - pvr_dma_cache_wback, IMG_NULL); + pvr_dma_cache_wback); } IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, @@ -4544,18 +4488,14 @@ IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, { return CheckExecuteCacheOp(hOSMemHandle, ui32ByteOffset, pvRangeAddrStart, ui32Length, - pvr_dma_cache_inv, IMG_NULL); + pvr_dma_cache_inv); } -#else /* defined(__mips__) */ +#else #error "Implement CPU cache flush/clean/invalidate primitives for this CPU!" -#endif /* defined(__mips__) */ - -#endif /* defined(__arm__) */ - -#endif /* defined(__i386__) */ +#endif typedef struct _AtomicStruct { diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/osperproc.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/osperproc.c index a22b461..3485d8a 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/osperproc.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/osperproc.c @@ -43,12 +43,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "osperproc.h" #include "env_perproc.h" -#include "proc.h" -#if defined (SUPPORT_ION) -#include "linux/ion.h" -extern struct ion_device *psIonDev; +#if defined (SUPPORT_ION) +#include <linux/err.h> +#include "ion.h" +extern struct ion_device *gpsIonDev; #endif + extern IMG_UINT32 gui32ReleasePID; PVRSRV_ERROR OSPerProcessPrivateDataInit(IMG_HANDLE *phOsPrivateData) @@ -83,12 +84,11 @@ PVRSRV_ERROR OSPerProcessPrivateDataInit(IMG_HANDLE *phOsPrivateData) /* Linked list of PVRSRV_FILE_PRIVATE_DATA structures */ INIT_LIST_HEAD(&psEnvPerProc->sDRMAuthListHead); #endif + #if defined(SUPPORT_ION) OSSNPrintf(psEnvPerProc->azIonClientName, ION_CLIENT_NAME_SIZE, "pvr_ion_client-%d", OSGetCurrentProcessIDKM()); psEnvPerProc->psIONClient = - ion_client_create(psIonDev, - 1 << ION_HEAP_TYPE_SYSTEM_CONTIG | - 1 << ION_HEAP_TYPE_SYSTEM, + ion_client_create(gpsIonDev, psEnvPerProc->azIonClientName); if (IS_ERR_OR_NULL(psEnvPerProc->psIONClient)) @@ -97,7 +97,8 @@ PVRSRV_ERROR OSPerProcessPrivateDataInit(IMG_HANDLE *phOsPrivateData) "ion client for per process data")); return PVRSRV_ERROR_OUT_OF_MEMORY; } -#endif /* SUPPORT_ION */ +#endif /* defined(SUPPORT_ION) */ + return PVRSRV_OK; } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pdump.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pdump.c index 0124737..548e8dc 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pdump.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pdump.c @@ -62,6 +62,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <linux/kernel.h> // sprintf #include <linux/string.h> // strncpy, strlen +#include <linux/mutex.h> static IMG_BOOL PDumpWriteString2 (IMG_CHAR * pszString, IMG_UINT32 ui32Flags); static IMG_BOOL PDumpWriteILock (PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32Count, IMG_UINT32 ui32Flags); @@ -80,7 +81,8 @@ static atomic_t gsPDumpSuspended = ATOMIC_INIT(0); static PDBGKM_SERVICE_TABLE gpfnDbgDrv = IMG_NULL; - +DEFINE_MUTEX(sPDumpLock); +DEFINE_MUTEX(sPDumpMsgLock); IMG_CHAR *pszStreamName[PDUMP_NUM_STREAMS] = { "ParamStream2", "ScriptStream2", @@ -391,7 +393,7 @@ IMG_VOID PDumpOSCPUVAddrToDevPAddr(PVRSRV_DEVICE_TYPE eDeviceType, IMG_VOID PDumpOSCPUVAddrToPhysPages(IMG_HANDLE hOSMemHandle, IMG_UINT32 ui32Offset, IMG_PUINT8 pui8LinAddr, - IMG_UINT32 ui32DataPageMask, + IMG_UINTPTR_T ui32DataPageMask, IMG_UINT32 *pui32PageOffset) { if(hOSMemHandle) @@ -411,7 +413,7 @@ IMG_VOID PDumpOSCPUVAddrToPhysPages(IMG_HANDLE hOSMemHandle, PVR_UNREFERENCED_PARAMETER(hOSMemHandle); PVR_UNREFERENCED_PARAMETER(ui32Offset); - *pui32PageOffset = ((IMG_UINT32)pui8LinAddr & ui32DataPageMask); + *pui32PageOffset = ((IMG_UINTPTR_T)pui8LinAddr & ui32DataPageMask); } } @@ -724,7 +726,7 @@ static IMG_BOOL PDumpWriteILock(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_U IMG_UINT32 ui32Written = 0; if ((psStream == IMG_NULL) || PDumpSuspended() || ((ui32Flags & PDUMP_FLAGS_NEVER) != 0)) { - PVR_DPF((PVR_DBG_MESSAGE, "PDumpWriteILock: Failed to write 0x%x bytes to stream 0x%x", ui32Count, (IMG_UINT32)psStream)); + PVR_DPF((PVR_DBG_MESSAGE, "PDumpWriteILock: Failed to write 0x%x bytes to stream 0x%p", ui32Count, psStream)); return IMG_TRUE; } @@ -797,6 +799,55 @@ IMG_VOID PDumpResumeKM(IMG_VOID) atomic_dec(&gsPDumpSuspended); } +/* Set to 1 if you want to debug PDump locking issues */ +#define DEBUG_PDUMP_LOCKS 0 + +#if DEBUG_PDUMP_LOCKS +static IMG_UINT32 ui32Count=0; +static IMG_UINT32 aui32LockLine[2] = {0}; +static IMG_UINT32 aui32UnlockLine[2] = {0}; +static IMG_UINT32 ui32LockLineCount = 0; +static IMG_UINT32 ui32UnlockLineCount = 0; +#endif + +IMG_VOID PDumpOSLock(IMG_UINT32 ui32Line) +{ +#if DEBUG_PDUMP_LOCKS + aui32LockLine[ui32LockLineCount++ % 2] = ui32Line; + ui32Count++; + if (ui32Count == 2) + { + IMG_UINT32 i; + printk(KERN_ERR "Double lock\n"); + dump_stack(); + for (i=0;i<2;i++) + { + printk(KERN_ERR "Lock[%d] = %d, Unlock[%d] = %d\n", i, aui32LockLine[i],i, aui32UnlockLine[i]); + } + } +#endif + mutex_lock(&sPDumpLock); +} + +IMG_VOID PDumpOSUnlock(IMG_UINT32 ui32Line) +{ + mutex_unlock(&sPDumpLock); +#if DEBUG_PDUMP_LOCKS + aui32UnlockLine[ui32UnlockLineCount++ % 2] = ui32Line; + ui32Count--; +#endif +} + +IMG_VOID PDumpOSLockMessageBuffer(IMG_VOID) +{ + mutex_lock(&sPDumpMsgLock); +} + +IMG_VOID PDumpOSUnlockMessageBuffer(IMG_VOID) +{ + mutex_unlock(&sPDumpMsgLock); +} + #endif /* #if defined (PDUMP) */ #endif /* #if defined (SUPPORT_SGX) */ /***************************************************************************** diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/private_data.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/private_data.h index 6b09705..e2a6c74 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/private_data.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/private_data.h @@ -64,11 +64,7 @@ typedef struct IMG_UINT32 ui32OpenPID; /* Global kernel MemInfo handle */ -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hKernelMemInfo; -#else IMG_HANDLE hKernelMemInfo; -#endif #if defined(SUPPORT_DRI_DRM) && defined(PVR_SECURE_DRM_AUTH_EXPORT) /* The private data is on a list in the per-process data structure */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/proc.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/proc.c index 7307257..788757b 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/proc.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/proc.c @@ -52,11 +52,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <linux/init.h> #include <linux/module.h> -#include <linux/mm.h> #include <linux/fs.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> -#include <linux/sched.h> #include "services_headers.h" @@ -72,16 +70,25 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "lists.h" +struct pvr_proc_dir_entry { + struct proc_dir_entry *pde; + + pvr_next_proc_seq_t *next; + pvr_show_proc_seq_t *show; + pvr_off2element_proc_seq_t *off2element; + pvr_startstop_proc_seq_t *startstop; + + pvr_proc_write_t *write; + + IMG_VOID *data; +}; + // The proc entry for our /proc/pvr directory static struct proc_dir_entry * dir; static const IMG_CHAR PVRProcDirRoot[] = "pvr"; static IMG_INT pvr_proc_open(struct inode *inode,struct file *file); -static void *pvr_proc_seq_start (struct seq_file *m, loff_t *pos); -static void pvr_proc_seq_stop (struct seq_file *m, void *v); -static void *pvr_proc_seq_next (struct seq_file *m, void *v, loff_t *pos); -static int pvr_proc_seq_show (struct seq_file *m, void *v); static ssize_t pvr_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos); static struct file_operations pvr_proc_operations = @@ -93,6 +100,11 @@ static struct file_operations pvr_proc_operations = .release = seq_release, }; +static void *pvr_proc_seq_start (struct seq_file *m, loff_t *pos); +static void *pvr_proc_seq_next (struct seq_file *m, void *v, loff_t *pos); +static void pvr_proc_seq_stop (struct seq_file *m, void *v); +static int pvr_proc_seq_show (struct seq_file *m, void *v); + static struct seq_operations pvr_proc_seq_operations = { .start = pvr_proc_seq_start, @@ -101,16 +113,18 @@ static struct seq_operations pvr_proc_seq_operations = .show = pvr_proc_seq_show, }; -static struct proc_dir_entry* g_pProcQueue; -static struct proc_dir_entry* g_pProcVersion; -static struct proc_dir_entry* g_pProcSysNodes; +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) +static struct pvr_proc_dir_entry* g_pProcQueue; +#endif +static struct pvr_proc_dir_entry* g_pProcVersion; +static struct pvr_proc_dir_entry* g_pProcSysNodes; #ifdef DEBUG -static struct proc_dir_entry* g_pProcDebugLevel; +static struct pvr_proc_dir_entry* g_pProcDebugLevel; #endif #ifdef PVR_MANUAL_POWER_CONTROL -static struct proc_dir_entry* g_pProcPowerLevel; +static struct pvr_proc_dir_entry* g_pProcPowerLevel; #endif @@ -119,55 +133,12 @@ static void ProcSeqShowVersion(struct seq_file *sfile,void* el); static void ProcSeqShowSysNodes(struct seq_file *sfile,void* el); static void* ProcSeqOff2ElementSysNodes(struct seq_file * sfile, loff_t off); -/*! -****************************************************************************** - - @Function : printAppend - - @Description - - Print into the supplied buffer at the specified offset remaining within - the specified total buffer size. - - @Input size : the total size of the buffer - - @Input off : the offset into the buffer to start printing - - @Input format : the printf format string - - @Input ... : format args - @Return : The number of chars now in the buffer (original value of 'off' - plus number of chars added); 'size' if full. - -*****************************************************************************/ -off_t printAppend(IMG_CHAR * buffer, size_t size, off_t off, const IMG_CHAR * format, ...) -{ - IMG_INT n; - size_t space = size - (size_t)off; - va_list ap; - - va_start (ap, format); - - n = vsnprintf (buffer+off, space, format, ap); - - va_end (ap); - /* According to POSIX, n is greater than or equal to the size available if - * the print would have overflowed the buffer. Other platforms may - * return -1 if printing was truncated. - */ - if (n >= (IMG_INT)space || n < 0) - { - /* Ensure final string is terminated */ - buffer[size - 1] = 0; - return (off_t)(size - 1); - } - else - { - return (off + (off_t)n); - } -} +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) +#define PDE_DATA(x) PDE(x)->data; +#endif +#ifdef DEBUG /*! ****************************************************************************** @@ -186,7 +157,7 @@ off_t printAppend(IMG_CHAR * buffer, size_t size, off_t off, const IMG_CHAR * fo @Return : Pointer to element to be shown. *****************************************************************************/ -void* ProcSeq1ElementOff2Element(struct seq_file *sfile, loff_t off) +static void* ProcSeq1ElementOff2Element(struct seq_file *sfile, loff_t off) { PVR_UNREFERENCED_PARAMETER(sfile); // Return anything that is not PVR_RPOC_SEQ_START_TOKEN and NULL @@ -195,6 +166,7 @@ void* ProcSeq1ElementOff2Element(struct seq_file *sfile, loff_t off) return NULL; } +#endif /*! ****************************************************************************** @@ -213,7 +185,7 @@ void* ProcSeq1ElementOff2Element(struct seq_file *sfile, loff_t off) @Return : Pointer to element to be shown. *****************************************************************************/ -void* ProcSeq1ElementHeaderOff2Element(struct seq_file *sfile, loff_t off) +static void* ProcSeq1ElementHeaderOff2Element(struct seq_file *sfile, loff_t off) { PVR_UNREFERENCED_PARAMETER(sfile); @@ -251,10 +223,10 @@ static IMG_INT pvr_proc_open(struct inode *inode,struct file *file) IMG_INT ret = seq_open(file, &pvr_proc_seq_operations); struct seq_file *seq = (struct seq_file*)file->private_data; - struct proc_dir_entry* pvr_proc_entry = PDE(inode); + struct pvr_proc_dir_entry* ppde = PDE_DATA(inode); /* Add pointer to handlers to seq_file structure */ - seq->private = pvr_proc_entry->data; + seq->private = ppde; return ret; } @@ -273,15 +245,15 @@ static ssize_t pvr_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { struct inode *inode = file->f_path.dentry->d_inode; - struct proc_dir_entry * dp; + struct pvr_proc_dir_entry * ppde; PVR_UNREFERENCED_PARAMETER(ppos); - dp = PDE(inode); + ppde = PDE_DATA(inode); - if (!dp->write_proc) + if (!ppde->write) return -EIO; - return dp->write_proc(file, buffer, count, dp->data); + return ppde->write(file, buffer, count, ppde->data); } @@ -304,10 +276,10 @@ static ssize_t pvr_proc_write(struct file *file, const char __user *buffer, *****************************************************************************/ static void *pvr_proc_seq_start (struct seq_file *proc_seq_file, loff_t *pos) { - PVR_PROC_SEQ_HANDLERS *handlers = (PVR_PROC_SEQ_HANDLERS*)proc_seq_file->private; - if(handlers->startstop != NULL) - handlers->startstop(proc_seq_file, IMG_TRUE); - return handlers->off2element(proc_seq_file, *pos); + struct pvr_proc_dir_entry *ppde = (struct pvr_proc_dir_entry*)proc_seq_file->private; + if(ppde->startstop != NULL) + ppde->startstop(proc_seq_file, IMG_TRUE); + return ppde->off2element(proc_seq_file, *pos); } /*! @@ -326,11 +298,11 @@ static void *pvr_proc_seq_start (struct seq_file *proc_seq_file, loff_t *pos) *****************************************************************************/ static void pvr_proc_seq_stop (struct seq_file *proc_seq_file, void *v) { - PVR_PROC_SEQ_HANDLERS *handlers = (PVR_PROC_SEQ_HANDLERS*)proc_seq_file->private; + struct pvr_proc_dir_entry *ppde = (struct pvr_proc_dir_entry*)proc_seq_file->private; PVR_UNREFERENCED_PARAMETER(v); - if(handlers->startstop != NULL) - handlers->startstop(proc_seq_file, IMG_FALSE); + if(ppde->startstop != NULL) + ppde->startstop(proc_seq_file, IMG_FALSE); } /*! @@ -354,11 +326,11 @@ static void pvr_proc_seq_stop (struct seq_file *proc_seq_file, void *v) *****************************************************************************/ static void *pvr_proc_seq_next (struct seq_file *proc_seq_file, void *v, loff_t *pos) { - PVR_PROC_SEQ_HANDLERS *handlers = (PVR_PROC_SEQ_HANDLERS*)proc_seq_file->private; + struct pvr_proc_dir_entry *ppde = (struct pvr_proc_dir_entry*)proc_seq_file->private; (*pos)++; - if( handlers->next != NULL) - return handlers->next( proc_seq_file, v, *pos ); - return handlers->off2element(proc_seq_file, *pos); + if(ppde->next != NULL) + return ppde->next( proc_seq_file, v, *pos ); + return ppde->off2element(proc_seq_file, *pos); } /*! @@ -380,9 +352,9 @@ static void *pvr_proc_seq_next (struct seq_file *proc_seq_file, void *v, loff_t *****************************************************************************/ static int pvr_proc_seq_show (struct seq_file *proc_seq_file, void *v) { - PVR_PROC_SEQ_HANDLERS *handlers = (PVR_PROC_SEQ_HANDLERS*)proc_seq_file->private; - handlers->show( proc_seq_file,v ); - return 0; + struct pvr_proc_dir_entry *ppde = (struct pvr_proc_dir_entry*)proc_seq_file->private; + ppde->show( proc_seq_file,v ); + return 0; } @@ -419,69 +391,60 @@ static int pvr_proc_seq_show (struct seq_file *proc_seq_file, void *v) *****************************************************************************/ -static struct proc_dir_entry* CreateProcEntryInDirSeq( - struct proc_dir_entry *pdir, - const IMG_CHAR * name, - IMG_VOID* data, - pvr_next_proc_seq_t next_handler, - pvr_show_proc_seq_t show_handler, - pvr_off2element_proc_seq_t off2element_handler, - pvr_startstop_proc_seq_t startstop_handler, - write_proc_t whandler - ) +static struct pvr_proc_dir_entry* CreateProcEntryInDirSeq(struct proc_dir_entry *pdir, + const IMG_CHAR * name, + IMG_VOID* data, + pvr_next_proc_seq_t next_handler, + pvr_show_proc_seq_t show_handler, + pvr_off2element_proc_seq_t off2element_handler, + pvr_startstop_proc_seq_t startstop_handler, + pvr_proc_write_t whandler) { - struct proc_dir_entry * file; + struct pvr_proc_dir_entry * ppde; mode_t mode; - if (!dir) - { - PVR_DPF((PVR_DBG_ERROR, "CreateProcEntryInDirSeq: cannot make proc entry /proc/%s/%s: no parent", PVRProcDirRoot, name)); - return NULL; - } + if (!dir) + { + PVR_DPF((PVR_DBG_ERROR, "CreateProcEntryInDirSeq: cannot make proc entry /proc/%s/%s: no parent", PVRProcDirRoot, name)); + return NULL; + } mode = S_IFREG; - if (show_handler) - { + if (show_handler) + { mode |= S_IRUGO; - } + } - if (whandler) - { + if (whandler) + { mode |= S_IWUSR; - } - - file=create_proc_entry(name, mode, pdir); - - if (file) - { - PVR_PROC_SEQ_HANDLERS *seq_handlers; + } -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) - file->owner = THIS_MODULE; -#endif + ppde = kmalloc(sizeof(struct pvr_proc_dir_entry), GFP_KERNEL); + if (!ppde) + { + PVR_DPF((PVR_DBG_ERROR, "CreateProcEntryInDirSeq: cannot make proc entry /proc/%s/%s: no memory", PVRProcDirRoot, name)); + return NULL; + } + + ppde->next = next_handler; + ppde->show = show_handler; + ppde->off2element = off2element_handler; + ppde->startstop = startstop_handler; + ppde->write = whandler; + ppde->data = data; - file->proc_fops = &pvr_proc_operations; - file->write_proc = whandler; - - /* Pass the handlers */ - file->data = kmalloc(sizeof(PVR_PROC_SEQ_HANDLERS), GFP_KERNEL); - if(file->data) - { - seq_handlers = (PVR_PROC_SEQ_HANDLERS*)file->data; - seq_handlers->next = next_handler; - seq_handlers->show = show_handler; - seq_handlers->off2element = off2element_handler; - seq_handlers->startstop = startstop_handler; - seq_handlers->data = data; - - return file; - } - } + ppde->pde=proc_create_data(name, mode, pdir, &pvr_proc_operations, ppde); - PVR_DPF((PVR_DBG_ERROR, "CreateProcEntryInDirSeq: cannot make proc entry /proc/%s/%s: no memory", PVRProcDirRoot, name)); - return NULL; + if (!ppde->pde) + { + PVR_DPF((PVR_DBG_ERROR, "CreateProcEntryInDirSeq: cannot make proc entry /proc/%s/%s: proc_create_data failed", PVRProcDirRoot, name)); + kfree(ppde); + return NULL; + } + return ppde; } @@ -514,22 +477,20 @@ static struct proc_dir_entry* CreateProcEntryInDirSeq( @Return Ptr to proc entry , 0 for failure *****************************************************************************/ -struct proc_dir_entry* CreateProcReadEntrySeq ( - const IMG_CHAR * name, - IMG_VOID* data, - pvr_next_proc_seq_t next_handler, - pvr_show_proc_seq_t show_handler, - pvr_off2element_proc_seq_t off2element_handler, - pvr_startstop_proc_seq_t startstop_handler - ) +struct pvr_proc_dir_entry* CreateProcReadEntrySeq (const IMG_CHAR * name, + IMG_VOID* data, + pvr_next_proc_seq_t next_handler, + pvr_show_proc_seq_t show_handler, + pvr_off2element_proc_seq_t off2element_handler, + pvr_startstop_proc_seq_t startstop_handler) { return CreateProcEntrySeq(name, - data, - next_handler, - show_handler, - off2element_handler, - startstop_handler, - NULL); + data, + next_handler, + show_handler, + off2element_handler, + startstop_handler, + NULL); } /*! @@ -566,26 +527,22 @@ struct proc_dir_entry* CreateProcReadEntrySeq ( @Return Ptr to proc entry , 0 for failure *****************************************************************************/ -struct proc_dir_entry* CreateProcEntrySeq ( - const IMG_CHAR * name, - IMG_VOID* data, - pvr_next_proc_seq_t next_handler, - pvr_show_proc_seq_t show_handler, - pvr_off2element_proc_seq_t off2element_handler, - pvr_startstop_proc_seq_t startstop_handler, - write_proc_t whandler - ) +struct pvr_proc_dir_entry* CreateProcEntrySeq (const IMG_CHAR * name, + IMG_VOID* data, + pvr_next_proc_seq_t next_handler, + pvr_show_proc_seq_t show_handler, + pvr_off2element_proc_seq_t off2element_handler, + pvr_startstop_proc_seq_t startstop_handler, + pvr_proc_write_t whandler) { - return CreateProcEntryInDirSeq( - dir, - name, - data, - next_handler, - show_handler, - off2element_handler, - startstop_handler, - whandler - ); + return CreateProcEntryInDirSeq(dir, + name, + data, + next_handler, + show_handler, + off2element_handler, + startstop_handler, + whandler); } @@ -621,15 +578,13 @@ struct proc_dir_entry* CreateProcEntrySeq ( @Return Ptr to proc entry , 0 for failure *****************************************************************************/ -struct proc_dir_entry* CreatePerProcessProcEntrySeq ( - const IMG_CHAR * name, - IMG_VOID* data, - pvr_next_proc_seq_t next_handler, - pvr_show_proc_seq_t show_handler, - pvr_off2element_proc_seq_t off2element_handler, - pvr_startstop_proc_seq_t startstop_handler, - write_proc_t whandler - ) +struct pvr_proc_dir_entry* CreatePerProcessProcEntrySeq (const IMG_CHAR * name, + IMG_VOID* data, + pvr_next_proc_seq_t next_handler, + pvr_show_proc_seq_t show_handler, + pvr_off2element_proc_seq_t off2element_handler, + pvr_startstop_proc_seq_t startstop_handler, + pvr_proc_write_t whandler) { PVRSRV_ENV_PER_PROCESS_DATA *psPerProc; IMG_UINT32 ui32PID; @@ -646,392 +601,35 @@ struct proc_dir_entry* CreatePerProcessProcEntrySeq ( if (!psPerProc) { PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntrySeq: no per process data")); - return NULL; } if (!psPerProc->psProcDir) { - IMG_CHAR dirname_buffer[256]; - IMG_CHAR dirname[256]; - IMG_INT ret; - const IMG_CHAR *proc_basename = dirname_buffer; - dirname_buffer[255] = dirname[255] = '\0'; - - OSGetProcCmdline(ui32PID, dirname_buffer, sizeof(dirname_buffer)); - PVR_DPF((PVR_DBG_MESSAGE, "Command Line of the process with ID %u is %s", ui32PID, dirname_buffer)); - - proc_basename = OSGetPathBaseName(dirname_buffer, sizeof(dirname_buffer)); - PVR_DPF((PVR_DBG_MESSAGE, "Base Name of the process with ID %u is %s\n", ui32PID, proc_basename)); - - ret = snprintf(dirname, sizeof(dirname), "%u-%s", ui32PID, proc_basename); - PVR_DPF((PVR_DBG_MESSAGE, "Creating a new process entry for %s with ID %u\n", proc_basename, ui32PID)); - - if (ret <=0 || ret >= (IMG_INT)sizeof(dirname)) - { - PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntries: couldn't generate per process proc directory name \"%u\"", ui32PID)); - return NULL; - } - else - { - psPerProc->psProcDir = proc_mkdir(dirname, dir); - if (!psPerProc->psProcDir) - { - PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntries: couldn't create per process proc directory /proc/%s/%u", - PVRProcDirRoot, ui32PID)); - return NULL; - } - } - } - - return CreateProcEntryInDirSeq(psPerProc->psProcDir, name, data, next_handler, - show_handler,off2element_handler,startstop_handler,whandler); -} - - -/*! -****************************************************************************** - - @Function : RemoveProcEntrySeq - - @Description - - Remove a single node (created using *Seq function) under /proc/pvr. - - @Input proc_entry : structure returned by Create function. - - @Return nothing - -*****************************************************************************/ -IMG_VOID RemoveProcEntrySeq( struct proc_dir_entry* proc_entry ) -{ - if (dir) - { - void* data = proc_entry->data ; - PVR_DPF((PVR_DBG_MESSAGE, "Removing /proc/%s/%s", PVRProcDirRoot, proc_entry->name)); - - remove_proc_entry(proc_entry->name, dir); - if( data) - kfree( data ); - - } -} - -/*! -****************************************************************************** - - @Function : RemovePerProcessProcEntry Seq - - @Description - - Remove a single node under the per process proc directory (created by *Seq function). - - Remove a single node (created using *Seq function) under /proc/pvr. - - @Input proc_entry : structure returned by Create function. - - @Return nothing - -*****************************************************************************/ -IMG_VOID RemovePerProcessProcEntrySeq(struct proc_dir_entry* proc_entry) -{ - PVRSRV_ENV_PER_PROCESS_DATA *psPerProc; - - psPerProc = LinuxTerminatingProcessPrivateData(); - if (!psPerProc) - { - psPerProc = PVRSRVFindPerProcessPrivateData(); - if (!psPerProc) - { - PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntries: can't " - "remove %s, no per process data", proc_entry->name)); - return; - } - } - - if (psPerProc->psProcDir) - { - void* data = proc_entry->data ; - PVR_DPF((PVR_DBG_MESSAGE, "Removing proc entry %s from %s", proc_entry->name, psPerProc->psProcDir->name)); - - remove_proc_entry(proc_entry->name, psPerProc->psProcDir); - if(data) - kfree( data ); - } -} - -/*! -****************************************************************************** - - @Function : pvr_read_proc_vm - - @Description - - When the user accesses the proc filesystem entry for the device, we are - called here to create the content for the 'file'. We can print anything we - want here. If the info we want to return is too big for one page ('count' - chars), we return successive chunks on each call. For a number of ways of - achieving this, refer to proc_file_read() in linux/fs/proc/generic.c. - - Here, as we are accessing lists of information, we output '1' in '*start' to - instruct proc to advance 'off' by 1 on each call. The number of chars placed - in the buffer is returned. Multiple calls are made here by the proc - filesystem until we set *eof. We can return zero without setting eof to - instruct proc to flush 'page' (causing it to be printed) if there is not - enough space left (eg for a complete line). - - @Input page : where to write the output - - @Input start : memory location into which should be written next offset - to read from. - - @Input off : the offset into the /proc file being read - - @Input count : the size of the buffer 'page' - - @Input eof : memory location into which 1 should be written when at EOF - - @Input data : data specific to this /proc file entry - - @Return : length of string written to page - -*****************************************************************************/ -static IMG_INT pvr_read_proc(IMG_CHAR *page, IMG_CHAR **start, off_t off, - IMG_INT count, IMG_INT *eof, IMG_VOID *data) -{ - /* PRQA S 0307 1 */ /* ignore warning about casting to different pointer type */ - pvr_read_proc_t *pprn = (pvr_read_proc_t *)data; - - off_t len = pprn (page, (size_t)count, off); - - if (len == END_OF_FILE) - { - len = 0; - *eof = 1; - } - else if (!len) /* not enough space in the buffer */ - { - *start = (IMG_CHAR *) 0; /* don't advance the offset */ - } - else - { - *start = (IMG_CHAR *) 1; - } - - return len; -} - - -/*! -****************************************************************************** - - @Function : CreateProcEntryInDir - - @Description - - Create a file under the given directory. These dynamic files can be used at - runtime to get or set information about the device. - - @Input pdir : parent directory - - @Input name : the name of the file to create - - @Input rhandler : the function to supply the content - - @Input whandler : the function to interpret writes from the user - - @Return success code : 0 or -errno. - -*****************************************************************************/ -static IMG_INT CreateProcEntryInDir(struct proc_dir_entry *pdir, const IMG_CHAR * name, read_proc_t rhandler, write_proc_t whandler, IMG_VOID *data) -{ - struct proc_dir_entry * file; - mode_t mode; - - if (!pdir) - { - PVR_DPF((PVR_DBG_ERROR, "CreateProcEntryInDir: parent directory doesn't exist")); - - return -ENOMEM; - } - - mode = S_IFREG; - - if (rhandler) - { - mode |= S_IRUGO; - } - - if (whandler) - { - mode |= S_IWUSR; - } - - file = create_proc_entry(name, mode, pdir); - - if (file) - { -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) - file->owner = THIS_MODULE; -#endif - file->read_proc = rhandler; - file->write_proc = whandler; - file->data = data; - - PVR_DPF((PVR_DBG_MESSAGE, "Created proc entry %s in %s", name, pdir->name)); - - return 0; - } - - PVR_DPF((PVR_DBG_ERROR, "CreateProcEntry: cannot create proc entry %s in %s", name, pdir->name)); - - return -ENOMEM; -} - - -/*! -****************************************************************************** - - @Function : CreateProcEntry - - @Description - - Create a file under /proc/pvr. These dynamic files can be used at runtime - to get or set information about the device. - - This interface is fuller than CreateProcReadEntry, and supports write access; - it is really just a wrapper for the native linux functions. - - @Input name : the name of the file to create under /proc/pvr - - @Input rhandler : the function to supply the content - - @Input whandler : the function to interpret writes from the user - - @Return success code : 0 or -errno. - -*****************************************************************************/ -IMG_INT CreateProcEntry(const IMG_CHAR * name, read_proc_t rhandler, write_proc_t whandler, IMG_VOID *data) -{ - return CreateProcEntryInDir(dir, name, rhandler, whandler, data); -} - - -/*! -****************************************************************************** - - @Function : CreatePerProcessProcEntry - - @Description - - Create a file under /proc/pvr/<current process ID>. Apart from the - directory where the file is created, this works the same way as - CreateProcEntry. - - @Input name : the name of the file to create under the per process /proc directory - - @Input rhandler : the function to supply the content - - @Input whandler : the function to interpret writes from the user - - @Return success code : 0 or -errno. - -*****************************************************************************/ -IMG_INT CreatePerProcessProcEntry(const IMG_CHAR * name, read_proc_t rhandler, write_proc_t whandler, IMG_VOID *data) -{ - PVRSRV_ENV_PER_PROCESS_DATA *psPerProc; - IMG_UINT32 ui32PID; - - if (!dir) - { - PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntries: /proc/%s doesn't exist", PVRProcDirRoot)); - - return -ENOMEM; - } - - ui32PID = OSGetCurrentProcessIDKM(); - - psPerProc = PVRSRVPerProcessPrivateData(ui32PID); - if (!psPerProc) - { - PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntries: no per process data")); - - return -ENOMEM; - } - - if (!psPerProc->psProcDir) - { IMG_CHAR dirname[16]; IMG_INT ret; ret = snprintf(dirname, sizeof(dirname), "%u", ui32PID); - if (ret <=0 || ret >= (IMG_INT)sizeof(dirname)) - { - PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntries: couldn't generate per process proc directory name \"%u\"", ui32PID)); - - return -ENOMEM; - } - else - { - psPerProc->psProcDir = proc_mkdir(dirname, dir); - if (!psPerProc->psProcDir) - { - PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntries: couldn't create per process proc directory /proc/%s/%u", PVRProcDirRoot, ui32PID)); - - return -ENOMEM; - } - } - } - - return CreateProcEntryInDir(psPerProc->psProcDir, name, rhandler, whandler, data); -} - - -/*! -****************************************************************************** - - @Function : CreateProcReadEntry - - @Description - - Create a file under /proc/pvr. These dynamic files can be used at runtime - to get information about the device. Creation WILL fail if proc support is - not compiled into the kernel. That said, the Linux kernel is not even happy - to build without /proc support these days. - - @Input name : the name of the file to create - - @Input handler : the function to call to provide the content - - @Return 0 for success, -errno for failure - -*****************************************************************************/ -IMG_INT CreateProcReadEntry(const IMG_CHAR * name, pvr_read_proc_t handler) -{ - struct proc_dir_entry * file; - - if (!dir) - { - PVR_DPF((PVR_DBG_ERROR, "CreateProcReadEntry: cannot make proc entry /proc/%s/%s: no parent", PVRProcDirRoot, name)); - - return -ENOMEM; - } - - /* PRQA S 0307 1 */ /* ignore warning about casting to different pointer type */ - file = create_proc_read_entry (name, S_IFREG | S_IRUGO, dir, pvr_read_proc, (IMG_VOID *)handler); - - if (file) - { -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) - file->owner = THIS_MODULE; -#endif - return 0; + if (ret <=0 || ret >= (IMG_INT)sizeof(dirname)) + { + PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntries: couldn't generate per process proc directory name \"%u\"", ui32PID)); + return NULL; + } + else + { + psPerProc->psProcDir = proc_mkdir(dirname, dir); + if (!psPerProc->psProcDir) + { + PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntries: couldn't create per process proc directory /proc/%s/%u", + PVRProcDirRoot, ui32PID)); + return NULL; + } + } } - PVR_DPF((PVR_DBG_ERROR, "CreateProcReadEntry: cannot make proc entry /proc/%s/%s: no memory", PVRProcDirRoot, name)); - - return -ENOMEM; + return CreateProcEntryInDirSeq(psPerProc->psProcDir, name, data, next_handler, + show_handler,off2element_handler,startstop_handler,whandler); } @@ -1063,11 +661,17 @@ IMG_INT CreateProcEntries(IMG_VOID) return -ENOMEM; } +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) g_pProcQueue = CreateProcReadEntrySeq("queue", NULL, NULL, ProcSeqShowQueue, ProcSeqOff2ElementQueue, NULL); +#endif g_pProcVersion = CreateProcReadEntrySeq("version", NULL, NULL, ProcSeqShowVersion, ProcSeq1ElementHeaderOff2Element, NULL); g_pProcSysNodes = CreateProcReadEntrySeq("nodes", NULL, NULL, ProcSeqShowSysNodes, ProcSeqOff2ElementSysNodes, NULL); - if(!g_pProcQueue || !g_pProcVersion || !g_pProcSysNodes) + if(!g_pProcVersion || !g_pProcSysNodes +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) + || !g_pProcQueue +#endif + ) { PVR_DPF((PVR_DBG_ERROR, "CreateProcEntries: couldn't make /proc/%s files", PVRProcDirRoot)); @@ -1109,42 +713,45 @@ IMG_INT CreateProcEntries(IMG_VOID) /*! ****************************************************************************** - @Function : RemoveProcEntry + @Function : RemoveProcEntrySeq @Description - Remove a single node under /proc/pvr. + Remove a single node (created using *Seq function) under /proc/pvr. - @Input name : the name of the node to remove + @Input proc_entry : structure returned by Create function. @Return nothing *****************************************************************************/ -IMG_VOID RemoveProcEntry(const IMG_CHAR * name) +IMG_VOID RemoveProcEntrySeq(struct pvr_proc_dir_entry* ppde) { - if (dir) - { - remove_proc_entry(name, dir); - PVR_DPF((PVR_DBG_MESSAGE, "Removing /proc/%s/%s", PVRProcDirRoot, name)); - } +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) + remove_proc_entry(ppde->pde->name, dir); +#else + proc_remove(ppde->pde); +#endif + kfree(ppde); } /*! ****************************************************************************** - @Function : RemovePerProcessProcEntry + @Function : RemovePerProcessProcEntrySeq @Description - Remove a single node under the per process proc directory. + Remove a single node under the per process proc directory (created by *Seq function). - @Input name : the name of the node to remove + Remove a single node (created using *Seq function) under /proc/pvr. + + @Input proc_entry : structure returned by Create function. @Return nothing *****************************************************************************/ -IMG_VOID RemovePerProcessProcEntry(const IMG_CHAR *name) +IMG_VOID RemovePerProcessProcEntrySeq(struct pvr_proc_dir_entry* ppde) { PVRSRV_ENV_PER_PROCESS_DATA *psPerProc; @@ -1154,17 +761,44 @@ IMG_VOID RemovePerProcessProcEntry(const IMG_CHAR *name) psPerProc = PVRSRVFindPerProcessPrivateData(); if (!psPerProc) { - PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntries: can't " - "remove %s, no per process data", name)); + PVR_DPF((PVR_DBG_ERROR, "CreatePerProcessProcEntries: can't remove proc entry, no per process data")); return; } } if (psPerProc->psProcDir) { - remove_proc_entry(name, psPerProc->psProcDir); + PVR_DPF((PVR_DBG_MESSAGE, "Removing per-process proc entry")); +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) + remove_proc_entry(ppde->pde->name, psPerProc->psProcDir); +#else + proc_remove(ppde->pde); +#endif + kfree(ppde); + } +} - PVR_DPF((PVR_DBG_MESSAGE, "Removing proc entry %s from %s", name, psPerProc->psProcDir->name)); +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) +/*! +****************************************************************************** + + @Function : RemoveProcEntry + + @Description + + Remove a single node under /proc/pvr. + + @Input name : the name of the node to remove + + @Return nothing + +*****************************************************************************/ +static IMG_VOID RemoveProcEntry(const IMG_CHAR * name) +{ + if (dir) + { + remove_proc_entry(name, dir); + PVR_DPF((PVR_DBG_MESSAGE, "Removing /proc/%s/%s", PVRProcDirRoot, name)); } } @@ -1196,7 +830,12 @@ IMG_VOID RemovePerProcessProcDir(PVRSRV_ENV_PER_PROCESS_DATA *psPerProc) RemoveProcEntry(psPerProc->psProcDir->name); } } - +#else +IMG_VOID RemovePerProcessProcDir(PVRSRV_ENV_PER_PROCESS_DATA *psPerProc) +{ + proc_remove(psPerProc->psProcDir); +} +#endif /*! ****************************************************************************** @@ -1221,18 +860,35 @@ IMG_VOID RemoveProcEntries(IMG_VOID) #endif /* PVR_MANUAL_POWER_CONTROL */ #endif +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) RemoveProcEntrySeq(g_pProcQueue); +#endif RemoveProcEntrySeq(g_pProcVersion); RemoveProcEntrySeq(g_pProcSysNodes); +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) while (dir->subdir) { PVR_DPF((PVR_DBG_WARNING, "Belatedly removing /proc/%s/%s", PVRProcDirRoot, dir->subdir->name)); RemoveProcEntry(dir->subdir->name); } - remove_proc_entry(PVRProcDirRoot, NULL); +#else + proc_remove(dir); +#endif + +} + +/*************************************************************************/ /*! +@Function PVRProcGetData +@Description Extract data from PVR proc object. +@Input pointer to pvr_proc_dir_entr object +@Return pointer to data object passed in to Proc create function. +*/ /**************************************************************************/ +void *PVRProcGetData(struct pvr_proc_dir_entry *ppde) +{ + return ppde->data; } /***************************************************************************** @@ -1243,7 +899,7 @@ IMG_VOID RemoveProcEntries(IMG_VOID) PARAMETERS : sfile - /proc seq_file el - Element to print *****************************************************************************/ -static void ProcSeqShowVersion(struct seq_file *sfile,void* el) +static void ProcSeqShowVersion(struct seq_file *sfile, void* el) { SYS_DATA *psSysData; IMG_CHAR *pszSystemVersionString = "None"; @@ -1266,24 +922,6 @@ static void ProcSeqShowVersion(struct seq_file *sfile,void* el) seq_printf( sfile, "System Version String: %s\n", pszSystemVersionString); } -/*! -****************************************************************************** - - @Function procDumpSysNodes (plus deviceTypeToString and deviceClassToString) - - @Description - - Format the contents of /proc/pvr/nodes - - @Input buf : where to place format contents data. - - @Input size : the size of the buffer into which to place data - - @Input off : how far into the file we are. - - @Return amount of data placed in buffer, 0, or END_OF_FILE : - -******************************************************************************/ static const IMG_CHAR *deviceTypeToString(PVRSRV_DEVICE_TYPE deviceType) { switch (deviceType) diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/proc.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/proc.h index bc2a554..e3abec2 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/proc.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/proc.h @@ -44,14 +44,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef __SERVICES_PROC_H__ #define __SERVICES_PROC_H__ -#include <asm/system.h> // va_list etc -#include <linux/proc_fs.h> // read_proc_t etc -#include <linux/seq_file.h> // seq_file - -#define END_OF_FILE (off_t) -1 - -typedef off_t (pvr_read_proc_t)(IMG_CHAR *, size_t, off_t); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) +#include <asm/system.h> +#endif +#include <linux/seq_file.h> +#include "img_defs.h" +struct pvr_proc_dir_entry; #define PVR_PROC_SEQ_START_TOKEN (void*)1 typedef void* (pvr_next_proc_seq_t)(struct seq_file *,void*,loff_t); @@ -59,69 +58,38 @@ typedef void* (pvr_off2element_proc_seq_t)(struct seq_file *, loff_t); typedef void (pvr_show_proc_seq_t)(struct seq_file *,void*); typedef void (pvr_startstop_proc_seq_t)(struct seq_file *, IMG_BOOL start); -typedef struct _PVR_PROC_SEQ_HANDLERS_ { - pvr_next_proc_seq_t *next; - pvr_show_proc_seq_t *show; - pvr_off2element_proc_seq_t *off2element; - pvr_startstop_proc_seq_t *startstop; - IMG_VOID *data; -} PVR_PROC_SEQ_HANDLERS; - - -/** off2element function for elements with only ONE element (no header) */ -void* ProcSeq1ElementOff2Element(struct seq_file *sfile, loff_t off); - -/** off2element function for elements with only ONE element (+ header) */ -void* ProcSeq1ElementHeaderOff2Element(struct seq_file *sfile, loff_t off); - -off_t printAppend(IMG_CHAR * buffer, size_t size, off_t off, const IMG_CHAR * format, ...) - __attribute__((format(printf, 4, 5))); - -IMG_INT CreateProcEntries(IMG_VOID); - -IMG_INT CreateProcReadEntry (const IMG_CHAR * name, pvr_read_proc_t handler); - -IMG_INT CreateProcEntry(const IMG_CHAR * name, read_proc_t rhandler, write_proc_t whandler, IMG_VOID *data); - -IMG_INT CreatePerProcessProcEntry(const IMG_CHAR * name, read_proc_t rhandler, write_proc_t whandler, IMG_VOID *data); - -IMG_VOID RemoveProcEntry(const IMG_CHAR * name); - -IMG_VOID RemovePerProcessProcEntry(const IMG_CHAR * name); - -IMG_VOID RemoveProcEntries(IMG_VOID); - -struct proc_dir_entry* CreateProcReadEntrySeq ( - const IMG_CHAR* name, - IMG_VOID* data, - pvr_next_proc_seq_t next_handler, - pvr_show_proc_seq_t show_handler, - pvr_off2element_proc_seq_t off2element_handler, - pvr_startstop_proc_seq_t startstop_handler - ); - -struct proc_dir_entry* CreateProcEntrySeq ( - const IMG_CHAR* name, - IMG_VOID* data, - pvr_next_proc_seq_t next_handler, - pvr_show_proc_seq_t show_handler, - pvr_off2element_proc_seq_t off2element_handler, - pvr_startstop_proc_seq_t startstop_handler, - write_proc_t whandler - ); - -struct proc_dir_entry* CreatePerProcessProcEntrySeq ( - const IMG_CHAR* name, - IMG_VOID* data, - pvr_next_proc_seq_t next_handler, - pvr_show_proc_seq_t show_handler, - pvr_off2element_proc_seq_t off2element_handler, - pvr_startstop_proc_seq_t startstop_handler, - write_proc_t whandler - ); - - -IMG_VOID RemoveProcEntrySeq(struct proc_dir_entry* proc_entry); -IMG_VOID RemovePerProcessProcEntrySeq(struct proc_dir_entry* proc_entry); +typedef int (pvr_proc_write_t)(struct file *file, const char __user *buffer, + unsigned long count, void *data); + +IMG_INT CreateProcEntries(void); +void RemoveProcEntries(void); + +struct pvr_proc_dir_entry* CreateProcReadEntrySeq(const IMG_CHAR* name, + IMG_VOID* data, + pvr_next_proc_seq_t next_handler, + pvr_show_proc_seq_t show_handler, + pvr_off2element_proc_seq_t off2element_handler, + pvr_startstop_proc_seq_t startstop_handler); + +struct pvr_proc_dir_entry* CreateProcEntrySeq(const IMG_CHAR* name, + IMG_VOID* data, + pvr_next_proc_seq_t next_handler, + pvr_show_proc_seq_t show_handler, + pvr_off2element_proc_seq_t off2element_handler, + pvr_startstop_proc_seq_t startstop_handler, + pvr_proc_write_t whandler); + +struct pvr_proc_dir_entry* CreatePerProcessProcEntrySeq(const IMG_CHAR* name, + IMG_VOID* data, + pvr_next_proc_seq_t next_handler, + pvr_show_proc_seq_t show_handler, + pvr_off2element_proc_seq_t off2element_handler, + pvr_startstop_proc_seq_t startstop_handler, + pvr_proc_write_t whandler); + +void RemoveProcEntrySeq(struct pvr_proc_dir_entry* proc_entry); +void RemovePerProcessProcEntrySeq(struct pvr_proc_dir_entry* proc_entry); + +void *PVRProcGetData(struct pvr_proc_dir_entry* ppde); #endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_bridge_k.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_bridge_k.c index 23379b9..2a61e54 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_bridge_k.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_bridge_k.c @@ -41,6 +41,8 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**************************************************************************/ +#include <linux/fs.h> + #include "img_defs.h" #include "services.h" #include "pvr_bridge.h" @@ -84,7 +86,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #if defined(DEBUG_BRIDGE_KM) -static struct proc_dir_entry *g_ProcBridgeStats =0; +static struct pvr_proc_dir_entry *g_ProcBridgeStats =0; static void* ProcSeqNextBridgeStats(struct seq_file *sfile,void* el,loff_t off); static void ProcSeqShowBridgeStats(struct seq_file *sfile,void* el); static void* ProcSeqOff2ElementBridgeStats(struct seq_file * sfile, loff_t off); @@ -95,7 +97,7 @@ static void ProcSeqStartstopBridgeStats(struct seq_file *sfile,IMG_BOOL start); extern PVRSRV_LINUX_MUTEX gPVRSRVLock; #if defined(SUPPORT_MEMINFO_IDS) -static IMG_UINT64 ui64Stamp; +IMG_UINT64 g_ui64MemInfoID; #endif /* defined(SUPPORT_MEMINFO_IDS) */ PVRSRV_ERROR @@ -231,7 +233,6 @@ static void ProcSeqShowBridgeStats(struct seq_file *sfile,void* el) psEntry->ui32CopyFromUserTotalBytes, psEntry->ui32CopyToUserTotalBytes); } - #endif /* DEBUG_BRIDGE_KM */ @@ -474,7 +475,7 @@ PVRSRV_BridgeDispatchKM(struct file *pFile, unsigned int unref__ ioctlCmd, unsig psPrivateData->hKernelMemInfo = hMemInfo; #if defined(SUPPORT_MEMINFO_IDS) - psPrivateData->ui64Stamp = ++ui64Stamp; + psPrivateData->ui64Stamp = ++g_ui64MemInfoID; psKernelMemInfo->ui64Stamp = psPrivateData->ui64Stamp; if (pvr_put_user(psPrivateData->ui64Stamp, &psExportDeviceMemOUT->ui64Stamp) != 0) @@ -505,7 +506,7 @@ PVRSRV_BridgeDispatchKM(struct file *pFile, unsigned int unref__ ioctlCmd, unsig { PVRSRV_BRIDGE_OUT_MAP_DEVICECLASS_MEMORY *psDeviceClassMemoryOUT = (PVRSRV_BRIDGE_OUT_MAP_DEVICECLASS_MEMORY *)psBridgePackageKM->pvParamOut; - if (pvr_put_user(++ui64Stamp, &psDeviceClassMemoryOUT->sClientMemInfo.ui64Stamp) != 0) + if (pvr_put_user(++g_ui64MemInfoID, &psDeviceClassMemoryOUT->sClientMemInfo.ui64Stamp) != 0) { err = -EFAULT; goto unlock_and_return; diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_debug.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_debug.c index 3958f84..df3a9b5 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_debug.c +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_debug.c @@ -51,16 +51,17 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <asm/io.h> #include <asm/uaccess.h> #include <linux/kernel.h> +#include <linux/sched.h> #include <linux/hardirq.h> #include <linux/module.h> #include <linux/spinlock.h> #include <linux/string.h> // strncpy, strlen #include <stdarg.h> +#include <linux/seq_file.h> #include "img_types.h" #include "servicesext.h" #include "pvr_debug.h" #include "srvkm.h" -#include "proc.h" #include "mutex.h" #include "linkage.h" #include "pvr_uaccess.h" @@ -69,6 +70,104 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define PVR_DEBUG_ALWAYS_USE_SPINLOCK #endif +#if defined(PVRSRV_NEED_PVR_DPF) + +/******** BUFFERED LOG MESSAGES ********/ + +/* Because we don't want to have to handle CCB wrapping, each buffered + * message is rounded up to PVRSRV_DEBUG_CCB_MESG_MAX bytes. This means + * there is the same fixed number of messages that can be stored, + * regardless of message length. + */ + +#if defined(PVRSRV_DEBUG_CCB_MAX) + +#define PVRSRV_DEBUG_CCB_MESG_MAX PVR_MAX_DEBUG_MESSAGE_LEN + +#include <linux/syscalls.h> +#include <linux/time.h> + +typedef struct +{ + const IMG_CHAR *pszFile; + IMG_INT iLine; + IMG_UINT32 ui32TID; + IMG_CHAR pcMesg[PVRSRV_DEBUG_CCB_MESG_MAX]; + struct timeval sTimeVal; +} +PVRSRV_DEBUG_CCB; + +static PVRSRV_DEBUG_CCB gsDebugCCB[PVRSRV_DEBUG_CCB_MAX] = { { 0 } }; + +static IMG_UINT giOffset = 0; + +static PVRSRV_LINUX_MUTEX gsDebugCCBMutex; + +static void +AddToBufferCCB(const IMG_CHAR *pszFileName, IMG_UINT32 ui32Line, + const IMG_CHAR *szBuffer) +{ + LinuxLockMutex(&gsDebugCCBMutex); + + gsDebugCCB[giOffset].pszFile = pszFileName; + gsDebugCCB[giOffset].iLine = ui32Line; + gsDebugCCB[giOffset].ui32TID = current->tgid; + + do_gettimeofday(&gsDebugCCB[giOffset].sTimeVal); + + strncpy(gsDebugCCB[giOffset].pcMesg, szBuffer, PVRSRV_DEBUG_CCB_MESG_MAX - 1); + gsDebugCCB[giOffset].pcMesg[PVRSRV_DEBUG_CCB_MESG_MAX - 1] = 0; + + giOffset = (giOffset + 1) % PVRSRV_DEBUG_CCB_MAX; + + LinuxUnLockMutex(&gsDebugCCBMutex); +} + +IMG_EXPORT IMG_VOID PVRSRVDebugPrintfDumpCCB(void) +{ + int i; + + LinuxLockMutex(&gsDebugCCBMutex); + + for(i = 0; i < PVRSRV_DEBUG_CCB_MAX; i++) + { + PVRSRV_DEBUG_CCB *psDebugCCBEntry = + &gsDebugCCB[(giOffset + i) % PVRSRV_DEBUG_CCB_MAX]; + + /* Early on, we won't have PVRSRV_DEBUG_CCB_MAX messages */ + if(!psDebugCCBEntry->pszFile) + continue; + + printk("%s:%d:\t[%5ld.%6ld] %s\n", + psDebugCCBEntry->pszFile, + psDebugCCBEntry->iLine, + (long)psDebugCCBEntry->sTimeVal.tv_sec, + (long)psDebugCCBEntry->sTimeVal.tv_usec, + psDebugCCBEntry->pcMesg); + } + + LinuxUnLockMutex(&gsDebugCCBMutex); +} + +#else /* defined(PVRSRV_DEBUG_CCB_MAX) */ +static INLINE void +AddToBufferCCB(const IMG_CHAR *pszFileName, IMG_UINT32 ui32Line, + const IMG_CHAR *szBuffer) +{ + (void)pszFileName; + (void)szBuffer; + (void)ui32Line; +} + +IMG_EXPORT IMG_VOID PVRSRVDebugPrintfDumpCCB(void) +{ + /* Not available */ +} + +#endif /* defined(PVRSRV_DEBUG_CCB_MAX) */ + +#endif /* defined(PVRSRV_NEED_PVR_DPF) */ + static IMG_BOOL VBAppend(IMG_CHAR *pszBuf, IMG_UINT32 ui32BufSiz, const IMG_CHAR* pszFormat, va_list VArgs) IMG_FORMAT_PRINTF(3, 0); @@ -76,15 +175,9 @@ static IMG_BOOL VBAppend(IMG_CHAR *pszBuf, IMG_UINT32 ui32BufSiz, #if defined(PVRSRV_NEED_PVR_DPF) -#define PVR_MAX_FILEPATH_LEN 256 - -static IMG_BOOL BAppend(IMG_CHAR *pszBuf, IMG_UINT32 ui32BufSiz, - const IMG_CHAR *pszFormat, ...) - IMG_FORMAT_PRINTF(3, 4); - /* NOTE: Must NOT be static! Used in module.c.. */ IMG_UINT32 gPVRDebugLevel = - (DBGPRIV_FATAL | DBGPRIV_ERROR | DBGPRIV_WARNING); + (DBGPRIV_FATAL | DBGPRIV_ERROR | DBGPRIV_WARNING | DBGPRIV_BUFFERED); #endif /* defined(PVRSRV_NEED_PVR_DPF) || defined(PVRSRV_NEED_PVR_TRACE) */ @@ -194,7 +287,10 @@ static IMG_BOOL VBAppend(IMG_CHAR *pszBuf, IMG_UINT32 ui32BufSiz, const IMG_CHAR IMG_VOID PVRDPFInit(IMG_VOID) { #if !defined(PVR_DEBUG_ALWAYS_USE_SPINLOCK) - LinuxInitMutex(&gsDebugMutexNonIRQ); + LinuxInitMutex(&gsDebugMutexNonIRQ); +#endif +#if defined(PVRSRV_DEBUG_CCB_MAX) + LinuxInitMutex(&gsDebugCCBMutex); #endif } @@ -231,7 +327,6 @@ IMG_VOID PVRSRVReleasePrintf(const IMG_CHAR *pszFormat, ...) ReleaseBufferLock(ulLockFlags); va_end(vaArgs); - } #if defined(PVRSRV_NEED_PVR_TRACE) @@ -277,25 +372,6 @@ IMG_VOID PVRSRVTrace(const IMG_CHAR* pszFormat, ...) #if defined(PVRSRV_NEED_PVR_DPF) -/* - * Append a string to a buffer using formatted conversion. - * The function takes a variable number of arguments, calling - * VBAppend to do the actual work. - */ -static IMG_BOOL BAppend(IMG_CHAR *pszBuf, IMG_UINT32 ui32BufSiz, const IMG_CHAR *pszFormat, ...) -{ - va_list VArgs; - IMG_BOOL bTrunc; - - va_start (VArgs, pszFormat); - - bTrunc = VBAppend(pszBuf, ui32BufSiz, pszFormat, VArgs); - - va_end (VArgs); - - return bTrunc; -} - /*! ****************************************************************************** @Function PVRSRVDebugPrintf @@ -317,8 +393,6 @@ IMG_VOID PVRSRVDebugPrintf ( { IMG_BOOL bTrace; const IMG_CHAR *pszFileName = pszFullFileName; - IMG_CHAR *pszLeafName; - bTrace = (IMG_BOOL)(ui32DebugLevel & DBGPRIV_CALLTRACE) ? IMG_TRUE : IMG_FALSE; @@ -365,9 +439,14 @@ IMG_VOID PVRSRVDebugPrintf ( strncpy (pszBuf, "PVR_K:(Verbose): ", (ui32BufSiz -1)); break; } + case DBGPRIV_BUFFERED: + { + strncpy (pszBuf, "PVR_K: ", (ui32BufSiz -1)); + break; + } default: { - strncpy (pszBuf, "PVR_K:(Unknown message level)", (ui32BufSiz -1)); + strncpy (pszBuf, "PVR_K:(Unknown message level): ", (ui32BufSiz -1)); break; } } @@ -383,82 +462,14 @@ IMG_VOID PVRSRVDebugPrintf ( } else { - /* Traces don't need a location */ - if (bTrace == IMG_FALSE) + if (ui32DebugLevel & DBGPRIV_BUFFERED) { -#ifdef DEBUG_LOG_PATH_TRUNCATE - /* Buffer for rewriting filepath in log messages */ - static IMG_CHAR szFileNameRewrite[PVR_MAX_FILEPATH_LEN]; - - IMG_CHAR* pszTruncIter; - IMG_CHAR* pszTruncBackInter; + /* We don't need the full path here */ + const IMG_CHAR *pszShortName = strrchr(pszFileName, '/') + 1; + if(pszShortName) + pszFileName = pszShortName; - /* Truncate path (DEBUG_LOG_PATH_TRUNCATE shoud be set to EURASIA env var)*/ - if (strlen(pszFullFileName) > strlen(DEBUG_LOG_PATH_TRUNCATE)+1) - pszFileName = pszFullFileName + strlen(DEBUG_LOG_PATH_TRUNCATE)+1; - - /* Try to find '/../' entries and remove it together with - previous entry. Repeat unit all removed */ - strncpy(szFileNameRewrite, pszFileName,PVR_MAX_FILEPATH_LEN); - - if(strlen(szFileNameRewrite) == PVR_MAX_FILEPATH_LEN-1) { - IMG_CHAR szTruncateMassage[] = "FILENAME TRUNCATED"; - strcpy(szFileNameRewrite + (PVR_MAX_FILEPATH_LEN - 1 - strlen(szTruncateMassage)), szTruncateMassage); - } - - pszTruncIter = szFileNameRewrite; - while(*pszTruncIter++ != 0) - { - IMG_CHAR* pszNextStartPoint; - /* Find '/../' pattern */ - if( - !( ( *pszTruncIter == '/' && (pszTruncIter-4 >= szFileNameRewrite) ) && - ( *(pszTruncIter-1) == '.') && - ( *(pszTruncIter-2) == '.') && - ( *(pszTruncIter-3) == '/') ) - ) continue; - - /* Find previous '/' */ - pszTruncBackInter = pszTruncIter - 3; - while(*(--pszTruncBackInter) != '/') - { - if(pszTruncBackInter <= szFileNameRewrite) break; - } - pszNextStartPoint = pszTruncBackInter; - - /* Remove found region */ - while(*pszTruncIter != 0) - { - *pszTruncBackInter++ = *pszTruncIter++; - } - *pszTruncBackInter = 0; - - /* Start again */ - pszTruncIter = pszNextStartPoint; - } - - pszFileName = szFileNameRewrite; - /* Remove first '/' if exist (it's always relative path */ - if(*pszFileName == '/') pszFileName++; -#endif - -#if !defined(__sh__) - pszLeafName = (IMG_CHAR *)strrchr (pszFileName, '\\'); - - if (pszLeafName) - { - pszFileName = pszLeafName; - } -#endif /* __sh__ */ - - if (BAppend(pszBuf, ui32BufSiz, " [%u, %s]", ui32Line, pszFileName)) - { - printk(KERN_INFO "PVR_K:(Message Truncated): %s\n", pszBuf); - } - else - { - printk(KERN_INFO "%s\n", pszBuf); - } + AddToBufferCCB(pszFileName, ui32Line, pszBuf); } else { @@ -481,6 +492,9 @@ IMG_INT PVRDebugProcSetLevel(struct file *file, const IMG_CHAR *buffer, IMG_UINT #define _PROC_SET_BUFFER_SZ 6 IMG_CHAR data_buffer[_PROC_SET_BUFFER_SZ]; + PVR_UNREFERENCED_PARAMETER(file); + PVR_UNREFERENCED_PARAMETER(data); + if (count > _PROC_SET_BUFFER_SZ) { return -EINVAL; @@ -498,8 +512,10 @@ IMG_INT PVRDebugProcSetLevel(struct file *file, const IMG_CHAR *buffer, IMG_UINT return (count); } -void ProcSeqShowDebugLevel(struct seq_file *sfile,void* el) +void ProcSeqShowDebugLevel(struct seq_file *sfile, void* el) { + PVR_UNREFERENCED_PARAMETER(el); + seq_printf(sfile, "%u\n", gPVRDebugLevel); } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_drm.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_drm.c new file mode 100644 index 0000000..3aae69e --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_drm.c @@ -0,0 +1,739 @@ +/*************************************************************************/ /*! +@Title PowerVR drm driver +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@Description linux module setup +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ +#if defined(SUPPORT_DRI_DRM) + +#include <linux/version.h> + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)) +#ifndef AUTOCONF_INCLUDED +#include <linux/config.h> +#endif +#endif + +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/fs.h> +#include <linux/proc_fs.h> +#include <linux/sched.h> +#include <asm/ioctl.h> +#include <drm/drmP.h> +#include <drm/drm.h> + +#include "img_defs.h" +#include "services.h" +#include "kerneldisplay.h" +#include "kernelbuffer.h" +#include "syscommon.h" +#include "pvrmmap.h" +#include "mm.h" +#include "mmap.h" +#include "mutex.h" +#include "pvr_debug.h" +#include "srvkm.h" +#include "perproc.h" +#include "handle.h" +#include "pvr_bridge_km.h" +#include "pvr_bridge.h" +#include "pvrmodule.h" +#include "pvrversion.h" +#include "lock.h" +#include "linkage.h" +#include "pvr_drm.h" + +#if defined(PVR_DRI_DRM_NOT_PCI) +#include "pvr_drm_mod.h" +#endif + +#if (defined(PVR_DRI_DRM_PLATFORM_DEV) && !defined(PVR_LDM_PLATFORM_PRE_REGISTERED)) || defined(NO_HARDWARE) +#define PVR_DRM_NAME SYS_SGX_DEV_NAME +#else +#define PVR_DRM_NAME PVRSRV_MODNAME +#endif + +#define PVR_DRM_DESC "Imagination Technologies PVR DRM" + +#define PVR_DRM_DATE "20110701" + +#if defined(PVR_DRI_DRM_PLATFORM_DEV) && !defined(SUPPORT_DRI_DRM_PLUGIN) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) +#define PVR_NEW_STYLE_DRM_PLATFORM_DEV +#else +#define PVR_OLD_STYLE_DRM_PLATFORM_DEV +#endif +#endif + +/* + * Prior to Linux 2.6.36, we couldn't do the release processing in post close + * when workqueues were being used, because drm_release held the big kernel + * lock (BKL) when it called post close. + * If the resman needs to wait for processing being done by a workqueue, + * that processing won't complete whilst the lock is held by another thread, + * as the workqueue won't get scheduled. + */ +#undef PVR_DRI_DRM_USE_POST_CLOSE +#if (defined(SUPPORT_DRI_DRM_EXT) && !defined(PVR_LINUX_USING_WORKQUEUES)) || \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) +#define PVR_DRI_DRM_USE_POST_CLOSE +#endif + +DECLARE_WAIT_QUEUE_HEAD(sWaitForInit); + +#if defined(SUPPORT_DRM_MODESET) +static struct drm_driver sPVRDrmDriver; +#endif + +/* Once bInitComplete and bInitFailed are set, they stay set */ +IMG_BOOL bInitComplete; +IMG_BOOL bInitFailed; + +#if !defined(PVR_DRI_DRM_NOT_PCI) && !defined(SUPPORT_DRI_DRM_PLUGIN) +#if defined(PVR_DRI_DRM_PLATFORM_DEV) +struct platform_device *gpsPVRLDMDev; +#else +struct pci_dev *gpsPVRLDMDev; +#endif +#endif + +struct drm_device *gpsPVRDRMDev; + +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,24)) +#error "Linux kernel version 2.6.25 or later required for PVR DRM support" +#endif + +#define PVR_DRM_FILE struct drm_file * + +#if !defined(SUPPORT_DRI_DRM_EXT) && !defined(SUPPORT_DRI_DRM_PLUGIN) +#if defined(PVR_DRI_DRM_PLATFORM_DEV) +static struct platform_device_id asPlatIdList[] = { + {SYS_SGX_DEV_NAME, 0}, + {} +}; +#else /* defined(PVR_DRI_DRM_PLATFORM_DEV) */ +static struct pci_device_id asPciIdList[] = { +#if defined(PVR_DRI_DRM_NOT_PCI) + {1, 1, 1, 1, 0, 0, 0}, +#else /* defined(PVR_DRI_DRM_NOT_PCI) */ + {SYS_SGX_DEV_VENDOR_ID, SYS_SGX_DEV_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, +#if defined(SYS_SGX_DEV1_DEVICE_ID) + {SYS_SGX_DEV_VENDOR_ID, SYS_SGX_DEV1_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, +#endif /* defined(SYS_SGX_DEV1_DEVICE_ID) */ +#endif /* defined(PVR_DRI_DRM_NOT_PCI) */ + {0} +}; +#endif /* defined(PVR_DRI_DRM_PLATFORM_DEV) */ +#endif /* !defined(SUPPORT_DRI_DRM_EXT) */ + +DRI_DRM_STATIC int +PVRSRVDrmLoad(struct drm_device *dev, unsigned long flags) +{ + int iRes = 0; + + PVR_TRACE(("PVRSRVDrmLoad")); + + gpsPVRDRMDev = dev; +#if !defined(PVR_DRI_DRM_NOT_PCI) && !defined(SUPPORT_DRI_DRM_PLUGIN) +#if defined(PVR_DRI_DRM_PLATFORM_DEV) + gpsPVRLDMDev = dev->platformdev; +#else + gpsPVRLDMDev = dev->pdev; +#endif +#endif + +#if defined(PDUMP) + iRes = dbgdrv_init(); + if (iRes != 0) + { + goto exit; + } +#endif + /* Module initialisation */ + iRes = PVRCore_Init(); + if (iRes != 0) + { + goto exit_dbgdrv_cleanup; + } + +#if defined(DISPLAY_CONTROLLER) + iRes = PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Init)(dev); + if (iRes != 0) + { + goto exit_pvrcore_cleanup; + } +#endif + goto exit; + +#if defined(DISPLAY_CONTROLLER) +exit_pvrcore_cleanup: + PVRCore_Cleanup(); +#endif +exit_dbgdrv_cleanup: +#if defined(PDUMP) + dbgdrv_cleanup(); +#endif +exit: + if (iRes != 0) + { + bInitFailed = IMG_TRUE; + } + bInitComplete = IMG_TRUE; + + wake_up_interruptible(&sWaitForInit); + + return iRes; +} + +DRI_DRM_STATIC int +PVRSRVDrmUnload(struct drm_device *dev) +{ + PVR_TRACE(("PVRSRVDrmUnload")); + +#if defined(DISPLAY_CONTROLLER) + PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Cleanup)(dev); +#endif + + PVRCore_Cleanup(); + +#if defined(PDUMP) + dbgdrv_cleanup(); +#endif + + return 0; +} + +DRI_DRM_STATIC int +PVRSRVDrmOpen(struct drm_device *dev, struct drm_file *file) +{ + while (!bInitComplete) + { + DEFINE_WAIT(sWait); + + prepare_to_wait(&sWaitForInit, &sWait, TASK_INTERRUPTIBLE); + + if (!bInitComplete) + { + PVR_TRACE(("%s: Waiting for module initialisation to complete", __FUNCTION__)); + + schedule(); + } + + finish_wait(&sWaitForInit, &sWait); + + if (signal_pending(current)) + { + return -ERESTARTSYS; + } + } + + if (bInitFailed) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Module initialisation failed", __FUNCTION__)); + return -EINVAL; + } + + return PVRSRVOpen(dev, file); +} + +#if defined(PVR_DRI_DRM_USE_POST_CLOSE) || defined(SUPPORT_DRI_DRM_PLUGIN) +#if defined(SUPPORT_DRI_DRM_PLUGIN) +DRI_DRM_STATIC int +PVRSRVDrmRelease(struct drm_device *dev, struct drm_file *file) +#else +DRI_DRM_STATIC void +PVRSRVDrmPostClose(struct drm_device *dev, struct drm_file *file) +#endif +{ + PVRSRVRelease(file->driver_priv); + + file->driver_priv = NULL; + +#if defined(SUPPORT_DRI_DRM_PLUGIN) + return 0; +#endif +} +#else +DRI_DRM_STATIC int +PVRSRVDrmRelease(struct inode *inode, struct file *filp) +{ + struct drm_file *file_priv = filp->private_data; + void *psDriverPriv = file_priv->driver_priv; + int ret; + + ret = drm_release(inode, filp); + + if (ret != 0) + { + /* + * An error means drm_release didn't call drm_lastclose, + * but it will have freed file_priv. + */ + PVR_DPF((PVR_DBG_ERROR, "%s : drm_release failed: %d", + __FUNCTION__, ret)); + } + + PVRSRVRelease(psDriverPriv); + + return 0; +} +#endif + +DRI_DRM_STATIC int +PVRDRMIsMaster(struct drm_device *dev, void *arg, struct drm_file *pFile) +{ + return 0; +} + +#if defined(SUPPORT_DRI_DRM_EXT) +int +PVRDRM_Dummy_ioctl(struct drm_device *dev, void *arg, struct drm_file *pFile) +{ + return 0; +} +#endif + +DRI_DRM_STATIC int +PVRDRMUnprivCmd(struct drm_device *dev, void *arg, struct drm_file *pFile) +{ + int ret = 0; + + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); + + if (arg == NULL) + { + ret = -EFAULT; + } + else + { + drm_pvr_unpriv_cmd *psArgs = (drm_pvr_unpriv_cmd *)arg; + + switch (psArgs->cmd) + { + case PVR_DRM_UNPRIV_INIT_SUCCESFUL: + psArgs->res = PVRSRVGetInitServerState(PVRSRV_INIT_SERVER_SUCCESSFUL) ? 1 : 0; + break; + + default: + ret = -EFAULT; + } + + } + + LinuxUnLockMutex(&gPVRSRVLock); + + return ret; +} + +#if defined(DISPLAY_CONTROLLER) && defined(PVR_DISPLAY_CONTROLLER_DRM_IOCTL) +static int +PVRDRM_Display_ioctl(struct drm_device *dev, void *arg, struct drm_file *pFile) +{ + int res; + + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); + + res = PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Ioctl)(dev, arg, pFile); + + LinuxUnLockMutex(&gPVRSRVLock); + + return res; +} +#endif + +#if defined(SUPPORT_DRM_MODESET) +static int +PVRSRVPciProbe(struct pci_dev *dev, const struct pci_device_id *id) +{ + PVR_TRACE(("PVRSRVPciProbe")); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) + return drm_get_pci_dev(dev, id, &sPVRDrmDriver); +#else + return drm_get_dev(dev, id, &sPVRDrmDriver); +#endif +} + +static void +PVRSRVPciRemove(struct pci_dev *dev) +{ + struct drm_device *psDrmDev; + + PVR_TRACE(("PVRSRVPciRemove")); + + psDrmDev = pci_get_drvdata(dev); + drm_put_dev(psDrmDev); +} +#endif + +/* + * For Linux 2.6.33 and above, the DRM ioctl entry point is of the unlocked + * variety. The big kernel lock is still taken for ioctls, unless + * the DRM_UNLOCKED flag is set. If you revise one of the driver specific + * ioctls, or add a new one, consider whether the gPVRSRVLock mutex needs + * to be taken. + */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33)) +#define PVR_DRM_FOPS_IOCTL .unlocked_ioctl +#define PVR_DRM_UNLOCKED DRM_UNLOCKED +#else +#define PVR_DRM_FOPS_IOCTL .ioctl +#define PVR_DRM_UNLOCKED 0 +#endif + +#if !defined(SUPPORT_DRI_DRM_EXT) + +#if defined(DRM_IOCTL_DEF) +#define PVR_DRM_IOCTL_DEF(ioctl, _func, _flags) DRM_IOCTL_DEF(DRM_##ioctl, _func, _flags) +#else +#define PVR_DRM_IOCTL_DEF(ioctl, _func, _flags) DRM_IOCTL_DEF_DRV(ioctl, _func, _flags) +#endif + +struct drm_ioctl_desc sPVRDrmIoctls[] = { + PVR_DRM_IOCTL_DEF(PVR_SRVKM, PVRSRV_BridgeDispatchKM, PVR_DRM_UNLOCKED), + PVR_DRM_IOCTL_DEF(PVR_IS_MASTER, PVRDRMIsMaster, DRM_MASTER | PVR_DRM_UNLOCKED), + PVR_DRM_IOCTL_DEF(PVR_UNPRIV, PVRDRMUnprivCmd, PVR_DRM_UNLOCKED), +#if defined(PDUMP) + PVR_DRM_IOCTL_DEF(PVR_DBGDRV, dbgdrv_ioctl, PVR_DRM_UNLOCKED), +#endif +#if defined(DISPLAY_CONTROLLER) && defined(PVR_DISPLAY_CONTROLLER_DRM_IOCTL) + PVR_DRM_IOCTL_DEF(PVR_DISP, PVRDRM_Display_ioctl, DRM_MASTER | PVR_DRM_UNLOCKED) +#endif +}; + +#if !defined(SUPPORT_DRI_DRM_PLUGIN) +static int pvr_max_ioctl = DRM_ARRAY_SIZE(sPVRDrmIoctls); +#endif + +#if defined(PVR_DRI_DRM_PLATFORM_DEV) && !defined(SUPPORT_DRI_DRM_EXT) && \ + !defined(SUPPORT_DRI_DRM_PLUGIN) +static int PVRSRVDrmProbe(struct platform_device *pDevice); +static int PVRSRVDrmRemove(struct platform_device *pDevice); +#endif /* defined(PVR_DRI_DRM_PLATFORM_DEV) && !defined(SUPPORT_DRI_DRM_EXT) */ + +#if defined(SUPPORT_DRI_DRM_PLUGIN) +static PVRSRV_DRM_PLUGIN sPVRDrmPlugin = +{ + .name = PVR_DRM_NAME, + + .open = PVRSRVDrmOpen, + .load = PVRSRVDrmLoad, + .unload = PVRSRVDrmUnload, + + .release = PVRSRVDrmRelease, + + .mmap = PVRMMap, + + .ioctls = sPVRDrmIoctls, + .num_ioctls = DRM_ARRAY_SIZE(sPVRDrmIoctls), + .ioctl_start = 0 +}; +#else /* defined(SUPPORT_DRI_DRM_PLUGIN) */ + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) +static const struct file_operations sPVRFileOps = +{ + .owner = THIS_MODULE, + .open = drm_open, +#if defined(PVR_DRI_DRM_USE_POST_CLOSE) + .release = drm_release, +#else + .release = PVRSRVDrmRelease, +#endif + PVR_DRM_FOPS_IOCTL = drm_ioctl, + .mmap = PVRMMap, + .poll = drm_poll, + .fasync = drm_fasync, +}; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) */ + +static struct drm_driver sPVRDrmDriver = +{ +#if defined(PVR_OLD_STYLE_DRM_PLATFORM_DEV) + .driver_features = DRIVER_USE_PLATFORM_DEVICE, +#else + .driver_features = 0, +#endif + .dev_priv_size = 0, + .load = PVRSRVDrmLoad, + .unload = PVRSRVDrmUnload, + .open = PVRSRVDrmOpen, +#if defined(PVR_DRI_DRM_USE_POST_CLOSE) + .postclose = PVRSRVDrmPostClose, +#endif +#if !defined(PVR_DRI_DRM_PLATFORM_DEV) && !defined(SUPPORT_DRM_MODESET) + .suspend = PVRSRVDriverSuspend, + .resume = PVRSRVDriverResume, +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) + .get_map_ofs = drm_core_get_map_ofs, + .get_reg_ofs = drm_core_get_reg_ofs, +#endif + .ioctls = sPVRDrmIoctls, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) + .fops = &sPVRFileOps, +#else + .fops = + { + .owner = THIS_MODULE, + .open = drm_open, +#if defined(PVR_DRI_DRM_USE_POST_CLOSE) + .release = drm_release, +#else + .release = PVRSRVDrmRelease, +#endif + PVR_DRM_FOPS_IOCTL = drm_ioctl, + .mmap = PVRMMap, + .poll = drm_poll, + .fasync = drm_fasync, + }, +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,39)) +#if defined(PVR_OLD_STYLE_DRM_PLATFORM_DEV) + .platform_driver = + { + .id_table = asPlatIdList, + .driver = + { + .name = PVR_DRM_NAME, + }, + .probe = PVRSRVDrmProbe, + .remove = PVRSRVDrmRemove, + .suspend = PVRSRVDriverSuspend, + .resume = PVRSRVDriverResume, + .shutdown = PVRSRVDriverShutdown, + }, +#else + .pci_driver = + { + .name = PVR_DRM_NAME, + .id_table = asPciIdList, +#if defined(SUPPORT_DRM_MODESET) + .probe = PVRSRVPciProbe, + .remove = PVRSRVPciRemove, + .suspend = PVRSRVDriverSuspend, + .resume = PVRSRVDriverResume, +#endif + }, +#endif +#endif + .name = PVR_DRM_NAME, + .desc = PVR_DRM_DESC, + .date = PVR_DRM_DATE, + .major = PVRVERSION_MAJ, + .minor = PVRVERSION_MIN, + .patchlevel = PVRVERSION_BUILD, +}; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) && !defined(PVR_DRI_DRM_PLATFORM_DEV) +static struct pci_driver sPVRPCIDriver = +{ + .name = PVR_DRM_NAME, + .id_table = asPciIdList, +#if defined(SUPPORT_DRM_MODESET) + .probe = PVRSRVPciProbe, + .remove = PVRSRVPciRemove, + .suspend = PVRSRVDriverSuspend, + .resume = PVRSRVDriverResume, +#endif +}; +#endif + +#if defined(PVR_NEW_STYLE_DRM_PLATFORM_DEV) +#if !defined(PVR_LDM_PLATFORM_PRE_REGISTERED) || defined(NO_HARDWARE) +static void PVRSRVDeviceRelease(struct device unref__ *pDevice) +{ +} + +static struct platform_device sPVRPlatDevice = { + .name = PVR_DRM_NAME, + .id = -1, + .dev = { + .release = PVRSRVDeviceRelease + } +}; +#endif + +static struct platform_driver sPVRPlatDriver = +{ + .id_table = asPlatIdList, + .driver = + { + .name = PVR_DRM_NAME, + }, + .probe = PVRSRVDrmProbe, + .remove = PVRSRVDrmRemove, + .suspend = PVRSRVDriverSuspend, + .resume = PVRSRVDriverResume, + .shutdown = PVRSRVDriverShutdown, +}; +#endif + +#endif /* defined(SUPPORT_DRI_DRM_PLUGIN) */ + +#if defined(PVR_DRI_DRM_PLATFORM_DEV) && !defined(SUPPORT_DRI_DRM_EXT) && \ + !defined(SUPPORT_DRI_DRM_PLUGIN) +static int +PVRSRVDrmProbe(struct platform_device *pDevice) +{ + PVR_TRACE(("PVRSRVDrmProbe")); + +#if defined(PVR_NEW_STYLE_DRM_PLATFORM_DEV) + gpsPVRLDMDev = pDevice; + + return drm_platform_init(&sPVRDrmDriver, gpsPVRLDMDev); +#else + return drm_get_platform_dev(pDevice, &sPVRDrmDriver); +#endif +} + +static int +PVRSRVDrmRemove(struct platform_device *pDevice) +{ + PVR_TRACE(("PVRSRVDrmRemove")); + +#if defined(PVR_NEW_STYLE_DRM_PLATFORM_DEV) + drm_platform_exit(&sPVRDrmDriver, gpsPVRLDMDev); +#else + drm_put_dev(gpsPVRDRMDev); +#endif + return 0; +} +#endif + +static int __init PVRSRVDrmInit(void) +{ + int iRes; +#if !defined(SUPPORT_DRI_DRM_PLUGIN) + sPVRDrmDriver.num_ioctls = pvr_max_ioctl; +#endif + +#if defined(SUPPORT_DRM_MODESET) + sPVRDrmDriver.driver_features |= DRIVER_MODESET; +#endif + + /* Must come before attempting to print anything via Services */ + PVRDPFInit(); + +#if defined(PVR_NEW_STYLE_DRM_PLATFORM_DEV) + iRes = platform_driver_register(&sPVRPlatDriver); +#if !defined(PVR_LDM_PLATFORM_PRE_REGISTERED) || defined(NO_HARDWARE) + if (iRes == 0) + { + iRes = platform_device_register(&sPVRPlatDevice); + if (iRes != 0) + { + platform_driver_unregister(&sPVRPlatDriver); + } + } +#endif +#else /* defined(PVR_NEW_STYLE_DRM_PLATFORM_DEV) */ +#if defined(SUPPORT_DRI_DRM_PLUGIN) + iRes = SysDRMRegisterPlugin(&sPVRDrmPlugin); +#else /* defined(SUPPORT_DRI_DRM_PLUGIN) */ +#if defined(PVR_DRI_DRM_NOT_PCI) + iRes = drm_pvr_dev_add(); + if (iRes != 0) + { + return iRes; + } +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) +#if defined(PVR_DRI_DRM_PLATFORM_DEV) + iRes = drm_platform_init(&sPVRDrmDriver, gpsPVRLDMDev); +#else + iRes = drm_pci_init(&sPVRDrmDriver, &sPVRPCIDriver); +#endif +#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) */ + iRes = drm_init(&sPVRDrmDriver); +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) */ + +#if defined(PVR_DRI_DRM_NOT_PCI) + if (iRes != 0) + { + drm_pvr_dev_remove(); + } +#endif +#endif /* defined(SUPPORT_DRI_DRM_PLUGIN) */ +#endif /* defined(PVR_NEW_STYLE_DRM_PLATFORM_DEV) */ + return iRes; +} + +static void __exit PVRSRVDrmExit(void) +{ +#if defined(PVR_NEW_STYLE_DRM_PLATFORM_DEV) +#if !defined(PVR_LDM_PLATFORM_PRE_REGISTERED) || defined(NO_HARDWARE) + platform_device_unregister(&sPVRPlatDevice); +#endif + platform_driver_unregister(&sPVRPlatDriver); +#else /* defined(PVR_NEW_STYLE_DRM_PLATFORM_DEV) */ +#if defined(SUPPORT_DRI_DRM_PLUGIN) + SysDRMUnregisterPlugin(&sPVRDrmPlugin); +#else /* defined(SUPPORT_DRI_DRM_PLUGIN) */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) +#if defined(PVR_DRI_DRM_PLATFORM_DEV) + drm_platform_exit(&sPVRDrmDriver, gpsPVRLDMDev); +#else + drm_pci_exit(&sPVRDrmDriver, &sPVRPCIDriver); +#endif +#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) */ + drm_exit(&sPVRDrmDriver); +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) */ + +#if defined(PVR_DRI_DRM_NOT_PCI) + drm_pvr_dev_remove(); +#endif +#endif /* defined(SUPPORT_DRI_DRM_PLUGIN) */ +#endif /* defined(PVR_NEW_STYLE_DRM_PLATFORM_DEV) */ +} + +/* + * These macro calls define the initialisation and removal functions of the + * driver. Although they are prefixed `module_', they apply when compiling + * statically as well; in both cases they define the function the kernel will + * run to start/stop the driver. +*/ +module_init(PVRSRVDrmInit); +module_exit(PVRSRVDrmExit); +#endif /* !defined(SUPPORT_DRI_DRM_EXT) */ +#endif /* defined(SUPPORT_DRI_DRM) */ + + diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_drm.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_drm.h new file mode 100644 index 0000000..c3ed413 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_drm.h @@ -0,0 +1,184 @@ +/*************************************************************************/ /*! +@Title PowerVR drm driver +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@Description drm module +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ +#if !defined(__PVR_DRM_H__) +#define __PVR_DRM_H__ + +#if defined (PDUMP) +#include "linuxsrv.h" +#endif + +#include "pvr_drm_shared.h" + +#if defined(SUPPORT_DRI_DRM) + +#if defined(PVR_DISPLAY_CONTROLLER_DRM_IOCTL) +#include "3rdparty_dc_drm_shared.h" +#endif + +#define PVR_DRM_MAKENAME_HELPER(x, y) x ## y +#define PVR_DRM_MAKENAME(x, y) PVR_DRM_MAKENAME_HELPER(x, y) + +#if defined(PVR_DRI_DRM_PLATFORM_DEV) +#define LDM_DEV struct platform_device +#endif + +int PVRCore_Init(void); +void PVRCore_Cleanup(void); +int PVRSRVOpen(struct drm_device *dev, struct drm_file *pFile); +void PVRSRVRelease(void *pvPrivData); + +#if !defined(SUPPORT_DRI_DRM_PLUGIN) +#if defined(PVR_DRI_DRM_PLATFORM_DEV) +void PVRSRVDriverShutdown(LDM_DEV *pDevice); +int PVRSRVDriverSuspend(LDM_DEV *pDevice, pm_message_t state); +int PVRSRVDriverResume(LDM_DEV *pDevice); +#else +#if defined(SUPPORT_DRM_MODESET) +int PVRSRVDriverSuspend(struct pci_dev *pDevice, pm_message_t state); +int PVRSRVDriverResume(struct pci_dev *pDevice); +#else +int PVRSRVDriverSuspend(struct drm_device *pDevice, pm_message_t state); +int PVRSRVDriverResume(struct drm_device *pDevice); +#endif /* defined(SUPPORT_DRM_MODESET) */ +#endif /* defined(PVR_DRI_DRM_PLATFORM_DEV) */ +#endif /* !defined(SUPPORT_DRI_DRM_PLUGIN) */ + +int PVRSRV_BridgeDispatchKM(struct drm_device *dev, void *arg, struct drm_file *pFile); + +#if defined(SUPPORT_DRI_DRM_EXT) +#define DRI_DRM_STATIC +/*Exported functions to common drm layer*/ +int PVRSRVDrmLoad(struct drm_device *dev, unsigned long flags); +int PVRSRVDrmUnload(struct drm_device *dev); +int PVRSRVDrmOpen(struct drm_device *dev, struct drm_file *file); +#if defined(PVR_LINUX_USING_WORKQUEUES) +DRI_DRM_STATIC int PVRSRVDrmRelease(struct inode *inode, struct file *filp); +#else +void PVRSRVDrmPostClose(struct drm_device *dev, struct drm_file *file); +#endif +int PVRDRMIsMaster(struct drm_device *dev, IMG_VOID *arg, struct drm_file *pFile); +int PVRDRMUnprivCmd(struct drm_device *dev, IMG_VOID *arg, struct drm_file *pFile); +int PVRDRM_Dummy_ioctl(struct drm_device *dev, IMG_VOID *arg, struct drm_file *pFile); +#else +#define DRI_DRM_STATIC static +#endif /* defined(SUPPORT_DRI_DRM_EXT) */ + +#if defined(DISPLAY_CONTROLLER) +extern int PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Init)(struct drm_device *); +extern void PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Cleanup)(struct drm_device *); +extern int PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Suspend)(struct drm_device *); +extern int PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Resume)(struct drm_device *); +#if defined(PVR_DISPLAY_CONTROLLER_DRM_IOCTL) +extern int PVR_DRM_MAKENAME(DISPLAY_CONTROLLER, _Ioctl)(struct drm_device *dev, void *arg, struct drm_file *pFile); +#endif +#endif + +#if defined(PDUMP) +int dbgdrv_init(void); +void dbgdrv_cleanup(void); +IMG_INT dbgdrv_ioctl(struct drm_device *dev, IMG_VOID *arg, struct drm_file *pFile); +#endif + +#if !defined(SUPPORT_DRI_DRM_EXT) +/* + * We need the command number names to begin with "DRM_" for newer versions + * of the macro used to fill out the DRM ioctl table. Similarly, the + * ioctl number names must begin with "DRM_IOCTL_". The suffixes for the + * two sets of strings must match (e.g. end with "PVR_SRVKM" in both + * cases). + */ + +#define DRM_PVR_SRVKM PVR_DRM_SRVKM_CMD +#define DRM_PVR_IS_MASTER PVR_DRM_IS_MASTER_CMD +#define DRM_PVR_UNPRIV PVR_DRM_UNPRIV_CMD +#define DRM_PVR_DBGDRV PVR_DRM_DBGDRV_CMD +#define DRM_PVR_DISP PVR_DRM_DISP_CMD + +/* + * Some versions of the kernel will dereference a NULL pointer if data is + * is passed to an ioctl that doesn't expect any, so avoid using the _IO + * macro, and use _IOW instead, specifying a dummy argument. +*/ +typedef struct { + char dummy[4]; +} drm_pvr_dummy_arg; + +/* IOCTL numbers, relative to DRM_COMMAND_BASE */ +#define DRM_IOCTL_PVR_SRVKM _IOWR(0, DRM_PVR_SRVKM, PVRSRV_BRIDGE_PACKAGE) +#define DRM_IOCTL_PVR_IS_MASTER _IOW(0, DRM_PVR_IS_MASTER, drm_pvr_dummy_arg) +#define DRM_IOCTL_PVR_UNPRIV _IOWR(0, DRM_PVR_UNPRIV, drm_pvr_unpriv_cmd) + +#if defined(PDUMP) +#define DRM_IOCTL_PVR_DBGDRV _IOWR(0, DRM_PVR_DBGDRV, IOCTL_PACKAGE) +#endif + +#if defined(PVR_DISPLAY_CONTROLLER_DRM_IOCTL) +#define DRM_IOCTL_PVR_DISP _IOWR(0, DRM_PVR_DISP, drm_pvr_display_cmd) +#endif +#endif /* !defined(SUPPORT_DRI_DRM_EXT) */ + +#if defined(SUPPORT_DRI_DRM_PLUGIN) +typedef struct { + char *name; + + int (*load)(struct drm_device *dev, unsigned long flags); + int (*unload)(struct drm_device *dev); + + int (*open)(struct drm_device *dev, struct drm_file *file); + int (*release)(struct drm_device *dev, struct drm_file *file); + + int (*mmap)(struct file* pFile, struct vm_area_struct* ps_vma); + + struct drm_ioctl_desc *ioctls; + int num_ioctls; + int ioctl_start; +} PVRSRV_DRM_PLUGIN; + +int SysDRMRegisterPlugin(PVRSRV_DRM_PLUGIN *psDRMPlugin); +void SysDRMUnregisterPlugin(PVRSRV_DRM_PLUGIN *psDRMPlugin); +#endif /* defined(SUPPORT_DRI_DRM_PLUGIN) */ + +#endif /* defined(SUPPORT_DRI_DRM) */ + +#endif /* defined(__PVR_DRM_H__) */ + + diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_sync.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_sync.c new file mode 100644 index 0000000..476f0a8 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_sync.c @@ -0,0 +1,1766 @@ +/*************************************************************************/ /*! +@File pvr_sync.c +@Title Kernel driver for Android's sync mechanism +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#include "pvr_sync.h" + +#include <linux/kernel.h> +#include <linux/file.h> +#include <linux/fs.h> +#include <linux/miscdevice.h> +#include <linux/module.h> +#include <linux/syscalls.h> +#include <linux/uaccess.h> +#include <linux/types.h> +#include <linux/atomic.h> +#include <linux/anon_inodes.h> +#include <linux/seq_file.h> + +#include "services_headers.h" +#include "sgxutils.h" +#include "ttrace.h" +#include "mutex.h" +#include "lock.h" + +//#define DEBUG_PRINT + +#if defined(DEBUG_PRINT) +#define DPF(fmt, ...) PVR_DPF((PVR_DBG_BUFFERED, fmt, __VA_ARGS__)) +#else +#define DPF(fmt, ...) do {} while(0) +#endif + +/* We can't support this code when the MISR runs in atomic context because + * PVRSyncFreeSync() may be called by sync_timeline_signal() which may be + * scheduled by the MISR. PVRSyncFreeSync() needs to protect the handle + * tables against modification and so uses the Linux bridge mutex. + * + * You can't lock a mutex in atomic context. + */ +#if !defined(PVR_LINUX_MISR_USING_WORKQUEUE) && \ + !defined(PVR_LINUX_MISR_USING_PRIVATE_WORKQUEUE) +#error The Android sync driver requires that the SGX MISR runs in wq context +#endif + +/* Local wrapper around PVRSRV_KERNEL_SYNC_INFO to add a list head */ + +struct PVR_SYNC_KERNEL_SYNC_INFO +{ + /* Base services sync info structure */ + PVRSRV_KERNEL_SYNC_INFO *psBase; + + /* Sync points can go away when there are deferred hardware + * operations still outstanding. We must not free the SYNC_INFO + * until the hardware is finished, so we add it to a defer list + * which is processed periodically ("defer-free"). + * + * This is also used for "defer-free" of a timeline -- the process + * may destroy its timeline or terminate abnormally but the HW could + * still be using the sync object hanging off of the timeline. + * + * Note that the defer-free list is global, not per-timeline. + */ + struct list_head sHead; +}; + +/* This is the IMG extension of a sync_timeline */ + +struct PVR_SYNC_TIMELINE +{ + struct sync_timeline obj; + + /* Needed to keep a global list of all timelines for MISR checks. */ + struct list_head sTimelineList; + + /* True if a sync point on the timeline has signaled */ + IMG_BOOL bSyncHasSignaled; + + /* A mutex, as we want to ensure that the comparison (and possible + * reset) of the highest SW fence value is atomic with the takeop, + * so both the SW fence value and the WOP snapshot should both have + * the same order for all SW syncs. + * + * This mutex also protects modifications to the fence stamp counter. + */ + struct mutex sTimelineLock; + + /* Every timeline has a services sync object. This object must not + * be used by the hardware to enforce ordering -- that's what the + * per sync-point objects are for. This object is attached to every + * TQ scheduled on the timeline and is primarily useful for debugging. + */ + struct PVR_SYNC_KERNEL_SYNC_INFO *psSyncInfo; +}; + +/* A PVR_SYNC_DATA is the basic guts of a sync point. It's kept separate + * because sync points can be dup'ed, and we don't want to duplicate all + * of the shared metadata. + * + * This is also used to back an allocated sync info, which can be passed to + * the CREATE ioctl to insert the fence and add it to the timeline. This is + * used as an intermediate step as a PVRSRV_KERNEL_SYNC_INFO is needed to + * attach to the transfer task used as a fence in the hardware. + */ + +struct PVR_SYNC_DATA +{ + /* Every sync point has a services sync object. This object is used + * by the hardware to enforce ordering -- it is attached as a source + * dependency to various commands. + */ + struct PVR_SYNC_KERNEL_SYNC_INFO *psSyncInfo; + + /* This refcount is incremented at create and dup time, and decremented + * at free time. It ensures the object doesn't start the defer-free + * process until it is no longer referenced. + */ + atomic_t sRefcount; + + /* This is purely a debug feature. Record the WOP snapshot from the + * timeline synchronization object when a new fence is created. + */ + IMG_UINT32 ui32WOPSnapshot; + + /* This is a globally unique ID for the sync point. If a sync point is + * dupped, its stamp is copied over (seems counter-intuitive, but in + * nearly all cases a sync point is merged with another, the original + * is freed). + */ + IMG_UINT64 ui64Stamp; +}; + +/* A PVR_ALLOC_SYNC_DATA is used to back an allocated, but not yet created + * and inserted into a timeline, sync data. This is required as we must + * allocate the syncinfo to be passed down with the transfer task used to + * implement fences in the hardware. + */ +struct PVR_ALLOC_SYNC_DATA +{ + struct PVR_SYNC_KERNEL_SYNC_INFO *psSyncInfo; + + /* A link to the timeline is required to add a per-timeline sync + * to the fence transfer task. + */ + struct PVR_SYNC_TIMELINE *psTimeline; + struct file *psFile; +}; + +/* This is the IMG extension of a sync_pt */ + +struct PVR_SYNC +{ + struct sync_pt pt; + struct PVR_SYNC_DATA *psSyncData; +}; + +struct PVR_SYNC_FENCE +{ + /* Base sync_fence structure */ + struct sync_fence *psBase; + + /* To ensure callbacks are always received for fences / sync_pts, even + * after the fence has been 'put' (freed), we must take a reference to + * the fence. We still need to 'put' the fence ourselves, but this might + * happen in irq context, where fput() is not allowed (in kernels <3.6). + * We must add the fence to a list which is processed in WQ context. + */ + struct list_head sHead; +}; + +/* Any sync point from a foreign (non-PVR) timeline needs to have a "shadow" + * syncinfo. This is modelled as a software operation. The foreign driver + * completes the operation by calling a callback we registered with it. + * + * Because we are allocating SYNCINFOs for each sync_pt, rather than each + * fence, we need to extend the waiter struct slightly to include the + * necessary metadata. + */ +struct PVR_SYNC_FENCE_WAITER +{ + /* Base sync driver waiter structure */ + struct sync_fence_waiter sWaiter; + + /* "Shadow" syncinfo backing the foreign driver's sync_pt */ + struct PVR_SYNC_KERNEL_SYNC_INFO *psSyncInfo; + + /* Optimizes lookup of fence for defer-put operation */ + struct PVR_SYNC_FENCE *psSyncFence; +}; + +/* Global data relating to PVR services connection */ + +static struct +{ + /* Process that initialized the sync driver. House-keep this so + * the correct per-proc data is used during shutdown. This PID is + * conventionally whatever `pvrsrvctl' was when it was alive. + */ + IMG_UINT32 ui32Pid; + + /* Device cookie for services allocation functions. The device would + * ordinarily be SGX, and the first/only device in the system. + */ + IMG_HANDLE hDevCookie; + + /* Device memory context that all SYNC_INFOs allocated by this driver + * will be created in. Because SYNC_INFOs are placed in a shared heap, + * it does not matter from which process the create ioctl originates. + */ + IMG_HANDLE hDevMemContext; +} +gsSyncServicesConnection; + +/* Multi-purpose workqueue. Various functions in the Google sync driver + * may call down to us in atomic context. However, sometimes we may need + * to lock a mutex. To work around this conflict, use the workqueue to + * defer whatever the operation was. + */ +static struct workqueue_struct *gpsWorkQueue; + +/* Linux work struct for workqueue. */ +static struct work_struct gsWork; + +/* List of timelines, used by MISR callback to find signalled sync points + * and also to kick the hardware if signalling may allow progress to be + * made. + */ +static LIST_HEAD(gTimelineList); +static DEFINE_MUTEX(gTimelineListLock); + +/* The "defer-free" object list. Driver global. */ +static LIST_HEAD(gSyncInfoFreeList); +static DEFINE_SPINLOCK(gSyncInfoFreeListLock); + +/* The "defer-put" object list. Driver global. */ +static LIST_HEAD(gFencePutList); +static DEFINE_SPINLOCK(gFencePutListLock); + +/* Sync point stamp counter -- incremented on creation of a new sync point */ +static IMG_UINT64 gui64SyncPointStamp; + +/* Forward declare due to cyclic dependency on gsSyncFenceAllocFOps */ +static struct PVR_ALLOC_SYNC_DATA *PVRSyncAllocFDGet(int fd); + +/* NOTE: Must only be called with services bridge mutex held */ +static void PVRSyncSWTakeOp(PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo) +{ + psKernelSyncInfo->psSyncData->ui32WriteOpsPending = 1; +} + +static void PVRSyncSWCompleteOp(PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo) +{ + psKernelSyncInfo->psSyncData->ui32WriteOpsComplete = 1; +} + +static struct PVR_SYNC * +PVRSyncCreateSync(struct PVR_SYNC_TIMELINE *obj, + struct PVR_SYNC_KERNEL_SYNC_INFO *psSyncInfo) +{ + struct PVR_SYNC *psPt = NULL; + + psPt = (struct PVR_SYNC *) + sync_pt_create(&obj->obj, sizeof(struct PVR_SYNC)); + if(!psPt) + { + PVR_DPF((PVR_DBG_ERROR, "%s: sync_pt_create failed", __func__)); + goto err_out; + } + + psPt->psSyncData = kmalloc(sizeof(struct PVR_SYNC_DATA), GFP_KERNEL); + if(!psPt->psSyncData) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate PVR_SYNC_DATA", + __func__)); + goto err_free_pt; + } + + atomic_set(&psPt->psSyncData->sRefcount, 1); + + psPt->psSyncData->ui32WOPSnapshot = + obj->psSyncInfo->psBase->psSyncData->ui32WriteOpsPending; + + psPt->psSyncData->psSyncInfo = psSyncInfo; + + /* Stamp the point and update the global counter under lock */ + mutex_lock(&obj->sTimelineLock); + psPt->psSyncData->ui64Stamp = gui64SyncPointStamp++; + mutex_unlock(&obj->sTimelineLock); + +err_out: + return psPt; +err_free_pt: + sync_pt_free((struct sync_pt *)psPt); + psPt = NULL; + goto err_out; +} + +static IMG_BOOL PVRSyncIsSyncInfoInUse(PVRSRV_KERNEL_SYNC_INFO *psSyncInfo) +{ + return !(psSyncInfo->psSyncData->ui32WriteOpsPending == + psSyncInfo->psSyncData->ui32WriteOpsComplete && + psSyncInfo->psSyncData->ui32ReadOpsPending == + psSyncInfo->psSyncData->ui32ReadOpsComplete && + psSyncInfo->psSyncData->ui32ReadOps2Pending == + psSyncInfo->psSyncData->ui32ReadOps2Complete); +} + +/* Releases a sync info by adding it to a deferred list to be freed later. */ +static void +PVRSyncReleaseSyncInfo(struct PVR_SYNC_KERNEL_SYNC_INFO *psSyncInfo) +{ + unsigned long flags; + + spin_lock_irqsave(&gSyncInfoFreeListLock, flags); + list_add_tail(&psSyncInfo->sHead, &gSyncInfoFreeList); + spin_unlock_irqrestore(&gSyncInfoFreeListLock, flags); + + queue_work(gpsWorkQueue, &gsWork); +} + +static void PVRSyncFreeSyncData(struct PVR_SYNC_DATA *psSyncData) +{ + PVR_ASSERT(atomic_read(&psSyncData->sRefcount) == 0); + PVRSyncReleaseSyncInfo(psSyncData->psSyncInfo); + psSyncData->psSyncInfo = NULL; + kfree(psSyncData); +} + +static void PVRSyncFreeSync(struct sync_pt *psPt) +{ + struct PVR_SYNC *psSync = (struct PVR_SYNC *)psPt; +#if defined(DEBUG_PRINT) + PVRSRV_KERNEL_SYNC_INFO *psSyncInfo = + psSync->psSyncData->psSyncInfo->psBase; +#endif + + PVR_ASSERT(atomic_read(&psSync->psSyncData->sRefcount) > 0); + + /* Only free on the last reference */ + if (atomic_dec_return(&psSync->psSyncData->sRefcount) != 0) + return; + + DPF("R( ): WOCVA=0x%.8X ROCVA=0x%.8X RO2CVA=0x%.8X " + "WOP/C=0x%x/0x%x ROP/C=0x%x/0x%x RO2P/C=0x%x/0x%x " + "ID=%llu, S=0x%x, F=%p", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->sReadOpsCompleteDevVAddr.uiAddr, + psSyncInfo->sReadOps2CompleteDevVAddr.uiAddr, + psSyncInfo->psSyncData->ui32WriteOpsPending, + psSyncInfo->psSyncData->ui32WriteOpsComplete, + psSyncInfo->psSyncData->ui32ReadOpsPending, + psSyncInfo->psSyncData->ui32ReadOpsComplete, + psSyncInfo->psSyncData->ui32ReadOps2Pending, + psSyncInfo->psSyncData->ui32ReadOps2Complete, + psSync->psSyncData->ui64Stamp, + psSync->psSyncData->ui32WOPSnapshot, + psSync->pt.fence); + + PVRSyncFreeSyncData(psSync->psSyncData); + psSync->psSyncData = NULL; +} + +static struct sync_pt *PVRSyncDup(struct sync_pt *sync_pt) +{ + struct PVR_SYNC *psPt, *psParentPt = (struct PVR_SYNC *)sync_pt; + + psPt = (struct PVR_SYNC *) + sync_pt_create(sync_pt->parent, sizeof(struct PVR_SYNC)); + if(!psPt) + { + PVR_DPF((PVR_DBG_ERROR, "%s: sync_pt_create failed", __func__)); + goto err_out; + } + + psPt->psSyncData = psParentPt->psSyncData; + atomic_inc(&psPt->psSyncData->sRefcount); + + PVR_ASSERT(atomic_read(&psPt->psSyncData->sRefcount) > 1); + +err_out: + return (struct sync_pt*)psPt; +} + +static int PVRSyncHasSignaled(struct sync_pt *sync_pt) +{ + struct PVR_SYNC *psPt = (struct PVR_SYNC *)sync_pt; + struct PVR_SYNC_TIMELINE *psTimeline = + (struct PVR_SYNC_TIMELINE *) sync_pt->parent; + PVRSRV_SYNC_DATA *psSyncData = + psPt->psSyncData->psSyncInfo->psBase->psSyncData; + + if (psSyncData->ui32WriteOpsComplete >= psSyncData->ui32WriteOpsPending) + { + psTimeline->bSyncHasSignaled = IMG_TRUE; + return 1; + } + + return 0; +} + +static int PVRSyncCompare(struct sync_pt *a, struct sync_pt *b) +{ + IMG_UINT64 ui64StampA = ((struct PVR_SYNC *)a)->psSyncData->ui64Stamp; + IMG_UINT64 ui64StampB = ((struct PVR_SYNC *)b)->psSyncData->ui64Stamp; + + if (ui64StampA == ui64StampB) + return 0; + else if (ui64StampA > ui64StampB) + return 1; + else + return -1; +} + +static void PVRSyncPrintTimeline(struct seq_file *s, + struct sync_timeline *psObj) +{ + struct PVR_SYNC_TIMELINE *psTimeline = (struct PVR_SYNC_TIMELINE *)psObj; + + seq_printf(s, "WOP/WOC=0x%x/0x%x", + psTimeline->psSyncInfo->psBase->psSyncData->ui32WriteOpsPending, + psTimeline->psSyncInfo->psBase->psSyncData->ui32WriteOpsComplete); +} + +static void PVRSyncPrint(struct seq_file *s, struct sync_pt *psPt) +{ + struct PVR_SYNC *psSync = (struct PVR_SYNC *)psPt; + PVRSRV_KERNEL_SYNC_INFO *psSyncInfo = + psSync->psSyncData->psSyncInfo->psBase; + + seq_printf(s, "ID=%llu, refs=%u, WOPSnapshot=0x%x, parent=%p", + psSync->psSyncData->ui64Stamp, + atomic_read(&psSync->psSyncData->sRefcount), + psSync->psSyncData->ui32WOPSnapshot, + psSync->pt.parent); + seq_printf(s, "\n WOP/WOC=0x%x/0x%x, " + "ROP/ROC=0x%x/0x%x, ROP2/ROC2=0x%x/0x%x, " + "WOC DevVA=0x%.8x, ROC DevVA=0x%.8x, " + "ROC2 DevVA=0x%.8x", + psSyncInfo->psSyncData->ui32WriteOpsPending, + psSyncInfo->psSyncData->ui32WriteOpsComplete, + psSyncInfo->psSyncData->ui32ReadOpsPending, + psSyncInfo->psSyncData->ui32ReadOpsComplete, + psSyncInfo->psSyncData->ui32ReadOps2Pending, + psSyncInfo->psSyncData->ui32ReadOps2Complete, + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->sReadOpsCompleteDevVAddr.uiAddr, + psSyncInfo->sReadOps2CompleteDevVAddr.uiAddr); +} + +static void PVRSyncReleaseTimeline(struct sync_timeline *psObj) +{ + struct PVR_SYNC_TIMELINE *psTimeline = (struct PVR_SYNC_TIMELINE *)psObj; + + mutex_lock(&gTimelineListLock); + list_del(&psTimeline->sTimelineList); + mutex_unlock(&gTimelineListLock); + + DPF("R(t): WOCVA=0x%.8X ROCVA=0x%.8X RO2CVA=0x%.8X " + "WOP/C=0x%x/0x%x ROP/C=0x%x/0x%x RO2P/C=0x%x/0x%x T=%p", + psTimeline->psSyncInfo->psBase->sWriteOpsCompleteDevVAddr.uiAddr, + psTimeline->psSyncInfo->psBase->sReadOpsCompleteDevVAddr.uiAddr, + psTimeline->psSyncInfo->psBase->sReadOps2CompleteDevVAddr.uiAddr, + psTimeline->psSyncInfo->psBase->psSyncData->ui32WriteOpsPending, + psTimeline->psSyncInfo->psBase->psSyncData->ui32WriteOpsComplete, + psTimeline->psSyncInfo->psBase->psSyncData->ui32ReadOpsPending, + psTimeline->psSyncInfo->psBase->psSyncData->ui32ReadOpsComplete, + psTimeline->psSyncInfo->psBase->psSyncData->ui32ReadOps2Pending, + psTimeline->psSyncInfo->psBase->psSyncData->ui32ReadOps2Complete, + psTimeline); + + PVRSyncReleaseSyncInfo(psTimeline->psSyncInfo); + psTimeline->psSyncInfo = NULL; +} + +static PVRSRV_ERROR PVRSyncInitServices(void) +{ + IMG_BOOL bCreated, bShared[PVRSRV_MAX_CLIENT_HEAPS]; + PVRSRV_HEAP_INFO sHeapInfo[PVRSRV_MAX_CLIENT_HEAPS]; + IMG_UINT32 ui32ClientHeapCount = 0; + PVRSRV_PER_PROCESS_DATA *psPerProc; + PVRSRV_ERROR eError; + + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); + + gsSyncServicesConnection.ui32Pid = OSGetCurrentProcessIDKM(); + + eError = PVRSRVProcessConnect(gsSyncServicesConnection.ui32Pid, 0); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR, "%s: PVRSRVProcessConnect failed", + __func__)); + goto err_unlock; + } + + psPerProc = PVRSRVFindPerProcessData(); + if (!psPerProc) + { + PVR_DPF((PVR_DBG_ERROR, "%s: PVRSRVFindPerProcessData failed", + __func__)); + goto err_disconnect; + } + + eError = PVRSRVAcquireDeviceDataKM(0, PVRSRV_DEVICE_TYPE_SGX, + &gsSyncServicesConnection.hDevCookie); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR, "%s: PVRSRVAcquireDeviceDataKM failed", + __func__)); + goto err_disconnect; + } + + if (!gsSyncServicesConnection.hDevCookie) + { + PVR_DPF((PVR_DBG_ERROR, "%s: hDevCookie is NULL", __func__)); + goto err_disconnect; + } + + eError = PVRSRVCreateDeviceMemContextKM(gsSyncServicesConnection.hDevCookie, + psPerProc, + &gsSyncServicesConnection.hDevMemContext, + &ui32ClientHeapCount, + &sHeapInfo[0], + &bCreated, + &bShared[0]); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR, "%s: PVRSRVCreateDeviceMemContextKM failed", + __func__)); + goto err_disconnect; + } + + if (!gsSyncServicesConnection.hDevMemContext) + { + PVR_DPF((PVR_DBG_ERROR, "%s: hDevMemContext is NULL", __func__)); + goto err_disconnect; + } + +err_unlock: + LinuxUnLockMutex(&gPVRSRVLock); + return eError; + +err_disconnect: + PVRSRVProcessDisconnect(gsSyncServicesConnection.ui32Pid); + goto err_unlock; +} + +static void PVRSyncCloseServices(void) +{ + IMG_BOOL bDummy; + + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); + + PVRSRVDestroyDeviceMemContextKM(gsSyncServicesConnection.hDevCookie, + gsSyncServicesConnection.hDevMemContext, + &bDummy); + gsSyncServicesConnection.hDevMemContext = NULL; + gsSyncServicesConnection.hDevCookie = NULL; + + PVRSRVProcessDisconnect(gsSyncServicesConnection.ui32Pid); + gsSyncServicesConnection.ui32Pid = 0; + + LinuxUnLockMutex(&gPVRSRVLock); +} + +static struct sync_timeline_ops gsTimelineOps = +{ + .driver_name = "pvr_sync", + .dup = PVRSyncDup, + .has_signaled = PVRSyncHasSignaled, + .compare = PVRSyncCompare, + .release_obj = PVRSyncReleaseTimeline, + .print_obj = PVRSyncPrintTimeline, + .print_pt = PVRSyncPrint, + .free_pt = PVRSyncFreeSync, +}; + +static struct PVR_SYNC_TIMELINE *PVRSyncCreateTimeline(const IMG_CHAR *pszName) +{ + struct PVR_SYNC_TIMELINE *psTimeline; + PVRSRV_ERROR eError; + + psTimeline = (struct PVR_SYNC_TIMELINE *) + sync_timeline_create(&gsTimelineOps, sizeof(struct PVR_SYNC_TIMELINE), + pszName); + if (!psTimeline) + { + PVR_DPF((PVR_DBG_ERROR, "%s: sync_timeline_create failed", __func__)); + goto err_out; + } + + psTimeline->psSyncInfo = + kmalloc(sizeof(struct PVR_SYNC_KERNEL_SYNC_INFO), GFP_KERNEL); + if(!psTimeline->psSyncInfo) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate " + "PVR_SYNC_KERNEL_SYNC_INFO", __func__)); + goto err_free_timeline; + } + + psTimeline->bSyncHasSignaled = IMG_FALSE; + + mutex_init(&psTimeline->sTimelineLock); + + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); + eError = PVRSRVAllocSyncInfoKM(gsSyncServicesConnection.hDevCookie, + gsSyncServicesConnection.hDevMemContext, + &psTimeline->psSyncInfo->psBase); + LinuxUnLockMutex(&gPVRSRVLock); + + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate timeline syncinfo", + __func__)); + goto err_free_syncinfo; + } + + DPF("A(t): WOCVA=0x%.8X ROCVA=0x%.8X RO2CVA=0x%.8X T=%p %s", + psTimeline->psSyncInfo->psBase->sWriteOpsCompleteDevVAddr.uiAddr, + psTimeline->psSyncInfo->psBase->sReadOpsCompleteDevVAddr.uiAddr, + psTimeline->psSyncInfo->psBase->sReadOps2CompleteDevVAddr.uiAddr, + psTimeline, pszName); + +err_out: + return psTimeline; +err_free_syncinfo: + kfree(psTimeline->psSyncInfo); +err_free_timeline: + sync_timeline_destroy((struct sync_timeline *)psTimeline); + psTimeline = NULL; + goto err_out; +} + +static int PVRSyncOpen(struct inode *inode, struct file *file) +{ + struct PVR_SYNC_TIMELINE *psTimeline; + IMG_CHAR task_comm[TASK_COMM_LEN+1]; + + get_task_comm(task_comm, current); + + psTimeline = PVRSyncCreateTimeline(task_comm); + if (!psTimeline) + return -ENOMEM; + + mutex_lock(&gTimelineListLock); + list_add_tail(&psTimeline->sTimelineList, &gTimelineList); + mutex_unlock(&gTimelineListLock); + + file->private_data = psTimeline; + return 0; +} + +static int PVRSyncRelease(struct inode *inode, struct file *file) +{ + struct PVR_SYNC_TIMELINE *psTimeline = file->private_data; + sync_timeline_destroy(&psTimeline->obj); + return 0; +} + +static long +PVRSyncIOCTLCreate(struct PVR_SYNC_TIMELINE *psObj, void __user *pvData) +{ + struct PVR_SYNC_KERNEL_SYNC_INFO *psProvidedSyncInfo = NULL; + struct PVR_ALLOC_SYNC_DATA *psAllocSyncData; + struct PVR_SYNC_CREATE_IOCTL_DATA sData; + int err = -EFAULT, iFd = get_unused_fd(); + struct sync_fence *psFence; + struct sync_pt *psPt; + + if (iFd < 0) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to find unused fd (%d)", + __func__, iFd)); + goto err_out; + } + + if (!access_ok(VERIFY_READ, pvData, sizeof(sData))) + goto err_put_fd; + + if (copy_from_user(&sData, pvData, sizeof(sData))) + goto err_put_fd; + + if (sData.allocdSyncInfo < 0) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Requested to create a fence from " + " an invalid alloc'd fd (%d)", __func__, + sData.allocdSyncInfo)); + goto err_put_fd; + } + + psAllocSyncData = PVRSyncAllocFDGet(sData.allocdSyncInfo); + if (!psAllocSyncData) + { + PVR_DPF((PVR_DBG_ERROR, "%s: PVRSyncAllocFDGet returned NULL, " + "possibly fd passed to CREATE is not an " + "ALLOC'd sync?", __func__)); + goto err_put_fd; + } + + /* Move the psSyncInfo to the newly created sync, to avoid attempting + * to create multiple syncs from the same allocation. + */ + psProvidedSyncInfo = psAllocSyncData->psSyncInfo; + psAllocSyncData->psSyncInfo = NULL; + + if (psProvidedSyncInfo == NULL) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Alloc'd sync info is null - " + "possibly already CREATEd?", __func__)); + fput(psAllocSyncData->psFile); + goto err_put_fd; + } + + fput(psAllocSyncData->psFile); + + psPt = (struct sync_pt *)PVRSyncCreateSync(psObj, psProvidedSyncInfo); + if (!psPt) + { + err = -ENOMEM; + goto err_put_fd; + } + + sData.name[sizeof(sData.name) - 1] = '\0'; + psFence = sync_fence_create(sData.name, psPt); + if (!psFence) + { + sync_pt_free(psPt); + err = -ENOMEM; + goto err_put_fd; + } + + sData.fence = iFd; + + if (!access_ok(VERIFY_WRITE, pvData, sizeof(sData))) + { + sync_fence_put(psFence); + goto err_put_fd; + } + + if (copy_to_user(pvData, &sData, sizeof(sData))) + { + sync_fence_put(psFence); + goto err_put_fd; + } + + /* If the fence is a 'real' one, its signal status will be updated by + * the MISR calling PVRSyncUpdateAllSyncs(). However, if we created + * a 'fake' fence (for power optimization reasons) it has already + * completed, and needs to be marked signalled (as the MISR will + * never run for 'fake' fences). + */ + if(psProvidedSyncInfo->psBase->psSyncData->ui32WriteOpsPending == 0) + sync_timeline_signal((struct sync_timeline *)psObj); + + DPF("C( ): WOCVA=0x%.8X ROCVA=0x%.8X RO2CVA=0x%.8X F=%p %s", + psProvidedSyncInfo->psBase->sWriteOpsCompleteDevVAddr.uiAddr, + psProvidedSyncInfo->psBase->sReadOpsCompleteDevVAddr.uiAddr, + psProvidedSyncInfo->psBase->sReadOps2CompleteDevVAddr.uiAddr, + psFence, sData.name); + + sync_fence_install(psFence, iFd); + err = 0; +err_out: + return err; + +err_put_fd: + put_unused_fd(iFd); + goto err_out; +} + +static long +PVRSyncIOCTLDebug(struct PVR_SYNC_TIMELINE *psObj, void __user *pvData) +{ + struct PVR_SYNC_DEBUG_IOCTL_DATA sData; + struct sync_fence *psFence; + struct list_head *psEntry; + int i = 0, err = -EFAULT; + + if(!access_ok(VERIFY_READ, pvData, sizeof(sData))) + goto err_out; + + if(copy_from_user(&sData, pvData, sizeof(sData))) + goto err_out; + + psFence = sync_fence_fdget(sData.iFenceFD); + if(!psFence) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to get fence from fd", __func__)); + goto err_out; + } + + list_for_each(psEntry, &psFence->pt_list_head) + { + PVR_SYNC_DEBUG *psMetaData = &sData.sSync[i].sMetaData; + PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo; + struct PVR_SYNC_TIMELINE *psTimeline; + struct PVR_SYNC *psPt; + + if(i == PVR_SYNC_DEBUG_MAX_POINTS) + { + PVR_DPF((PVR_DBG_WARNING, "%s: Fence merged with more than %d " + "points", __func__, + PVR_SYNC_DEBUG_MAX_POINTS)); + break; + } + + psPt = (struct PVR_SYNC *) + container_of(psEntry, struct sync_pt, pt_list); + + /* Don't dump foreign points */ + if(psPt->pt.parent->ops != &gsTimelineOps) + continue; + + psTimeline = (struct PVR_SYNC_TIMELINE *)psPt->pt.parent; + psKernelSyncInfo = psPt->psSyncData->psSyncInfo->psBase; + PVR_ASSERT(psKernelSyncInfo != NULL); + + /* The sync refcount is valid as long as the FenceFD stays open, + * so we can access it directly without worrying about it being + * freed. + */ + sData.sSync[i].sSyncData = *psKernelSyncInfo->psSyncData; + + psMetaData->ui64Stamp = psPt->psSyncData->ui64Stamp; + psMetaData->ui32WriteOpsPendingSnapshot = psPt->psSyncData->ui32WOPSnapshot; + i++; + } + + sync_fence_put(psFence); + + sData.ui32NumPoints = i; + + if(!access_ok(VERIFY_WRITE, pvData, sizeof(sData))) + goto err_out; + + if(copy_to_user(pvData, &sData, sizeof(sData))) + goto err_out; + + err = 0; +err_out: + return err; +} + +static int PVRSyncFenceAllocRelease(struct inode *inode, struct file *file) +{ + struct PVR_ALLOC_SYNC_DATA *psAllocSyncData = file->private_data; + + if(psAllocSyncData->psSyncInfo) + { +#if defined(DEBUG_PRINT) + PVRSRV_KERNEL_SYNC_INFO *psSyncInfo = + psAllocSyncData->psSyncInfo->psBase; +#endif + + DPF("R(a): WOCVA=0x%.8X ROCVA=0x%.8X RO2CVA=0x%.8X", + psSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->sReadOpsCompleteDevVAddr.uiAddr, + psSyncInfo->sReadOps2CompleteDevVAddr.uiAddr); + + PVRSyncReleaseSyncInfo(psAllocSyncData->psSyncInfo); + psAllocSyncData->psSyncInfo = NULL; + } + + kfree(psAllocSyncData); + return 0; +} + +static const struct file_operations gsSyncFenceAllocFOps = +{ + .release = PVRSyncFenceAllocRelease, +}; + +static struct PVR_ALLOC_SYNC_DATA *PVRSyncAllocFDGet(int fd) +{ + struct file *file = fget(fd); + if (!file) + return NULL; + if (file->f_op != &gsSyncFenceAllocFOps) + goto err; + return file->private_data; +err: + fput(file); + return NULL; +} + +static long +PVRSyncIOCTLAlloc(struct PVR_SYNC_TIMELINE *psTimeline, void __user *pvData) +{ + struct PVR_ALLOC_SYNC_DATA *psAllocSyncData; + int err = -EFAULT, iFd = get_unused_fd(); + struct PVR_SYNC_ALLOC_IOCTL_DATA sData; + PVRSRV_SYNC_DATA *psSyncData; + struct file *psFile; + PVRSRV_ERROR eError; + + if (iFd < 0) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to find unused fd (%d)", + __func__, iFd)); + goto err_out; + } + + if (!access_ok(VERIFY_READ, pvData, sizeof(sData))) + goto err_put_fd; + + if (copy_from_user(&sData, pvData, sizeof(sData))) + goto err_put_fd; + + psAllocSyncData = kmalloc(sizeof(struct PVR_ALLOC_SYNC_DATA), GFP_KERNEL); + if (!psAllocSyncData) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate PVR_ALLOC_SYNC_DATA", + __func__)); + err = -ENOMEM; + goto err_put_fd; + } + + psAllocSyncData->psSyncInfo = + kmalloc(sizeof(struct PVR_SYNC_KERNEL_SYNC_INFO), GFP_KERNEL); + if (!psAllocSyncData->psSyncInfo) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate " + "PVR_SYNC_KERNEL_SYNC_INFO", __func__)); + err = -ENOMEM; + goto err_free_alloc_sync_data; + } + + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); + eError = PVRSRVAllocSyncInfoKM(gsSyncServicesConnection.hDevCookie, + gsSyncServicesConnection.hDevMemContext, + &psAllocSyncData->psSyncInfo->psBase); + LinuxUnLockMutex(&gPVRSRVLock); + + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to alloc syncinfo (%d)", + __func__, eError)); + err = -ENOMEM; + goto err_free_sync_info; + } + + psFile = anon_inode_getfile("pvr_sync_alloc", + &gsSyncFenceAllocFOps, psAllocSyncData, 0); + if (!psFile) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to create anon inode", + __func__)); + err = -ENOMEM; + goto err_release_sync_info; + } + + sData.fence = iFd; + + /* Check if this timeline looks idle. If there are still TQs running + * on it, userspace shouldn't attempt any kind of power optimization + * (e.g. it must not dummy-process GPU fences). + * + * Determining idleness here is safe because the ALLOC and CREATE + * pvr_sync ioctls must be called under the gralloc module lock, so + * we can't be creating another new fence op while we are still + * processing this one. + * + * Take the bridge lock anyway so we can be sure that we read the + * timeline sync's pending value coherently. The complete value may + * be modified by the GPU, but worse-case we will decide we can't do + * the power optimization and will still be correct. + */ + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); + + psSyncData = psTimeline->psSyncInfo->psBase->psSyncData; + if(psSyncData->ui32WriteOpsPending == psSyncData->ui32WriteOpsComplete) + sData.bTimelineIdle = IMG_TRUE; + else + sData.bTimelineIdle = IMG_FALSE; + + LinuxUnLockMutex(&gPVRSRVLock); + + if (!access_ok(VERIFY_WRITE, pvData, sizeof(sData))) + goto err_release_file; + + if (copy_to_user(pvData, &sData, sizeof(sData))) + goto err_release_file; + + psAllocSyncData->psTimeline = psTimeline; + psAllocSyncData->psFile = psFile; + + DPF("A( ): WOCVA=0x%.8X ROCVA=0x%.8X RO2CVA=0x%.8X", + psAllocSyncData->psSyncInfo->psBase->sWriteOpsCompleteDevVAddr.uiAddr, + psAllocSyncData->psSyncInfo->psBase->sReadOpsCompleteDevVAddr.uiAddr, + psAllocSyncData->psSyncInfo->psBase->sReadOps2CompleteDevVAddr.uiAddr); + + fd_install(iFd, psFile); + err = 0; +err_out: + return err; +err_release_sync_info: + PVRSRVReleaseSyncInfoKM(psAllocSyncData->psSyncInfo->psBase); +err_free_sync_info: + kfree(psAllocSyncData->psSyncInfo); +err_free_alloc_sync_data: + kfree(psAllocSyncData); +err_put_fd: + put_unused_fd(iFd); + goto err_out; +err_release_file: + fput(psFile); + put_unused_fd(iFd); + goto err_out; +} + +static long +PVRSyncIOCTL(struct file *file, unsigned int cmd, unsigned long __user arg) +{ + struct PVR_SYNC_TIMELINE *psTimeline = file->private_data; + void __user *pvData = (void __user *)arg; + + switch (cmd) + { + case PVR_SYNC_IOC_CREATE_FENCE: + return PVRSyncIOCTLCreate(psTimeline, pvData); + case PVR_SYNC_IOC_DEBUG_FENCE: + return PVRSyncIOCTLDebug(psTimeline, pvData); + case PVR_SYNC_IOC_ALLOC_FENCE: + return PVRSyncIOCTLAlloc(psTimeline, pvData); + default: + return -ENOTTY; + } +} + +static void PVRSyncWorkQueueFunction(struct work_struct *data) +{ + PVRSRV_DEVICE_NODE *psDevNode = + (PVRSRV_DEVICE_NODE*)gsSyncServicesConnection.hDevCookie; + struct list_head sFreeList, *psEntry, *n; + unsigned long flags; + + /* We lock the bridge mutex here for two reasons. + * + * Firstly, the SGXScheduleProcessQueuesKM and PVRSRVReleaseSyncInfoKM + * functions require that they are called under lock. Multiple threads + * into services are not allowed. + * + * Secondly, we need to ensure that when processing the defer-free list, + * the PVRSyncIsSyncInfoInUse() function is called *after* any freed + * sync was attached as a HW dependency (had ROP/ROP2 taken). This is + * because for 'foreign' sync timelines we allocate a new object and + * mark it for deletion immediately. If the 'foreign' sync_pt signals + * before the kick ioctl has completed, we can block it from being + * prematurely freed by holding the bridge mutex. + * + * NOTE: This code relies on the assumption that we can acquire a + * spinlock while a mutex is held and that other users of the spinlock + * do not need to hold the bridge mutex. + */ + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); + + /* A completed SW operation may un-block the GPU */ + SGXScheduleProcessQueuesKM(psDevNode); + + /* We can't call PVRSRVReleaseSyncInfoKM directly in this loop because + * that will take the mmap mutex. We can't take mutexes while we have + * this list locked with a spinlock. So move all the items we want to + * free to another, local list (no locking required) and process it + * in a second loop. + */ + + INIT_LIST_HEAD(&sFreeList); + spin_lock_irqsave(&gSyncInfoFreeListLock, flags); + list_for_each_safe(psEntry, n, &gSyncInfoFreeList) + { + struct PVR_SYNC_KERNEL_SYNC_INFO *psSyncInfo = + container_of(psEntry, struct PVR_SYNC_KERNEL_SYNC_INFO, sHead); + + if(!PVRSyncIsSyncInfoInUse(psSyncInfo->psBase)) + list_move_tail(psEntry, &sFreeList); + + } + spin_unlock_irqrestore(&gSyncInfoFreeListLock, flags); + + list_for_each_safe(psEntry, n, &sFreeList) + { + struct PVR_SYNC_KERNEL_SYNC_INFO *psSyncInfo = + container_of(psEntry, struct PVR_SYNC_KERNEL_SYNC_INFO, sHead); + + list_del(psEntry); + + DPF("F(d): WOCVA=0x%.8X ROCVA=0x%.8X RO2CVA=0x%.8X", + psSyncInfo->psBase->sWriteOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psBase->sReadOpsCompleteDevVAddr.uiAddr, + psSyncInfo->psBase->sReadOps2CompleteDevVAddr.uiAddr); + + PVRSRVReleaseSyncInfoKM(psSyncInfo->psBase); + psSyncInfo->psBase = NULL; + + kfree(psSyncInfo); + } + + LinuxUnLockMutex(&gPVRSRVLock); + + /* Copying from one list to another (so a spinlock isn't held) used to + * work around the problem that PVRSyncReleaseSyncInfo() would hold the + * services mutex. However, we no longer do this, so this code could + * potentially be simplified. + * + * Note however that sync_fence_put must be called from process/WQ + * context because it uses fput(), which is not allowed to be called + * from interrupt context in kernels <3.6. + */ + INIT_LIST_HEAD(&sFreeList); + spin_lock_irqsave(&gFencePutListLock, flags); + list_for_each_safe(psEntry, n, &gFencePutList) + { + list_move_tail(psEntry, &sFreeList); + } + spin_unlock_irqrestore(&gFencePutListLock, flags); + + list_for_each_safe(psEntry, n, &sFreeList) + { + struct PVR_SYNC_FENCE *psSyncFence = + container_of(psEntry, struct PVR_SYNC_FENCE, sHead); + + list_del(psEntry); + + sync_fence_put(psSyncFence->psBase); + psSyncFence->psBase = NULL; + + kfree(psSyncFence); + } +} + +static const struct file_operations gsPVRSyncFOps = +{ + .owner = THIS_MODULE, + .open = PVRSyncOpen, + .release = PVRSyncRelease, + .unlocked_ioctl = PVRSyncIOCTL, +}; + +static struct miscdevice gsPVRSyncDev = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = "pvr_sync", + .fops = &gsPVRSyncFOps, +}; + +IMG_INTERNAL +int PVRSyncDeviceInit(void) +{ + int err = -1; + + if(PVRSyncInitServices() != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to initialise services", + __func__)); + goto err_out; + } + + gpsWorkQueue = create_freezable_workqueue("pvr_sync_workqueue"); + if(!gpsWorkQueue) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to create pvr_sync workqueue", + __func__)); + goto err_deinit_services; + } + + INIT_WORK(&gsWork, PVRSyncWorkQueueFunction); + + err = misc_register(&gsPVRSyncDev); + if(err) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to register pvr_sync misc " + "device (err=%d)", __func__, err)); + goto err_deinit_services; + } + + err = 0; +err_out: + return err; +err_deinit_services: + PVRSyncCloseServices(); + goto err_out; +} + +IMG_INTERNAL +void PVRSyncDeviceDeInit(void) +{ + misc_deregister(&gsPVRSyncDev); + destroy_workqueue(gpsWorkQueue); + PVRSyncCloseServices(); +} + +IMG_INTERNAL +void PVRSyncUpdateAllSyncs(void) +{ + IMG_BOOL bNeedToProcessQueues = IMG_FALSE; + struct list_head *psEntry; + + /* Check to see if any syncs have signalled. If they have, it may unblock + * the GPU. Decide what is needed and optionally schedule queue + * processing. + */ + mutex_lock(&gTimelineListLock); + list_for_each(psEntry, &gTimelineList) + { + struct PVR_SYNC_TIMELINE *psTimeline = + container_of(psEntry, struct PVR_SYNC_TIMELINE, sTimelineList); + + sync_timeline_signal((struct sync_timeline *)psTimeline); + + if(psTimeline->bSyncHasSignaled) + { + psTimeline->bSyncHasSignaled = IMG_FALSE; + bNeedToProcessQueues = IMG_TRUE; + } + } + mutex_unlock(&gTimelineListLock); + + if(bNeedToProcessQueues) + queue_work(gpsWorkQueue, &gsWork); +} + +static IMG_BOOL +PVRSyncIsDuplicate(PVRSRV_KERNEL_SYNC_INFO *psA, PVRSRV_KERNEL_SYNC_INFO *psB) +{ + return psA->sWriteOpsCompleteDevVAddr.uiAddr == + psB->sWriteOpsCompleteDevVAddr.uiAddr ? IMG_TRUE : IMG_FALSE; +} + +static void ForeignSyncPtSignaled(struct sync_fence *fence, + struct sync_fence_waiter *waiter) +{ + struct PVR_SYNC_FENCE_WAITER *psWaiter = + (struct PVR_SYNC_FENCE_WAITER *)waiter; + unsigned long flags; + + PVRSyncSWCompleteOp(psWaiter->psSyncInfo->psBase); + + DPF("R(f): WOCVA=0x%.8X ROCVA=0x%.8X RO2CVA=0x%.8X " + "WOP/C=0x%x/0x%x ROP/C=0x%x/0x%x RO2P/C=0x%x/0x%x", + psWaiter->psSyncInfo->psBase->sWriteOpsCompleteDevVAddr.uiAddr, + psWaiter->psSyncInfo->psBase->sReadOpsCompleteDevVAddr.uiAddr, + psWaiter->psSyncInfo->psBase->sReadOps2CompleteDevVAddr.uiAddr, + psWaiter->psSyncInfo->psBase->psSyncData->ui32WriteOpsPending, + psWaiter->psSyncInfo->psBase->psSyncData->ui32WriteOpsComplete, + psWaiter->psSyncInfo->psBase->psSyncData->ui32ReadOpsPending, + psWaiter->psSyncInfo->psBase->psSyncData->ui32ReadOpsComplete, + psWaiter->psSyncInfo->psBase->psSyncData->ui32ReadOps2Pending, + psWaiter->psSyncInfo->psBase->psSyncData->ui32ReadOps2Complete); + + PVRSyncReleaseSyncInfo(psWaiter->psSyncInfo); + psWaiter->psSyncInfo = NULL; + + /* We can 'put' the fence now, but this function might be called in irq + * context so we must defer to WQ. + */ + spin_lock_irqsave(&gFencePutListLock, flags); + list_add_tail(&psWaiter->psSyncFence->sHead, &gFencePutList); + psWaiter->psSyncFence = NULL; + spin_unlock_irqrestore(&gFencePutListLock, flags); + + /* The PVRSyncReleaseSyncInfo() call above already queued work */ + /*queue_work(gpsWorkQueue, &gsWork);*/ + + kfree(psWaiter); +} + +static PVRSRV_KERNEL_SYNC_INFO *ForeignSyncPointToSyncInfo(int iFenceFd) +{ + PVRSRV_KERNEL_SYNC_INFO *psKernelSyncInfo; + struct PVR_SYNC_FENCE_WAITER *psWaiter; + struct PVR_SYNC_FENCE *psSyncFence; + struct sync_fence *psFence; + PVRSRV_ERROR eError; + int err; + + /* FIXME: Could optimize this function by pre-testing sync_wait(.., 0) + * to determine if it has already signalled. We must avoid this + * for now because the sync driver was broken in earlier kernels. + */ + + /* The custom waiter structure is freed in the waiter callback */ + psWaiter = kmalloc(sizeof(struct PVR_SYNC_FENCE_WAITER), GFP_KERNEL); + if(!psWaiter) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate waiter", __func__)); + goto err_out; + } + + psWaiter->psSyncInfo = + kmalloc(sizeof(struct PVR_SYNC_KERNEL_SYNC_INFO), GFP_KERNEL); + if(!psWaiter->psSyncInfo) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate " + "PVR_SYNC_KERNEL_SYNC_INFO", __func__)); + goto err_free_waiter; + } + + /* We take another reference on the parent fence, each time we see a + * 'foreign' sync_pt. This is to ensure the timeline, fence and sync_pts + * from the foreign timeline cannot go away until the sync_pt signals. + * In practice this also means they will not go away until the entire + * fence signals. It means that we will always get a + * sync_fence_wait_async() callback for these points. + */ + psFence = sync_fence_fdget(iFenceFd); + if(!psFence) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to take reference on fence", + __func__)); + goto err_free_syncinfo; + } + + /* Allocate packet we can store this fence on (with a list head) so we + * can add it to the defer-put list without allocating memory in irq + * context. + * + * NOTE: At the moment we allocate one of these per sync_pts, but it + * might be possible to optimize this to one per fence. + */ + psSyncFence = kmalloc(sizeof(struct PVR_SYNC_FENCE), GFP_KERNEL); + if(!psSyncFence) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate " + "PVR_SYNC_FENCE", __func__)); + goto err_sync_fence_put; + } + + psSyncFence->psBase = psFence; + psWaiter->psSyncFence = psSyncFence; + + /* Allocate a "shadow" SYNCINFO for this sync_pt and set it up to be + * completed by the callback. + */ + eError = PVRSRVAllocSyncInfoKM(gsSyncServicesConnection.hDevCookie, + gsSyncServicesConnection.hDevMemContext, + &psKernelSyncInfo); + if(eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to allocate syncinfo", __func__)); + goto err_free_sync_fence; + } + + /* Make sure we take the SW operation before adding the waiter, to avoid + * racing with parallel completes. + */ + PVRSyncSWTakeOp(psKernelSyncInfo); + + sync_fence_waiter_init(&psWaiter->sWaiter, ForeignSyncPtSignaled); + psWaiter->psSyncInfo->psBase = psKernelSyncInfo; + + err = sync_fence_wait_async(psFence, &psWaiter->sWaiter); + if(err) + { + if(err < 0) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Fence was in error state", __func__)); + /* Fall-thru */ + } + + /* -1 means the fence was broken, 1 means the fence already + * signalled. In either case, roll back what we've done and + * skip using this sync_pt for synchronization. + */ + goto err_release_sync_info; + } + + DPF("A(f): WOCVA=0x%.8X ROCVA=0x%.8X RO2CVA=0x%.8X F=%p", + psKernelSyncInfo->sWriteOpsCompleteDevVAddr.uiAddr, + psKernelSyncInfo->sReadOpsCompleteDevVAddr.uiAddr, + psKernelSyncInfo->sReadOps2CompleteDevVAddr.uiAddr, + psFence); + + /* NOTE: Don't use psWaiter after this point as it may asynchronously + * signal before this function completes (and be freed already). + */ + + /* Even if the fence signals while we're hanging on to this, the sync + * can't be freed until the bridge mutex is taken in the callback. The + * bridge mutex won't be released by the caller of this function until + * the GPU operation has been scheduled, which increments ROP, + * preventing the sync from being freed when still in use by the GPU. + */ + return psKernelSyncInfo; + +err_release_sync_info: + PVRSyncSWCompleteOp(psKernelSyncInfo); + PVRSRVReleaseSyncInfoKM(psKernelSyncInfo); +err_free_sync_fence: + kfree(psSyncFence); +err_sync_fence_put: + sync_fence_put(psFence); +err_free_syncinfo: + kfree(psWaiter->psSyncInfo); +err_free_waiter: + kfree(psWaiter); +err_out: + return NULL; +} + +static void +CopyKernelSyncInfoToDeviceSyncObject(PVRSRV_KERNEL_SYNC_INFO *psSyncInfo, + PVRSRV_DEVICE_SYNC_OBJECT *psSyncObject) +{ + psSyncObject->sReadOpsCompleteDevVAddr = psSyncInfo->sReadOpsCompleteDevVAddr; + psSyncObject->sWriteOpsCompleteDevVAddr = psSyncInfo->sWriteOpsCompleteDevVAddr; + psSyncObject->sReadOps2CompleteDevVAddr = psSyncInfo->sReadOps2CompleteDevVAddr; + psSyncObject->ui32WriteOpsPendingVal = psSyncInfo->psSyncData->ui32WriteOpsPending; + psSyncObject->ui32ReadOpsPendingVal = psSyncInfo->psSyncData->ui32ReadOpsPending; + psSyncObject->ui32ReadOps2PendingVal = psSyncInfo->psSyncData->ui32ReadOps2Pending; +} + +static IMG_BOOL FenceHasForeignPoints(struct sync_fence *psFence) +{ + struct list_head *psEntry; + + list_for_each(psEntry, &psFence->pt_list_head) + { + struct sync_pt *psPt = + container_of(psEntry, struct sync_pt, pt_list); + + if(psPt->parent->ops != &gsTimelineOps) + return IMG_TRUE; + } + + return IMG_FALSE; +} + +static IMG_BOOL +AddSyncInfoToArray(PVRSRV_KERNEL_SYNC_INFO *psSyncInfo, + IMG_UINT32 ui32SyncPointLimit, + IMG_UINT32 *pui32NumRealSyncs, + PVRSRV_KERNEL_SYNC_INFO *apsSyncInfo[]) +{ + /* Ran out of syncs. Not much userspace can do about this, since it + * could have been passed multiple merged syncs and doesn't know they + * were merged. Allow this through, but print a warning and stop + * synchronizing. + */ + if(*pui32NumRealSyncs == ui32SyncPointLimit) + { + PVR_DPF((PVR_DBG_WARNING, "%s: Ran out of source syncs %d == %d", + __func__, *pui32NumRealSyncs, + ui32SyncPointLimit)); + return IMG_FALSE; + } + + apsSyncInfo[*pui32NumRealSyncs] = psSyncInfo; + (*pui32NumRealSyncs)++; + return IMG_TRUE; +} + +static IMG_BOOL +ExpandAndDeDuplicateFenceSyncs(IMG_UINT32 ui32NumSyncs, + int aiFenceFds[], + IMG_UINT32 ui32SyncPointLimit, + struct sync_fence *apsFence[], + IMG_UINT32 *pui32NumRealSyncs, + PVRSRV_KERNEL_SYNC_INFO *apsSyncInfo[]) +{ + IMG_UINT32 i, j, ui32FenceIndex = 0; + IMG_BOOL bRet = IMG_TRUE; + + *pui32NumRealSyncs = 0; + + for(i = 0; i < ui32NumSyncs; i++) + { + PVRSRV_KERNEL_SYNC_INFO *psSyncInfo; + struct list_head *psEntry; + + /* Skip any invalid fence file descriptors without error */ + if(aiFenceFds[i] < 0) + continue; + + /* By converting a file descriptor to a struct sync_fence, we are + * taking a reference on the fence. We don't want the fence to go + * away until we have submitted the command, even if it signals + * before we dispatch the command, or the timeline(s) are destroyed. + * + * This reference should be released by the caller of this function + * once hardware operations have been scheduled on the GPU sync_pts + * participating in this fence. When our MISR is scheduled, the + * defer-free list will be processed, cleaning up the SYNCINFO. + * + * Note that this reference *isn't* enough for non-GPU sync_pts. + * We'll take another reference on the fence for those operations + * later (the life-cycle requirements there are totally different). + * + * Fence lookup may fail here if the fd became invalid since it was + * patched in userspace. That's really a userspace driver bug, so + * just fail here instead of not synchronizing. + */ + apsFence[ui32FenceIndex] = sync_fence_fdget(aiFenceFds[i]); + if(!apsFence[ui32FenceIndex]) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to get fence from fd=%d", + __func__, aiFenceFds[i])); + bRet = IMG_FALSE; + goto err_out; + } + + /* If this fence has any points from foreign timelines, we need to + * allocate a 'shadow' SYNCINFO and update it in software ourselves, + * so the ukernel can test the readiness of the dependency. + * + * It's tempting to just handle all fences like this (since most of + * the time they *will* be merged with sw_sync) but such 'shadow' + * syncs are slower. This is because we need to wait for the MISR to + * schedule to update the GPU part of the fence (normally the ukernel + * would be able to make the update directly). + */ + if(FenceHasForeignPoints(apsFence[ui32FenceIndex])) + { + psSyncInfo = ForeignSyncPointToSyncInfo(aiFenceFds[i]); + if(psSyncInfo) + { + if(!AddSyncInfoToArray(psSyncInfo, ui32SyncPointLimit, + pui32NumRealSyncs, apsSyncInfo)) + { + /* Soft-fail. Stop synchronizing. */ + goto err_out; + } + } + ui32FenceIndex++; + continue; + } + + /* FIXME: The ForeignSyncPointToSyncInfo() path optimizes away already + * signalled fences. Consider optimizing this path too. + */ + list_for_each(psEntry, &apsFence[ui32FenceIndex]->pt_list_head) + { + struct sync_pt *psPt = + container_of(psEntry, struct sync_pt, pt_list); + + psSyncInfo = + ((struct PVR_SYNC *)psPt)->psSyncData->psSyncInfo->psBase; + + /* Walk the current list of points and make sure this isn't a + * duplicate. Duplicates will deadlock. + */ + for(j = 0; j < *pui32NumRealSyncs; j++) + { + /* The point is from a different timeline so we must use it */ + if(!PVRSyncIsDuplicate(apsSyncInfo[j], psSyncInfo)) + continue; + + /* There's no need to bump the real sync count as we either + * ignored the duplicate or replaced an previously counted + * entry. + */ + break; + } + + if(j == *pui32NumRealSyncs) + { + /* It's not a duplicate; moving on.. */ + if(!AddSyncInfoToArray(psSyncInfo, ui32SyncPointLimit, + pui32NumRealSyncs, apsSyncInfo)) + goto err_out; + } + } + + ui32FenceIndex++; + } + +err_out: + return bRet; +} + +IMG_INTERNAL PVRSRV_ERROR +PVRSyncPatchCCBKickSyncInfos(IMG_HANDLE ahSyncs[SGX_MAX_SRC_SYNCS_TA], + PVRSRV_DEVICE_SYNC_OBJECT asDevSyncs[SGX_MAX_SRC_SYNCS_TA], + IMG_UINT32 *pui32NumSrcSyncs) +{ + PVRSRV_KERNEL_SYNC_INFO *apsSyncInfo[SGX_MAX_SRC_SYNCS_TA]; + struct sync_fence *apsFence[SGX_MAX_SRC_SYNCS_TA] = {}; + IMG_UINT32 i, ui32NumRealSrcSyncs; + PVRSRV_ERROR eError = PVRSRV_OK; + + if(!ExpandAndDeDuplicateFenceSyncs(*pui32NumSrcSyncs, + (int *)ahSyncs, + SGX_MAX_SRC_SYNCS_TA, + apsFence, + &ui32NumRealSrcSyncs, + apsSyncInfo)) + { + eError = PVRSRV_ERROR_HANDLE_NOT_FOUND; + goto err_put_fence; + } + + /* There should only be one destination sync for a transfer. + * Ultimately this will be patched to two (the sync_pt SYNCINFO, + * and the timeline's SYNCINFO for debugging). + */ + for(i = 0; i < ui32NumRealSrcSyncs; i++) + { + PVRSRV_KERNEL_SYNC_INFO *psSyncInfo = apsSyncInfo[i]; + + /* The following code is mostly the same as the texture dependencies + * handling in SGXDoKickKM, but we have to copy it here because it + * must be run while the fence is 'locked' by sync_fence_fdget. + */ + + PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_KICK, KICK_TOKEN_SRC_SYNC, + psSyncInfo, PVRSRV_SYNCOP_SAMPLE); + + CopyKernelSyncInfoToDeviceSyncObject(psSyncInfo, &asDevSyncs[i]); + + /* Texture dependencies are read operations */ + psSyncInfo->psSyncData->ui32ReadOpsPending++; + + /* Finally, patch the sync back into the input array. + * NOTE: The syncs are protected here by the defer-free worker. + */ + ahSyncs[i] = psSyncInfo; + } + + /* Updating this allows the PDUMP handling and ROP rollbacks to work + * correctly in SGXDoKickKM. + */ + *pui32NumSrcSyncs = ui32NumRealSrcSyncs; + +err_put_fence: + for(i = 0; i < SGX_MAX_SRC_SYNCS_TA && apsFence[i]; i++) + sync_fence_put(apsFence[i]); + return eError; +} + +IMG_INTERNAL PVRSRV_ERROR +PVRSyncPatchTransferSyncInfos(IMG_HANDLE ahSyncs[SGX_MAX_SRC_SYNCS_TA], + PVRSRV_DEVICE_SYNC_OBJECT asDevSyncs[SGX_MAX_SRC_SYNCS_TA], + IMG_UINT32 *pui32NumSrcSyncs) +{ + struct PVR_ALLOC_SYNC_DATA *psTransferSyncData; + PVRSRV_KERNEL_SYNC_INFO *psSyncInfo; + PVRSRV_ERROR eError = PVRSRV_OK; + + if (*pui32NumSrcSyncs != 1) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Invalid number of syncs (%d), clamping " + "to 1", __func__, *pui32NumSrcSyncs)); + } + + psTransferSyncData = PVRSyncAllocFDGet((int)ahSyncs[0]); + + if (!psTransferSyncData) + { + PVR_DPF((PVR_DBG_ERROR, "%s: Failed to get PVR_SYNC_DATA from " + "supplied fd", __func__)); + eError = PVRSRV_ERROR_HANDLE_NOT_FOUND; + goto err_out; + } + + /* There should only be one destination sync for a transfer. + * Ultimately this will be patched to two (the sync_pt SYNCINFO, + * and the timeline's SYNCINFO for debugging). + */ + psSyncInfo = psTransferSyncData->psSyncInfo->psBase; + + /* The following code is mostly the same as the texture dependencies + * handling in SGXDoKickKM, but we have to copy it here because it + * must be run while the fence is 'locked' by sync_fence_fdget. + */ + + PVR_TTRACE_SYNC_OBJECT(PVRSRV_TRACE_GROUP_TRANSFER, TRANSFER_TOKEN_SRC_SYNC, + psSyncInfo, PVRSRV_SYNCOP_SAMPLE); + + CopyKernelSyncInfoToDeviceSyncObject(psSyncInfo, &asDevSyncs[0]); + CopyKernelSyncInfoToDeviceSyncObject(psTransferSyncData->psTimeline->psSyncInfo->psBase, + &asDevSyncs[1]); + + /* Treat fence TQs as write operations */ + psSyncInfo->psSyncData->ui32WriteOpsPending++; + psTransferSyncData->psTimeline->psSyncInfo->psBase->psSyncData->ui32WriteOpsPending++; + + /* Finally, patch the sync back into the input array. + * NOTE: The syncs are protected here by the defer-free worker. + */ + ahSyncs[0] = psSyncInfo; + ahSyncs[1] = psTransferSyncData->psTimeline->psSyncInfo->psBase; + + /* Updating this allows the PDUMP handling and ROP rollbacks to work + * correctly in SGXDoKickKM. + */ + *pui32NumSrcSyncs = 2; + + fput(psTransferSyncData->psFile); +err_out: + return eError; +} + +/* NOTE: This returns an array of sync_fences which need to be 'put' + * or they will leak. + */ + +IMG_INTERNAL PVRSRV_ERROR +PVRSyncFencesToSyncInfos(PVRSRV_KERNEL_SYNC_INFO *apsSyncs[], + IMG_UINT32 *pui32NumSyncs, + struct sync_fence *apsFence[SGX_MAX_SRC_SYNCS_TA]) +{ + PVRSRV_KERNEL_SYNC_INFO *apsSyncInfo[SGX_MAX_SRC_SYNCS_TA]; + IMG_UINT32 i, ui32NumRealSrcSyncs; + PVRSRV_ERROR eError = PVRSRV_OK; + + memset(apsFence, 0, sizeof(struct sync_fence *) * SGX_MAX_SRC_SYNCS_TA); + + if(!ExpandAndDeDuplicateFenceSyncs(*pui32NumSyncs, + (int *)apsSyncs, + *pui32NumSyncs, + apsFence, + &ui32NumRealSrcSyncs, + apsSyncInfo)) + { + for(i = 0; i < SGX_MAX_SRC_SYNCS_TA && apsFence[i]; i++) + sync_fence_put(apsFence[i]); + return PVRSRV_ERROR_HANDLE_NOT_FOUND; + } + + /* We don't expect to see merged syncs here. Abort if that happens. + * Allow through cases where the same fence was specified more than + * once -- we can handle that without reallocation of memory. + */ + PVR_ASSERT(ui32NumRealSrcSyncs <= *pui32NumSyncs); + + for(i = 0; i < ui32NumRealSrcSyncs; i++) + apsSyncs[i] = apsSyncInfo[i]; + + *pui32NumSyncs = ui32NumRealSrcSyncs; + return eError; +} diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_sync.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_sync.h new file mode 100644 index 0000000..fa05b60 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/pvr_sync.h @@ -0,0 +1,78 @@ +/*************************************************************************/ /*! +@File pvr_sync.c +@Title Kernel sync driver +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@Description Version numbers and strings for PVR Consumer services + components. +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#ifndef _PVR_SYNC_H +#define _PVR_SYNC_H + +#include <linux/seq_file.h> +#include <linux/version.h> + +#if !defined(__KERNEL__) || (LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)) +#include <linux/sync.h> +#else +#include <../drivers/staging/android/sync.h> +#endif + +#include "pvr_sync_user.h" +#include "servicesint.h" // PVRSRV_DEVICE_SYNC_OBJECT + +/* services4 internal interface */ + +int PVRSyncDeviceInit(void); +void PVRSyncDeviceDeInit(void); +void PVRSyncUpdateAllSyncs(void); +PVRSRV_ERROR +PVRSyncPatchCCBKickSyncInfos(IMG_HANDLE ahSyncs[SGX_MAX_SRC_SYNCS_TA], + PVRSRV_DEVICE_SYNC_OBJECT asDevSyncs[SGX_MAX_SRC_SYNCS_TA], + IMG_UINT32 *pui32NumSrcSyncs); +PVRSRV_ERROR +PVRSyncPatchTransferSyncInfos(IMG_HANDLE ahSyncs[SGX_MAX_SRC_SYNCS_TA], + PVRSRV_DEVICE_SYNC_OBJECT asDevSyncs[SGX_MAX_SRC_SYNCS_TA], + IMG_UINT32 *pui32NumSrcSyncs); +PVRSRV_ERROR +PVRSyncFencesToSyncInfos(PVRSRV_KERNEL_SYNC_INFO *apsSyncs[], + IMG_UINT32 *pui32NumSyncs, + struct sync_fence *apsFence[SGX_MAX_SRC_SYNCS_TA]); + +#endif /* _PVR_SYNC_H */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/systrace.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/systrace.c new file mode 100644 index 0000000..00f3e4f --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/systrace.c @@ -0,0 +1,282 @@ +/*************************************************************************/ /*! +@Title Systrace related functions +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#include "systrace.h" + +#include <trace/events/gpu.h> + +#include <linux/debugfs.h> +#include <linux/sched.h> +#include <linux/fs.h> + +#include "img_types.h" + +/*Kernel debugfs variables*/ +static unsigned int capture_hwperfdata; +static struct dentry *pvrdir_ret; + +static PVRSRV_SYSTRACE_ERROR CreateJob(PVRSRV_SYSTRACE_DATA *psSystraceData, IMG_UINT32 ui32PID, IMG_UINT32 ui32FrameNum, IMG_UINT32 ui32RTData) +{ + PVRSRV_SYSTRACE_CONTEXT *psContext = NULL; + PVRSRV_SYSTRACE_JOB *psJob = NULL; + IMG_UINT32 i = 0; + + if(psSystraceData == NULL) + return PVRSRV_SYSTRACE_NOT_INITIALISED; + + /*Look for the PID in the context CB*/ + for(i = 0; i < 8; ++i) + { + if(psSystraceData->asSystraceContext[i].ui32PID == ui32PID) + { + psContext = &(psSystraceData->asSystraceContext[i]); + break; + } + } + + /*If we find it lets check its jobs, otherwise we create it*/ + if(psContext == NULL) + { + psSystraceData->ui32Index = (psSystraceData->ui32Index+1)%8; + + psSystraceData->asSystraceContext[psSystraceData->ui32Index].ui32CtxID = psSystraceData->ui32CurrentCtxID; + ++psSystraceData->ui32CurrentCtxID; + psSystraceData->asSystraceContext[psSystraceData->ui32Index].ui32PID = ui32PID; + psSystraceData->asSystraceContext[psSystraceData->ui32Index].ui32Start = 0; + psSystraceData->asSystraceContext[psSystraceData->ui32Index].ui32End = 0; + psSystraceData->asSystraceContext[psSystraceData->ui32Index].ui32CurrentJobID = 0; + + psContext = &(psSystraceData->asSystraceContext[psSystraceData->ui32Index]); + } + + /*This is just done during the first kick so it must not be in the job list*/ + /*JobID not found, we create it*/ + psJob = &(psContext->asJobs[psContext->ui32End]); + psJob->ui32JobID = psContext->ui32CurrentJobID; + ++psContext->ui32CurrentJobID; + + psJob->ui32FrameNum = ui32FrameNum; + psJob->ui32RTData = ui32RTData; + /*Advance the CB*/ + psContext->ui32End = (psContext->ui32End + 1)%16; + if(psContext->ui32End == psContext->ui32Start) + psContext->ui32Start = (psContext->ui32Start + 1)%16; + + return PVRSRV_SYSTRACE_OK; +} + +static PVRSRV_SYSTRACE_ERROR GetCtxAndJobID(PVRSRV_SYSTRACE_DATA *psSystraceData, IMG_UINT32 ui32PID, IMG_UINT32 ui32FrameNum, IMG_UINT32 ui32RTData, + IMG_UINT32 *pui32CtxID, IMG_UINT32 *pui32JobID) +{ + PVRSRV_SYSTRACE_CONTEXT *psContext = NULL; + //PVRSRV_SYSTRACE_JOB *psJob = NULL; + IMG_UINT32 i = 0; + + if(psSystraceData == NULL) + return PVRSRV_SYSTRACE_NOT_INITIALISED; + + /*Look for the PID in the context CB*/ + for(i = 0; i < 8; ++i) + { + if(psSystraceData->asSystraceContext[i].ui32PID == ui32PID) + { + psContext = &(psSystraceData->asSystraceContext[i]); + break; + } + } + /*If we find it lets check its jobs, otherwise we create it*/ + if(psContext == NULL) + { + /*Don't create anything here*/ + return PVRSRV_SYSTRACE_JOB_NOT_FOUND; + } + /*Look for the JobID in the jobs CB otherwise create it and return ID*/ + for(i = 0; i < 16; ++i) + { + if((psContext->asJobs[i].ui32FrameNum == ui32FrameNum) && + (psContext->asJobs[i].ui32RTData == ui32RTData)) + { + *pui32CtxID = psContext->ui32CtxID; + *pui32JobID = psContext->asJobs[i].ui32JobID; + return PVRSRV_SYSTRACE_OK; + } + } + /*Not found*/ + return PVRSRV_SYSTRACE_JOB_NOT_FOUND; +} + +void SystraceCreateFS(void) +{ + struct dentry *capture_sgx_hwperfdata_ret; + + pvrdir_ret = debugfs_create_dir("pvr", NULL); + capture_sgx_hwperfdata_ret = debugfs_create_bool("gpu_tracing_on", S_IFREG | S_IRUGO | S_IWUSR, pvrdir_ret, &capture_hwperfdata); +} + +void SystraceDestroyFS(void) +{ + debugfs_remove_recursive(pvrdir_ret); +} + +IMG_BOOL SystraceIsCapturingHWData(void) +{ + return capture_hwperfdata; +} + +void SystraceTAKick(PVRSRV_SGXDEV_INFO *psDevInfo, IMG_UINT32 ui32FrameNum, IMG_UINT32 ui32RTData, IMG_BOOL bIsFirstKick) +{ + IMG_UINT32 ui32PID = OSGetCurrentProcessIDKM(); + IMG_UINT32 ui32JobID = 0; + IMG_UINT32 ui32CtxID = 0; + PVRSRV_SYSTRACE_ERROR eError = PVRSRV_SYSTRACE_OK; + + if(psDevInfo->bSystraceInitialised) + { + if(bIsFirstKick) + { + eError = CreateJob(psDevInfo->psSystraceData, ui32PID, ui32FrameNum, ui32RTData); + if(eError != PVRSRV_SYSTRACE_OK) + { + PVR_DPF((PVR_DBG_WARNING,"Systrace: Error creating a Job")); + } + } + + eError = GetCtxAndJobID(psDevInfo->psSystraceData, ui32PID, ui32FrameNum, ui32RTData, &ui32CtxID, &ui32JobID); + + if(eError != PVRSRV_SYSTRACE_OK) + { + PVR_DPF((PVR_DBG_WARNING,"Systrace: Job not found")); + } + + trace_gpu_job_enqueue(ui32CtxID, ui32JobID, "TA"); + } +} + +void SystraceHWPerfPackets(PVRSRV_SGXDEV_INFO *psDevInfo, PVRSRV_SGX_HWPERF_CB_ENTRY* psSGXHWPerf, IMG_UINT32 ui32DataCount, IMG_UINT32 ui32SgxClockspeed) +{ + IMG_UINT32 ui32PID, ui32FrameNo, ui32EvtType, ui32RTData, ui32Clocksx16Difference, ui32ClockMultiplier; + + IMG_UINT32 ui32SgxClocksx16 = 0; + IMG_UINT32 i = 0; + IMG_UINT64 ui64HostTimestamp = 0; + IMG_UINT64 ui64TimeDifference = 0; + IMG_UINT64 ui64PacketTimeStamp = 0; + + IMG_UINT32 ui32JobID = 0; + IMG_UINT32 ui32CtxID = 0; + + IMG_UINT64 ui64LastHostTimestamp = 0; + IMG_UINT32 ui32LastSGXClocksx16 = 0; + + ui64LastHostTimestamp = psDevInfo->psSystraceData->ui64LastHostTimestamp; + ui32LastSGXClocksx16 = psDevInfo->psSystraceData->ui32LastSGXClocksx16; + ui64HostTimestamp = sched_clock(); + + /*If this is the first packet read, use it as the initial reference*/ + if (ui64LastHostTimestamp == 0) + { + if (ui32DataCount > 0) + { + ui64LastHostTimestamp = ui64HostTimestamp; + ui32LastSGXClocksx16 = psSGXHWPerf[0].ui32Clocksx16; + } + } + + /* SGX clockspeed reported 307200000 HZ */ + /* Get the ui32ClockMultipliertiplier per 1us*/ + ui32ClockMultiplier = (ui32SgxClockspeed)/(1000*1000); + + for(i = 0; i < ui32DataCount; ++i) + { + ui32SgxClocksx16 = psSGXHWPerf[i].ui32Clocksx16; + ui32EvtType = psSGXHWPerf[i].ui32Type; + ui32FrameNo = psSGXHWPerf[i].ui32FrameNo; + ui32PID = psSGXHWPerf[i].ui32PID; + ui32RTData = psSGXHWPerf[i].ui32RTData; + + if ((ui32EvtType == PVRSRV_SGX_HWPERF_TYPE_TA_START) || + (ui32EvtType == PVRSRV_SGX_HWPERF_TYPE_TA_END) || + (ui32EvtType == PVRSRV_SGX_HWPERF_TYPE_3D_START) || + (ui32EvtType == PVRSRV_SGX_HWPERF_TYPE_3D_END)) + { + /*Get the JobID*/ + GetCtxAndJobID(psDevInfo->psSystraceData, ui32PID, ui32FrameNo, ui32RTData, &ui32CtxID, &ui32JobID); + + /* Calculate the time difference in ns*/ + /* Get the clock difference */ + ui32Clocksx16Difference = (ui32SgxClocksx16 - ui32LastSGXClocksx16); + /* Multipy it by 16 and 1000 to convert from us to ns */ + ui64TimeDifference = (16*ui32Clocksx16Difference*1000)/ui32ClockMultiplier; + + + /* Add the time diff to the last time-stamp, in nanoseconds*/ + ui64PacketTimeStamp = (unsigned long long) ui64LastHostTimestamp + (unsigned long long)ui64TimeDifference; + + switch(ui32EvtType) + { + case PVRSRV_SGX_HWPERF_TYPE_TA_START: + trace_gpu_sched_switch("TA", ui64PacketTimeStamp, ui32CtxID, ui32FrameNo, ui32JobID); + break; + + case PVRSRV_SGX_HWPERF_TYPE_TA_END: + trace_gpu_sched_switch("TA", ui64PacketTimeStamp, 0, ui32FrameNo, ui32JobID); + break; + + case PVRSRV_SGX_HWPERF_TYPE_3D_START: + trace_gpu_sched_switch("3D", ui64PacketTimeStamp, ui32CtxID, ui32FrameNo, ui32JobID); + break; + + case PVRSRV_SGX_HWPERF_TYPE_3D_END: + trace_gpu_sched_switch("3D", ui64PacketTimeStamp, 0, ui32FrameNo, ui32JobID); + break; + + default: + break; + } + } + } + if(ui32DataCount > 0) + { + psDevInfo->psSystraceData->ui32LastSGXClocksx16 = ui32SgxClocksx16; + } + /* Get the last set of packets timestamp and sleep 1ms */ + psDevInfo->psSystraceData->ui64LastHostTimestamp = ui64HostTimestamp; +} diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/systrace.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/systrace.h new file mode 100644 index 0000000..ad4bcc0 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/env/linux/systrace.h @@ -0,0 +1,68 @@ +/*************************************************************************/ /*! +@Title Systrace related functions +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#ifndef _SYSTRACE_ +#define _SYSTRACE_ + +#include "img_defs.h" +#include "img_types.h" + +#include "services_headers.h" +#include "sgxapi_km.h" +#include "sgxinfo.h" +#include "sgxinfokm.h" + +typedef enum +{ + PVRSRV_SYSTRACE_OK = 0x00, + PVRSRV_SYSTRACE_NOT_INITIALISED, + PVRSRV_SYSTRACE_JOB_NOT_FOUND +} PVRSRV_SYSTRACE_ERROR; + + +void SystraceHWPerfPackets(PVRSRV_SGXDEV_INFO *psDevInfo, PVRSRV_SGX_HWPERF_CB_ENTRY* psSGXHWPerf, IMG_UINT32 ui32DataCount, IMG_UINT32 ui32SgxClockspeed); +void SystraceTAKick(PVRSRV_SGXDEV_INFO *psDevInfo, IMG_UINT32 ui32FrameNum, IMG_UINT32 ui32RTData, IMG_BOOL bIsFirstKick); + +void SystraceCreateFS(void); +void SystraceDestroyFS(void); +IMG_BOOL SystraceIsCapturingHWData(void); + +#endif /* _SYSTRACE_ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxerrata.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxerrata.h index 437fbc6..52b13bb 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxerrata.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxerrata.h @@ -112,11 +112,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_CORE_REV SGX_CORE_REV_HEAD #endif - #if SGX_CORE_REV == 101 - #define FIX_HW_BRN_26620/* Workaround in services (srvkm) */ - #define FIX_HW_BRN_28011/* Workaround in services (srvkm) */ - #define FIX_HW_BRN_34028/* Workaround in services (srvkm) */ - #else #if SGX_CORE_REV == 110 #define FIX_HW_BRN_34028/* Workaround in services (srvkm) */ #else @@ -126,7 +121,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #error "sgxerrata.h: SGX531 Core Revision unspecified" #endif #endif - #endif /* signal that the Core Version has a valid definition */ #define SGX_CORE_DEFINED #endif @@ -167,19 +161,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_CORE_REV SGX_CORE_REV_HEAD #endif - #if SGX_CORE_REV == 101 - #define FIX_HW_BRN_25499/* Workaround in sgx featuredefs */ - #define FIX_HW_BRN_25503/* Workaround in code (services) */ - #define FIX_HW_BRN_26620/* Workaround in services (srvkm) */ - #define FIX_HW_BRN_28011/* Workaround in services (srvkm) */ - #define FIX_HW_BRN_34028/* Workaround in services (srvkm) */ - #else - #if SGX_CORE_REV == 110 - #define FIX_HW_BRN_25503/* Workaround in code (services) */ - #define FIX_HW_BRN_26620/* Workaround in services (srvkm) */ - #define FIX_HW_BRN_28011/* Workaround in services (srvkm) */ - #define FIX_HW_BRN_34028/* Workaround in services (srvkm) */ - #else #if SGX_CORE_REV == 120 #define FIX_HW_BRN_26620/* Workaround in services (srvkm) */ #define FIX_HW_BRN_28011/* Workaround in services (srvkm) */ @@ -200,8 +181,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif #endif #endif - #endif - #endif /* signal that the Core Version has a valid definition */ #define SGX_CORE_DEFINED #endif @@ -272,24 +251,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define FIX_HW_BRN_36513 /* workaround in uKernel and Services */ /* add BRNs here */ #else - #if SGX_CORE_REV == 2111 - #define FIX_HW_BRN_30982 /* workaround in uKernel and services */ - #define FIX_HW_BRN_31093/* workaround in services */ - #define FIX_HW_BRN_31195/* workaround in services */ - #define FIX_HW_BRN_31272/* workaround in services (srvclient) and uKernel */ - #define FIX_HW_BRN_31278/* disabled prefetching in MMU */ - #define FIX_HW_BRN_31542/* workaround in uKernel and Services */ - #define FIX_HW_BRN_31620/* workaround in services */ - #define FIX_HW_BRN_31780/* workaround in uKernel */ - #define FIX_HW_BRN_32044 /* workaround in uKernel, services and client drivers */ - #define FIX_HW_BRN_32085 /* workaround in services: prefetch fix applied, investigating PT based fix */ - #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) && defined(SGX_FEATURE_MP) - #define FIX_HW_BRN_33657/* workaround in ukernel*/ - #endif - #define FIX_HW_BRN_33920/* workaround in ukernel */ - #define FIX_HW_BRN_36513 /* workaround in uKernel and Services */ - /* add BRNs here */ - #else #if SGX_CORE_REV == 213 #define FIX_HW_BRN_31272/* workaround in services (srvclient) and uKernel */ #define FIX_HW_BRN_31671 /* workaround in uKernel */ @@ -308,17 +269,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif #define FIX_HW_BRN_36513 /* workaround in uKernel and Services */ #else - #if SGX_CORE_REV == 302 - #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) && defined(SGX_FEATURE_MP) - #define FIX_HW_BRN_33657/* workaround in ukernel*/ - #endif - #define FIX_HW_BRN_36513 /* workaround in uKernel and Services */ - #else #if SGX_CORE_REV == 303 #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) && defined(SGX_FEATURE_MP) #define FIX_HW_BRN_33657/* workaround in ukernel*/ #endif - #define FIX_HW_BRN_36513 /* workaround in uKernel and Services */ + #define FIX_HW_BRN_36513 /* workaround in uKernel and Services */ + #if defined(SGX_FEATURE_MP) + #define FIX_HW_BRN_43863 /* Workaround in ukernel */ + #endif #else #if SGX_CORE_REV == SGX_CORE_REV_HEAD #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) && defined(SGX_FEATURE_MP) @@ -334,8 +292,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif #endif #endif - #endif - #endif /* signal that the Core Version has a valid definition */ #define SGX_CORE_DEFINED #endif @@ -397,10 +353,18 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) && defined(SGX_FEATURE_MP) #define FIX_HW_BRN_33657/* workaround in ukernel */ #endif - //FIXME: This causes DMM/EMIF lockup - //#define FIX_HW_BRN_33809/* workaround in kernel (enable burst combiner) */ #define FIX_HW_BRN_36513 /* workaround in uKernel and Services */ #else + #if SGX_CORE_REV == 117 + #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) && defined(SGX_FEATURE_MP) + #define FIX_HW_BRN_33657/* workaround in ukernel */ + #endif + #define FIX_HW_BRN_33809/* workaround in kernel (enable burst combiner) */ + #define FIX_HW_BRN_36513 /* workaround in uKernel and Services */ + #else + #if SGX_CORE_REV == 118 + #define FIX_HW_BRN_33920/* workaround in ukernel */ + #else #if SGX_CORE_REV == SGX_CORE_REV_HEAD #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) && defined(SGX_FEATURE_MP) #define FIX_HW_BRN_33657/* workaround in ukernel*/ @@ -414,6 +378,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif #endif #endif + #endif + #endif /* signal that the Core Version has a valid definition */ #define SGX_CORE_DEFINED #endif @@ -426,11 +392,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_CORE_REV SGX_CORE_REV_HEAD #endif - #if SGX_CORE_REV == 109 - #define FIX_HW_BRN_29702/* Workaround in services */ - #define FIX_HW_BRN_29823/* Workaround in services */ - #define FIX_HW_BRN_31939/* workaround in uKernel */ - #else #if SGX_CORE_REV == 10131 #else #if SGX_CORE_REV == 1014 @@ -445,7 +406,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif #endif #endif - #endif /* signal that the Core Version has a valid definition */ #define SGX_CORE_DEFINED #endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxfeaturedefs.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxfeaturedefs.h index 3e3a116..9efce89 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxfeaturedefs.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxfeaturedefs.h @@ -44,6 +44,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_FEATURE_ADDRESS_SPACE_SIZE (28) #define SGX_FEATURE_NUM_USE_PIPES (1) #define SGX_FEATURE_AUTOCLOCKGATING + #define SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE (1) #else #if defined(SGX530) #define SGX_CORE_FRIENDLY_NAME "SGX530" @@ -51,6 +52,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_FEATURE_ADDRESS_SPACE_SIZE (28) #define SGX_FEATURE_NUM_USE_PIPES (2) #define SGX_FEATURE_AUTOCLOCKGATING + #define SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE (1) #else #if defined(SGX531) #define SGX_CORE_FRIENDLY_NAME "SGX531" @@ -59,6 +61,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_FEATURE_NUM_USE_PIPES (2) #define SGX_FEATURE_AUTOCLOCKGATING #define SGX_FEATURE_MULTI_EVENT_KICK + #define SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE (1) #else #if defined(SGX535) #define SGX_CORE_FRIENDLY_NAME "SGX535" @@ -71,6 +74,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_FEATURE_AUTOCLOCKGATING #define SUPPORT_SGX_GENERAL_MAPPING_HEAP #define SGX_FEATURE_EDM_VERTEX_PDSADDR_FULL_RANGE + #define SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE (1) #else #if defined(SGX540) #define SGX_CORE_FRIENDLY_NAME "SGX540" @@ -79,6 +83,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_FEATURE_NUM_USE_PIPES (4) #define SGX_FEATURE_AUTOCLOCKGATING #define SGX_FEATURE_MULTI_EVENT_KICK + #define SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE (1) #else #if defined(SGX543) #define SGX_CORE_FRIENDLY_NAME "SGX543" @@ -104,8 +109,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_FEATURE_MASTER_VDM_CONTEXT_SWITCH #endif #define SGX_FEATURE_SLAVE_VDM_CONTEXT_SWITCH - #define SGX_FEATURE_SW_ISP_CONTEXT_SWITCH #endif + #define SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE (4) #else #if defined(SGX544) #define SGX_CORE_FRIENDLY_NAME "SGX544" @@ -122,8 +127,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #define SGX_FEATURE_DATA_BREAKPOINTS // #define SGX_FEATURE_PERPIPE_BKPT_REGS // #define SGX_FEATURE_PERPIPE_BKPT_REGS_NUMPIPES (2) -// #define SGX_FEATURE_2D_HARDWARE -// #define SGX_FEATURE_PTLA + #if defined(SGX_FEATURE_MP) + #define SGX_FEATURE_2D_HARDWARE + #define SGX_FEATURE_PTLA + #endif #define SGX_FEATURE_EXTENDED_PERF_COUNTERS #define SGX_FEATURE_EDM_VERTEX_PDSADDR_FULL_RANGE #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) @@ -131,8 +138,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_FEATURE_MASTER_VDM_CONTEXT_SWITCH #define SGX_FEATURE_SLAVE_VDM_CONTEXT_SWITCH #endif - #define SGX_FEATURE_SW_ISP_CONTEXT_SWITCH #endif + #define SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE (4) #else #if defined(SGX545) #define SGX_CORE_FRIENDLY_NAME "SGX545" @@ -160,9 +167,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_FEATURE_BIF_WIDE_TILING_AND_4K_ADDRESS #define SGX_FEATURE_MULTI_EVENT_KICK #define SGX_FEATURE_EDM_VERTEX_PDSADDR_FULL_RANGE - #if defined(SUPPORT_SGX_LOW_LATENCY_SCHEDULING) - #define SGX_FEATURE_SW_ISP_CONTEXT_SWITCH - #endif + #define SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE (4) #else #if defined(SGX554) #define SGX_CORE_FRIENDLY_NAME "SGX554" @@ -188,8 +193,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SGX_FEATURE_MASTER_VDM_CONTEXT_SWITCH #endif #define SGX_FEATURE_SLAVE_VDM_CONTEXT_SWITCH - #define SGX_FEATURE_SW_ISP_CONTEXT_SWITCH #endif + #define SGX_FEATURE_PT_CACHE_ENTRIES_PER_LINE (4) #endif #endif #endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxmpdefs.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxmpdefs.h index 4b9649f..a4cd81e 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxmpdefs.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/hwdefs/sgxmpdefs.h @@ -65,6 +65,28 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define EUR_CR_MASTER_BIF_CTRL_MMU_BYPASS_MASTER_DPM_MASK 0x00080000U #define EUR_CR_MASTER_BIF_CTRL_MMU_BYPASS_MASTER_DPM_SHIFT 19 #define EUR_CR_MASTER_BIF_CTRL_MMU_BYPASS_MASTER_DPM_SIGNED 0 +/* Register EUR_CR_MASTER_BIF_INT_STAT */ +#define EUR_CR_MASTER_BIF_INT_STAT 0x4C04 +#define EUR_CR_MASTER_BIF_INT_STAT_FAULT_REQ_MASK 0x00003FFFU +#define EUR_CR_MASTER_BIF_INT_STAT_FAULT_REQ_SHIFT 0 +#define EUR_CR_MASTER_BIF_INT_STAT_FAULT_REQ_SIGNED 0 +#define EUR_CR_MASTER_BIF_INT_STAT_FAULT_TYPE_MASK 0x00070000U +#define EUR_CR_MASTER_BIF_INT_STAT_FAULT_TYPE_SHIFT 16 +#define EUR_CR_MASTER_BIF_INT_STAT_FAULT_TYPE_SIGNED 0 +#define EUR_CR_MASTER_BIF_INT_STAT_FLUSH_COMPLETE_MASK 0x00080000U +#define EUR_CR_MASTER_BIF_INT_STAT_FLUSH_COMPLETE_SHIFT 19 +#define EUR_CR_MASTER_BIF_INT_STAT_FLUSH_COMPLETE_SIGNED 0 +/* Register EUR_CR_MASTER_BIF_FAULT */ +#define EUR_CR_MASTER_BIF_FAULT 0x4C08 +#define EUR_CR_MASTER_BIF_FAULT_CID_MASK 0x0000000FU +#define EUR_CR_MASTER_BIF_FAULT_CID_SHIFT 0 +#define EUR_CR_MASTER_BIF_FAULT_CID_SIGNED 0 +#define EUR_CR_MASTER_BIF_FAULT_SB_MASK 0x000001F0U +#define EUR_CR_MASTER_BIF_FAULT_SB_SHIFT 4 +#define EUR_CR_MASTER_BIF_FAULT_SB_SIGNED 0 +#define EUR_CR_MASTER_BIF_FAULT_ADDR_MASK 0xFFFFF000U +#define EUR_CR_MASTER_BIF_FAULT_ADDR_SHIFT 12 +#define EUR_CR_MASTER_BIF_FAULT_ADDR_SIGNED 0 /* Register EUR_CR_MASTER_BIF_CTRL_INVAL */ #define EUR_CR_MASTER_BIF_CTRL_INVAL 0x4C34 #define EUR_CR_MASTER_BIF_CTRL_INVAL_PTE_MASK 0x00000004U diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/buffer_manager.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/buffer_manager.h index c16efaa..49d023e 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/buffer_manager.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/buffer_manager.h @@ -91,17 +91,6 @@ struct _BM_MAPPING_ IMG_UINT32 ui32NumVirtChunks; IMG_UINT32 ui32NumPhysChunks; IMG_BOOL *pabMapChunk; - - /* GPU mapping reference count - * When goes down to 0 GPU mapping - * gets removed */ - IMG_UINT32 ui32MappingCount; - - /* need to track the original required alignment to make sure - * that an unmapped buffer which is later remapped to device - * is remapped with the original alignment restrictions. - */ - IMG_UINT32 ui32DevVAddrAlignment; }; /* @@ -346,8 +335,8 @@ BM_Alloc (IMG_HANDLE hDevMemHeap, */ IMG_BOOL BM_Wrap ( IMG_HANDLE hDevMemHeap, - IMG_SIZE_T ui32Size, - IMG_SIZE_T ui32Offset, + IMG_SIZE_T uSize, + IMG_SIZE_T uOffset, IMG_BOOL bPhysContig, IMG_SYS_PHYADDR *psSysAddr, IMG_VOID *pvCPUVAddr, @@ -423,32 +412,6 @@ IMG_HANDLE BM_HandleToOSMemHandle (BM_HANDLE hBuf); /** - * @Function BM_RemapToDev - * - * @Description - * - * Remaps the device Virtual Mapping. - * - * @Input hBuf - buffer handle. - * @Return ref count on success - */ -IMG_INT32 -BM_RemapToDev(BM_HANDLE hBuf); - -/** - * @Function BM_UnmapFromDev - * - * @Description - * - * Removes the device Virtual Mapping. - * - * @Input hBuf - buffer handle. - * @Return Ref count on success - */ -IMG_INT32 -BM_UnmapFromDev(BM_HANDLE hBuf); - -/** * @Function BM_GetPhysPageAddr * * @Description @@ -631,7 +594,6 @@ IMG_BOOL BM_VirtOffsetToPhysical(IMG_HANDLE hBMHandle, PVRSRV_ERROR BM_XProcWorkaroundSetShareIndex(IMG_UINT32 ui32Index); PVRSRV_ERROR BM_XProcWorkaroundUnsetShareIndex(IMG_UINT32 ui32Index); PVRSRV_ERROR BM_XProcWorkaroundFindNewBufferAndSetShareIndex(IMG_UINT32 *pui32Index); -IMG_INT32 BM_XProcGetShareDataRefCount(IMG_UINT32 ui32Index); #if defined(PVRSRV_REFCOUNT_DEBUG) IMG_VOID _BM_XProcIndexAcquireDebug(const IMG_CHAR *pszFile, IMG_INT iLine, IMG_UINT32 ui32Index); @@ -646,26 +608,13 @@ IMG_VOID _BM_XProcIndexReleaseDebug(const IMG_CHAR *pszFile, IMG_INT iLine, IMG_ IMG_VOID _BM_XProcIndexAcquire(IMG_UINT32 ui32Index); IMG_VOID _BM_XProcIndexRelease(IMG_UINT32 ui32Index); + #define BM_XProcIndexAcquire(x) \ _BM_XProcIndexAcquire( x) #define BM_XProcIndexRelease(x) \ _BM_XProcIndexRelease( x) #endif -static INLINE IMG_CHAR * -_BMMappingType (IMG_INT eCpuMemoryOrigin) -{ - switch (eCpuMemoryOrigin) - { - case hm_wrapped: return "hm_wrapped"; - case hm_wrapped_scatter: return "hm_wrapped_scatter"; - case hm_wrapped_virtaddr: return "hm_wrapped_virtaddr"; - case hm_wrapped_scatter_virtaddr: return "hm_wrapped_scatter_virtaddr"; - case hm_env: return "hm_env"; - case hm_contiguous: return "hm_contiguous"; - } - return "junk"; -} #if defined(__cplusplus) } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/devicemem.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/devicemem.h new file mode 100644 index 0000000..00f8fe1 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/devicemem.h @@ -0,0 +1,52 @@ +/*************************************************************************/ /*! +@Title KM internal device memory functions +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#include "img_defs.h" +#include "img_types.h" +#include "servicesext.h" + +#ifndef __DEVICEMEM_H__ +#define __DEVICEMEM_H__ + +PVRSRV_ERROR IMG_CALLCONV PVRSRVInitDeviceMem(IMG_VOID); +IMG_VOID IMG_CALLCONV PVRSRVDeInitDeviceMem(IMG_VOID); + +#endif /* __DEVICEMEM_H__ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/handle.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/handle.h index 157d209..f636073 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/handle.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/handle.h @@ -230,30 +230,11 @@ typedef enum struct _PVRSRV_HANDLE_BASE_; typedef struct _PVRSRV_HANDLE_BASE_ PVRSRV_HANDLE_BASE; -#if defined (PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE) +#if defined(PVR_SECURE_HANDLES) extern PVRSRV_HANDLE_BASE *gpsKernelHandleBase; #define KERNEL_HANDLE_BASE (gpsKernelHandleBase) -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR PVRSRVAllocHandle(PVRSRV_HANDLE_BASE *psBase, IMG_SID *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, PVRSRV_HANDLE_ALLOC_FLAG eFlag); - -PVRSRV_ERROR PVRSRVAllocSubHandle(PVRSRV_HANDLE_BASE *psBase, IMG_SID *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, PVRSRV_HANDLE_ALLOC_FLAG eFlag, IMG_SID hParent); - -PVRSRV_ERROR PVRSRVFindHandle(PVRSRV_HANDLE_BASE *psBase, IMG_SID *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType); - -PVRSRV_ERROR PVRSRVLookupHandleAnyType(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, PVRSRV_HANDLE_TYPE *peType, IMG_SID hHandle); - -PVRSRV_ERROR PVRSRVLookupHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, IMG_SID hHandle, PVRSRV_HANDLE_TYPE eType); - -PVRSRV_ERROR PVRSRVLookupSubHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, IMG_SID hHandle, PVRSRV_HANDLE_TYPE eType, IMG_SID hAncestor); - -PVRSRV_ERROR PVRSRVGetParentHandle(PVRSRV_HANDLE_BASE *psBase, IMG_SID *phParent, IMG_SID hHandle, PVRSRV_HANDLE_TYPE eType); - -PVRSRV_ERROR PVRSRVLookupAndReleaseHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, IMG_SID hHandle, PVRSRV_HANDLE_TYPE eType); - -PVRSRV_ERROR PVRSRVReleaseHandle(PVRSRV_HANDLE_BASE *psBase, IMG_SID hHandle, PVRSRV_HANDLE_TYPE eType); -#else PVRSRV_ERROR PVRSRVAllocHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, PVRSRV_HANDLE_ALLOC_FLAG eFlag); PVRSRV_ERROR PVRSRVAllocSubHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE *phHandle, IMG_VOID *pvData, PVRSRV_HANDLE_TYPE eType, PVRSRV_HANDLE_ALLOC_FLAG eFlag, IMG_HANDLE hParent); @@ -271,7 +252,6 @@ PVRSRV_ERROR PVRSRVGetParentHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *phPare PVRSRV_ERROR PVRSRVLookupAndReleaseHandle(PVRSRV_HANDLE_BASE *psBase, IMG_PVOID *ppvData, IMG_HANDLE hHandle, PVRSRV_HANDLE_TYPE eType); PVRSRV_ERROR PVRSRVReleaseHandle(PVRSRV_HANDLE_BASE *psBase, IMG_HANDLE hHandle, PVRSRV_HANDLE_TYPE eType); -#endif /* #if defined (SUPPORT_SID_INTERFACE) */ PVRSRV_ERROR PVRSRVNewHandleBatch(PVRSRV_HANDLE_BASE *psBase, IMG_UINT32 ui32BatchSize); @@ -295,7 +275,7 @@ PVRSRV_ERROR PVRSRVHandleInit(IMG_VOID); PVRSRV_ERROR PVRSRVHandleDeInit(IMG_VOID); -#else /* #if defined (PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE)*/ +#else /* #if defined (PVR_SECURE_HANDLES) */ #define KERNEL_HANDLE_BASE IMG_NULL @@ -543,7 +523,7 @@ PVRSRV_ERROR PVRSRVHandleDeInit(IMG_VOID) return PVRSRV_OK; } -#endif /* #if defined (PVR_SECURE_HANDLES) || defined (SUPPORT_SID_INTERFACE)*/ +#endif /* #if defined (PVR_SECURE_HANDLES) */ /* * Versions of PVRSRVAllocHandle and PVRSRVAllocSubHandle with no return diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ion_sync.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ion_sync.h new file mode 100644 index 0000000..8600a19 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ion_sync.h @@ -0,0 +1,73 @@ +/*************************************************************************/ /*! +@Title Services Ion synchronisation integration +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#include "img_defs.h" +#include "img_types.h" +#include "servicesint.h" + +#ifndef __ION_SYNC_H__ +#define __ION_SYNC_H__ + +typedef struct _PVRSRV_ION_SYNC_INFO_ { + PVRSRV_KERNEL_SYNC_INFO *psSyncInfo; + IMG_HANDLE hUnique; + IMG_UINT32 ui32RefCount; + IMG_UINT64 ui64Stamp; +} PVRSRV_ION_SYNC_INFO; + +PVRSRV_ERROR PVRSRVIonBufferSyncAcquire(IMG_HANDLE hUnique, + IMG_HANDLE hDevCookie, + IMG_HANDLE hDevMemContext, + PVRSRV_ION_SYNC_INFO **ppsIonSyncInfo); + +IMG_VOID PVRSRVIonBufferSyncRelease(PVRSRV_ION_SYNC_INFO *psIonSyncInfo); + +static INLINE PVRSRV_KERNEL_SYNC_INFO *IonBufferSyncGetKernelSyncInfo(PVRSRV_ION_SYNC_INFO *psIonSyncInfo) +{ + return psIonSyncInfo->psSyncInfo; +} + +static INLINE IMG_UINT64 IonBufferSyncGetStamp(PVRSRV_ION_SYNC_INFO *psIonSyncInfo) +{ + return psIonSyncInfo->ui64Stamp; +} + +#endif /* __ION_SYNC_H__ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/lists.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/lists.h index 81205de..31f5409 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/lists.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/lists.h @@ -332,6 +332,10 @@ DECLARE_LIST_ANY_VA_2(PVRSRV_POWER_DEV, PVRSRV_ERROR, PVRSRV_OK); DECLARE_LIST_INSERT(PVRSRV_POWER_DEV); DECLARE_LIST_REMOVE(PVRSRV_POWER_DEV); +DECLARE_LIST_ANY_2(PVRSRV_KERNEL_SYNC_INFO, PVRSRV_ERROR, PVRSRV_OK); +DECLARE_LIST_INSERT(PVRSRV_KERNEL_SYNC_INFO); +DECLARE_LIST_REMOVE(PVRSRV_KERNEL_SYNC_INFO); + #undef DECLARE_LIST_ANY_2 #undef DECLARE_LIST_ANY_VA #undef DECLARE_LIST_ANY_VA_2 diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/osfunc.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/osfunc.h index dcaa58a..9bb772c 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/osfunc.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/osfunc.h @@ -54,7 +54,6 @@ extern "C" { #if defined(__linux__) && defined(__KERNEL__) #include <linux/hardirq.h> #include <linux/string.h> -#include <asm/system.h> #if defined(__arm__) #include <asm/memory.h> #endif @@ -87,7 +86,7 @@ extern "C" { IMG_UINT32 OSClockus(IMG_VOID); -IMG_SIZE_T OSGetPageSize(IMG_VOID); +IMG_UINT32 OSGetPageSize(IMG_VOID); PVRSRV_ERROR OSInstallDeviceLISR(IMG_VOID *pvSysData, IMG_UINT32 ui32Irq, IMG_CHAR *pszISRName, @@ -98,12 +97,12 @@ PVRSRV_ERROR OSUninstallSystemLISR(IMG_VOID *pvSysData); PVRSRV_ERROR OSInstallMISR(IMG_VOID *pvSysData); PVRSRV_ERROR OSUninstallMISR(IMG_VOID *pvSysData); IMG_CPU_PHYADDR OSMapLinToCPUPhys(IMG_HANDLE, IMG_VOID* pvLinAddr); -IMG_VOID OSMemCopy(IMG_VOID *pvDst, IMG_VOID *pvSrc, IMG_SIZE_T ui32Size); -IMG_VOID *OSMapPhysToLin(IMG_CPU_PHYADDR BasePAddr, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui32Flags, IMG_HANDLE *phOSMemHandle); -IMG_BOOL OSUnMapPhysToLin(IMG_VOID *pvLinAddr, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle); +IMG_VOID OSMemCopy(IMG_VOID *pvDst, IMG_VOID *pvSrc, IMG_SIZE_T uiSize); +IMG_VOID *OSMapPhysToLin(IMG_CPU_PHYADDR BasePAddr, IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE *phOSMemHandle); +IMG_BOOL OSUnMapPhysToLin(IMG_VOID *pvLinAddr, IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle); -PVRSRV_ERROR OSReservePhys(IMG_CPU_PHYADDR BasePAddr, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui32Flags, IMG_HANDLE hBMHandle, IMG_VOID **ppvCpuVAddr, IMG_HANDLE *phOSMemHandle); -PVRSRV_ERROR OSUnReservePhys(IMG_VOID *pvCpuVAddr, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle); +PVRSRV_ERROR OSReservePhys(IMG_CPU_PHYADDR BasePAddr, IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE hBMHandle, IMG_VOID **ppvCpuVAddr, IMG_HANDLE *phOSMemHandle); +PVRSRV_ERROR OSUnReservePhys(IMG_VOID *pvCpuVAddr, IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle); /* Some terminology: * @@ -193,11 +192,11 @@ static INLINE IMG_BOOL OSInvalidateCPUCacheRangeKM(IMG_HANDLE hOSMemHandle, #if defined(__linux__) || defined(__QNXNTO__) PVRSRV_ERROR OSRegisterDiscontigMem(IMG_SYS_PHYADDR *pBasePAddr, IMG_VOID *pvCpuVAddr, - IMG_SIZE_T ui32Bytes, + IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE *phOSMemHandle); PVRSRV_ERROR OSUnRegisterDiscontigMem(IMG_VOID *pvCpuVAddr, - IMG_SIZE_T ui32Bytes, + IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle); #else /* defined(__linux__) */ @@ -206,7 +205,7 @@ PVRSRV_ERROR OSUnRegisterDiscontigMem(IMG_VOID *pvCpuVAddr, #endif static INLINE PVRSRV_ERROR OSRegisterDiscontigMem(IMG_SYS_PHYADDR *pBasePAddr, IMG_VOID *pvCpuVAddr, - IMG_SIZE_T ui32Bytes, + IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE *phOSMemHandle) { @@ -223,7 +222,7 @@ static INLINE PVRSRV_ERROR OSRegisterDiscontigMem(IMG_SYS_PHYADDR *pBasePAddr, #pragma inline(OSUnRegisterDiscontigMem) #endif static INLINE PVRSRV_ERROR OSUnRegisterDiscontigMem(IMG_VOID *pvCpuVAddr, - IMG_SIZE_T ui32Bytes, + IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle) { @@ -241,11 +240,11 @@ static INLINE PVRSRV_ERROR OSUnRegisterDiscontigMem(IMG_VOID *pvCpuVAddr, #ifdef INLINE_IS_PRAGMA #pragma inline(OSReserveDiscontigPhys) #endif -static INLINE PVRSRV_ERROR OSReserveDiscontigPhys(IMG_SYS_PHYADDR *pBasePAddr, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui32Flags, IMG_VOID **ppvCpuVAddr, IMG_HANDLE *phOSMemHandle) +static INLINE PVRSRV_ERROR OSReserveDiscontigPhys(IMG_SYS_PHYADDR *pBasePAddr, IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_VOID **ppvCpuVAddr, IMG_HANDLE *phOSMemHandle) { #if defined(__linux__) || defined(__QNXNTO__) *ppvCpuVAddr = IMG_NULL; - return OSRegisterDiscontigMem(pBasePAddr, *ppvCpuVAddr, ui32Bytes, ui32Flags, phOSMemHandle); + return OSRegisterDiscontigMem(pBasePAddr, *ppvCpuVAddr, uBytes, ui32Flags, phOSMemHandle); #else extern IMG_CPU_PHYADDR SysSysPAddrToCpuPAddr(IMG_SYS_PHYADDR SysPAddr); @@ -258,14 +257,14 @@ static INLINE PVRSRV_ERROR OSReserveDiscontigPhys(IMG_SYS_PHYADDR *pBasePAddr, I * 4. We don't need to unmap */ - return OSReservePhys(SysSysPAddrToCpuPAddr(pBasePAddr[0]), ui32Bytes, ui32Flags, IMG_NULL, ppvCpuVAddr, phOSMemHandle); + return OSReservePhys(SysSysPAddrToCpuPAddr(pBasePAddr[0]), uBytes, ui32Flags, IMG_NULL, ppvCpuVAddr, phOSMemHandle); #endif } -static INLINE PVRSRV_ERROR OSUnReserveDiscontigPhys(IMG_VOID *pvCpuVAddr, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle) +static INLINE PVRSRV_ERROR OSUnReserveDiscontigPhys(IMG_VOID *pvCpuVAddr, IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle) { #if defined(__linux__) || defined(__QNXNTO__) - OSUnRegisterDiscontigMem(pvCpuVAddr, ui32Bytes, ui32Flags, hOSMemHandle); + OSUnRegisterDiscontigMem(pvCpuVAddr, uBytes, ui32Flags, hOSMemHandle); #endif /* We don't need to unmap */ return PVRSRV_OK; @@ -276,10 +275,10 @@ static INLINE PVRSRV_ERROR OSUnReserveDiscontigPhys(IMG_VOID *pvCpuVAddr, IMG_SI #ifdef INLINE_IS_PRAGMA #pragma inline(OSReserveDiscontigPhys) #endif -static INLINE PVRSRV_ERROR OSReserveDiscontigPhys(IMG_SYS_PHYADDR *pBasePAddr, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui32Flags, IMG_VOID **ppvCpuVAddr, IMG_HANDLE *phOSMemHandle) +static INLINE PVRSRV_ERROR OSReserveDiscontigPhys(IMG_SYS_PHYADDR *pBasePAddr, IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_VOID **ppvCpuVAddr, IMG_HANDLE *phOSMemHandle) { PVR_UNREFERENCED_PARAMETER(pBasePAddr); - PVR_UNREFERENCED_PARAMETER(ui32Bytes); + PVR_UNREFERENCED_PARAMETER(uBytes); PVR_UNREFERENCED_PARAMETER(ui32Flags); PVR_UNREFERENCED_PARAMETER(ppvCpuVAddr); PVR_UNREFERENCED_PARAMETER(phOSMemHandle); @@ -290,10 +289,10 @@ static INLINE PVRSRV_ERROR OSReserveDiscontigPhys(IMG_SYS_PHYADDR *pBasePAddr, I #ifdef INLINE_IS_PRAGMA #pragma inline(OSUnReserveDiscontigPhys) #endif -static INLINE PVRSRV_ERROR OSUnReserveDiscontigPhys(IMG_VOID *pvCpuVAddr, IMG_SIZE_T ui32Bytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle) +static INLINE PVRSRV_ERROR OSUnReserveDiscontigPhys(IMG_VOID *pvCpuVAddr, IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle) { PVR_UNREFERENCED_PARAMETER(pvCpuVAddr); - PVR_UNREFERENCED_PARAMETER(ui32Bytes); + PVR_UNREFERENCED_PARAMETER(uBytes); PVR_UNREFERENCED_PARAMETER(ui32Flags); PVR_UNREFERENCED_PARAMETER(hOSMemHandle); @@ -303,11 +302,11 @@ static INLINE PVRSRV_ERROR OSUnReserveDiscontigPhys(IMG_VOID *pvCpuVAddr, IMG_SI PVRSRV_ERROR OSRegisterMem(IMG_CPU_PHYADDR BasePAddr, IMG_VOID *pvCpuVAddr, - IMG_SIZE_T ui32Bytes, + IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE *phOSMemHandle); PVRSRV_ERROR OSUnRegisterMem(IMG_VOID *pvCpuVAddr, - IMG_SIZE_T ui32Bytes, + IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE hOSMemHandle); @@ -315,8 +314,8 @@ PVRSRV_ERROR OSUnRegisterMem(IMG_VOID *pvCpuVAddr, #if defined(__linux__) || defined(__QNXNTO__) PVRSRV_ERROR OSGetSubMemHandle(IMG_HANDLE hOSMemHandle, - IMG_UINTPTR_T ui32ByteOffset, - IMG_SIZE_T ui32Bytes, + IMG_UINTPTR_T uByteOffset, + IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE *phOSMemHandleRet); PVRSRV_ERROR OSReleaseSubMemHandle(IMG_HANDLE hOSMemHandle, IMG_UINT32 ui32Flags); @@ -325,13 +324,13 @@ PVRSRV_ERROR OSReleaseSubMemHandle(IMG_HANDLE hOSMemHandle, IMG_UINT32 ui32Flags #pragma inline(OSGetSubMemHandle) #endif static INLINE PVRSRV_ERROR OSGetSubMemHandle(IMG_HANDLE hOSMemHandle, - IMG_UINTPTR_T ui32ByteOffset, - IMG_SIZE_T ui32Bytes, + IMG_UINTPTR_T uByteOffset, + IMG_SIZE_T uBytes, IMG_UINT32 ui32Flags, IMG_HANDLE *phOSMemHandleRet) { - PVR_UNREFERENCED_PARAMETER(ui32ByteOffset); - PVR_UNREFERENCED_PARAMETER(ui32Bytes); + PVR_UNREFERENCED_PARAMETER(uByteOffset); + PVR_UNREFERENCED_PARAMETER(uBytes); PVR_UNREFERENCED_PARAMETER(ui32Flags); *phOSMemHandleRet = hOSMemHandle; @@ -347,18 +346,15 @@ static INLINE PVRSRV_ERROR OSReleaseSubMemHandle(IMG_HANDLE hOSMemHandle, IMG_UI #endif IMG_UINT32 OSGetCurrentProcessIDKM(IMG_VOID); -int OSGetProcCmdline(IMG_UINT32 ui32PID, char * buffer, int buff_size); -const char* OSGetPathBaseName(char * buffer, int buff_size); +#if defined (MEM_TRACK_INFO_DEBUG) +IMG_UINT32 OSGetCurrentTimeInUSecsKM(IMG_VOID); +#endif IMG_UINTPTR_T OSGetCurrentThreadID( IMG_VOID ); -IMG_VOID OSMemSet(IMG_VOID *pvDest, IMG_UINT8 ui8Value, IMG_SIZE_T ui32Size); +IMG_VOID OSMemSet(IMG_VOID *pvDest, IMG_UINT8 ui8Value, IMG_SIZE_T uSize); -PVRSRV_ERROR OSAllocPages_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T ui32Size, IMG_UINT32 ui32PageSize, +PVRSRV_ERROR OSAllocPages_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T uSize, IMG_UINT32 ui32PageSize, IMG_PVOID pvPrivData, IMG_UINT32 ui32PrivDataLength, IMG_HANDLE hBMHandle, IMG_PVOID *ppvLinAddr, IMG_HANDLE *phPageAlloc); -PVRSRV_ERROR OSFreePages(IMG_UINT32 ui32Flags, IMG_SIZE_T ui32Size, IMG_PVOID pvLinAddr, IMG_HANDLE hPageAlloc); - -IMG_INT32 -OSGetMemMultiPlaneInfo(IMG_HANDLE hOSMemHandle, IMG_UINT32* pui32AddressOffsets, - IMG_UINT32* ui32NumAddrOffsets); +PVRSRV_ERROR OSFreePages(IMG_UINT32 ui32Flags, IMG_SIZE_T uSize, IMG_PVOID pvLinAddr, IMG_HANDLE hPageAlloc); /*--------------------- @@ -440,14 +436,14 @@ else alias to level 1 wrapper, else the wrapper function will be used*/ /*If level 1 wrapper is enabled declare the functions with extra parameters else alias to level 0 and declare the functions without the extra debugging parameters*/ #if (defined(__linux__) || defined(__QNXNTO__)) && defined(DEBUG_LINUX_MEMORY_ALLOCATIONS) - PVRSRV_ERROR OSAllocMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T ui32Size, IMG_PVOID *ppvLinAddr, IMG_HANDLE *phBlockAlloc, IMG_CHAR *pszFilename, IMG_UINT32 ui32Line); - PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T ui32Size, IMG_PVOID pvLinAddr, IMG_HANDLE hBlockAlloc, IMG_CHAR *pszFilename, IMG_UINT32 ui32Line); + PVRSRV_ERROR OSAllocMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T uSize, IMG_PVOID *ppvLinAddr, IMG_HANDLE *phBlockAlloc, IMG_CHAR *pszFilename, IMG_UINT32 ui32Line); + PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T uSize, IMG_PVOID pvLinAddr, IMG_HANDLE hBlockAlloc, IMG_CHAR *pszFilename, IMG_UINT32 ui32Line); #define OSAllocMem_Debug_Linux_Memory_Allocations OSAllocMem_Impl #define OSFreeMem_Debug_Linux_Memory_Allocations OSFreeMem_Impl #else - PVRSRV_ERROR OSAllocMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T ui32Size, IMG_PVOID *ppvLinAddr, IMG_HANDLE *phBlockAlloc); - PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T ui32Size, IMG_PVOID pvLinAddr, IMG_HANDLE hBlockAlloc); + PVRSRV_ERROR OSAllocMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T uSize, IMG_PVOID *ppvLinAddr, IMG_HANDLE *phBlockAlloc); + PVRSRV_ERROR OSFreeMem_Impl(IMG_UINT32 ui32Flags, IMG_SIZE_T uSize, IMG_PVOID pvLinAddr, IMG_HANDLE hBlockAlloc); #define OSAllocMem_Debug_Linux_Memory_Allocations(flags, size, addr, blockAlloc, file, line) \ OSAllocMem_Impl(flags, size, addr, blockAlloc) @@ -457,16 +453,16 @@ else alias to level 0 and declare the functions without the extra debugging para #if defined(__linux__) || defined(__QNXNTO__) -IMG_CPU_PHYADDR OSMemHandleToCpuPAddr(IMG_VOID *hOSMemHandle, IMG_SIZE_T ui32ByteOffset); +IMG_CPU_PHYADDR OSMemHandleToCpuPAddr(IMG_VOID *hOSMemHandle, IMG_UINTPTR_T uiByteOffset); #else #ifdef INLINE_IS_PRAGMA #pragma inline(OSMemHandleToCpuPAddr) #endif -static INLINE IMG_CPU_PHYADDR OSMemHandleToCpuPAddr(IMG_HANDLE hOSMemHandle, IMG_SIZE_T ui32ByteOffset) +static INLINE IMG_CPU_PHYADDR OSMemHandleToCpuPAddr(IMG_HANDLE hOSMemHandle, IMG_UINTPTR_T uiByteOffset) { IMG_CPU_PHYADDR sCpuPAddr; PVR_UNREFERENCED_PARAMETER(hOSMemHandle); - PVR_UNREFERENCED_PARAMETER(ui32ByteOffset); + PVR_UNREFERENCED_PARAMETER(uiByteOffset); sCpuPAddr.uiAddr = 0; return sCpuPAddr; } @@ -488,20 +484,9 @@ static INLINE IMG_BOOL OSMemHandleIsPhysContig(IMG_HANDLE hOSMemHandle) PVRSRV_ERROR OSInitEnvData(IMG_PVOID *ppvEnvSpecificData); PVRSRV_ERROR OSDeInitEnvData(IMG_PVOID pvEnvSpecificData); IMG_CHAR* OSStringCopy(IMG_CHAR *pszDest, const IMG_CHAR *pszSrc); -IMG_INT32 OSSNPrintf(IMG_CHAR *pStr, IMG_SIZE_T ui32Size, const IMG_CHAR *pszFormat, ...) IMG_FORMAT_PRINTF(3, 4); +IMG_INT32 OSSNPrintf(IMG_CHAR *pStr, IMG_SIZE_T uSize, const IMG_CHAR *pszFormat, ...) IMG_FORMAT_PRINTF(3, 4); #define OSStringLength(pszString) strlen(pszString) -#if defined (SUPPORT_SID_INTERFACE) -PVRSRV_ERROR OSEventObjectCreateKM(const IMG_CHAR *pszName, - PVRSRV_EVENTOBJECT_KM *psEventObject); -PVRSRV_ERROR OSEventObjectDestroyKM(PVRSRV_EVENTOBJECT_KM *psEventObject); -PVRSRV_ERROR OSEventObjectSignalKM(IMG_HANDLE hOSEventKM); -PVRSRV_ERROR OSEventObjectWaitKM(IMG_HANDLE hOSEventKM); -PVRSRV_ERROR OSEventObjectOpenKM(PVRSRV_EVENTOBJECT_KM *psEventObject, - IMG_HANDLE *phOSEvent); -PVRSRV_ERROR OSEventObjectCloseKM(PVRSRV_EVENTOBJECT_KM *psEventObject, - IMG_HANDLE hOSEventKM); -#else PVRSRV_ERROR OSEventObjectCreateKM(const IMG_CHAR *pszName, PVRSRV_EVENTOBJECT *psEventObject); PVRSRV_ERROR OSEventObjectDestroyKM(PVRSRV_EVENTOBJECT *psEventObject); @@ -511,17 +496,16 @@ PVRSRV_ERROR OSEventObjectOpenKM(PVRSRV_EVENTOBJECT *psEventObject, IMG_HANDLE *phOSEvent); PVRSRV_ERROR OSEventObjectCloseKM(PVRSRV_EVENTOBJECT *psEventObject, IMG_HANDLE hOSEventKM); -#endif /* #if defined (SUPPORT_SID_INTERFACE) */ -PVRSRV_ERROR OSBaseAllocContigMemory(IMG_SIZE_T ui32Size, IMG_CPU_VIRTADDR *pLinAddr, IMG_CPU_PHYADDR *pPhysAddr); -PVRSRV_ERROR OSBaseFreeContigMemory(IMG_SIZE_T ui32Size, IMG_CPU_VIRTADDR LinAddr, IMG_CPU_PHYADDR PhysAddr); +PVRSRV_ERROR OSBaseAllocContigMemory(IMG_SIZE_T uSize, IMG_CPU_VIRTADDR *pLinAddr, IMG_CPU_PHYADDR *pPhysAddr); +PVRSRV_ERROR OSBaseFreeContigMemory(IMG_SIZE_T uSize, IMG_CPU_VIRTADDR LinAddr, IMG_CPU_PHYADDR PhysAddr); -IMG_PVOID MapUserFromKernel(IMG_PVOID pvLinAddrKM,IMG_SIZE_T ui32Size,IMG_HANDLE *phMemBlock); +IMG_PVOID MapUserFromKernel(IMG_PVOID pvLinAddrKM,IMG_SIZE_T uSize,IMG_HANDLE *phMemBlock); IMG_PVOID OSMapHWRegsIntoUserSpace(IMG_HANDLE hDevCookie, IMG_SYS_PHYADDR sRegAddr, IMG_UINT32 ulSize, IMG_PVOID *ppvProcess); IMG_VOID OSUnmapHWRegsFromUserSpace(IMG_HANDLE hDevCookie, IMG_PVOID pvUserAddr, IMG_PVOID pvProcess); -IMG_VOID UnmapUserFromKernel(IMG_PVOID pvLinAddrUM, IMG_SIZE_T ui32Size, IMG_HANDLE hMemBlock); +IMG_VOID UnmapUserFromKernel(IMG_PVOID pvLinAddrUM, IMG_SIZE_T uSize, IMG_HANDLE hMemBlock); PVRSRV_ERROR OSMapPhysToUserSpace(IMG_HANDLE hDevCookie, IMG_SYS_PHYADDR sCPUPhysAddr, @@ -627,7 +611,7 @@ PVRSRV_ERROR OSRemoveTimer (IMG_HANDLE hTimer); PVRSRV_ERROR OSEnableTimer (IMG_HANDLE hTimer); PVRSRV_ERROR OSDisableTimer (IMG_HANDLE hTimer); -PVRSRV_ERROR OSGetSysMemSize(IMG_SIZE_T *pui32Bytes); +PVRSRV_ERROR OSGetSysMemSize(IMG_SIZE_T *puBytes); typedef enum _HOST_PCI_INIT_FLAGS_ { @@ -674,14 +658,14 @@ typedef enum _img_verify_test PVR_VERIFY_READ } IMG_VERIFY_TEST; -IMG_BOOL OSAccessOK(IMG_VERIFY_TEST eVerification, IMG_VOID *pvUserPtr, IMG_SIZE_T ui32Bytes); +IMG_BOOL OSAccessOK(IMG_VERIFY_TEST eVerification, IMG_VOID *pvUserPtr, IMG_SIZE_T uBytes); -PVRSRV_ERROR OSCopyToUser(IMG_PVOID pvProcess, IMG_VOID *pvDest, IMG_VOID *pvSrc, IMG_SIZE_T ui32Bytes); -PVRSRV_ERROR OSCopyFromUser(IMG_PVOID pvProcess, IMG_VOID *pvDest, IMG_VOID *pvSrc, IMG_SIZE_T ui32Bytes); +PVRSRV_ERROR OSCopyToUser(IMG_PVOID pvProcess, IMG_VOID *pvDest, IMG_VOID *pvSrc, IMG_SIZE_T uBytes); +PVRSRV_ERROR OSCopyFromUser(IMG_PVOID pvProcess, IMG_VOID *pvDest, IMG_VOID *pvSrc, IMG_SIZE_T uBytes); #if defined(__linux__) || defined(__QNXNTO__) PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID* pvCPUVAddr, - IMG_SIZE_T ui32Bytes, + IMG_SIZE_T uBytes, IMG_SYS_PHYADDR *psSysPAddr, IMG_HANDLE *phOSWrapMem); PVRSRV_ERROR OSReleasePhysPageAddr(IMG_HANDLE hOSWrapMem); @@ -690,12 +674,12 @@ PVRSRV_ERROR OSReleasePhysPageAddr(IMG_HANDLE hOSWrapMem); #pragma inline(OSAcquirePhysPageAddr) #endif static INLINE PVRSRV_ERROR OSAcquirePhysPageAddr(IMG_VOID* pvCPUVAddr, - IMG_SIZE_T ui32Bytes, + IMG_SIZE_T uBytes, IMG_SYS_PHYADDR *psSysPAddr, IMG_HANDLE *phOSWrapMem) { PVR_UNREFERENCED_PARAMETER(pvCPUVAddr); - PVR_UNREFERENCED_PARAMETER(ui32Bytes); + PVR_UNREFERENCED_PARAMETER(uBytes); PVR_UNREFERENCED_PARAMETER(psSysPAddr); PVR_UNREFERENCED_PARAMETER(phOSWrapMem); return PVRSRV_OK; @@ -787,6 +771,12 @@ static INLINE IMG_VOID OSGetCurrentProcessNameKM(IMG_CHAR *pszName, IMG_UINT32 u #endif +#if defined(__linux__) && defined(DEBUG) +#define OSDumpStack dump_stack +#else +#define OSDumpStack() +#endif + #if defined (__cplusplus) } #endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/pdump_km.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/pdump_km.h index e4325cc..4d62154 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/pdump_km.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/pdump_km.h @@ -77,6 +77,10 @@ extern IMG_UINT32 g_ui32EveryLineCounter; #define MAKEUNIQUETAG(hMemInfo) (0) #endif +IMG_BOOL _PDumpIsProcessActive(IMG_VOID); + +IMG_BOOL PDumpWillCapture(IMG_UINT32 ui32Flags); + #ifdef PDUMP #define MAKEUNIQUETAG(hMemInfo) (((BM_BUF *)(((PVRSRV_KERNEL_MEM_INFO *)(hMemInfo))->sMemBlk.hBuffer))->pMapping) @@ -267,8 +271,8 @@ extern IMG_UINT32 g_ui32EveryLineCounter; IMG_HANDLE hOSMemHandle, IMG_UINT32 ui32NumBytes, IMG_UINT32 ui32PageSize, - IMG_BOOL bShared, - IMG_HANDLE hUniqueTag); + IMG_HANDLE hUniqueTag, + IMG_UINT32 ui32Flags); PVRSRV_ERROR PDumpMallocPageTable(PVRSRV_DEVICE_IDENTIFIER *psDevId, IMG_HANDLE hOSMemHandle, IMG_UINT32 ui32Offset, @@ -282,7 +286,8 @@ extern IMG_UINT32 g_ui32EveryLineCounter; IMG_UINT32 ui32PageSize, IMG_HANDLE hUniqueTag, IMG_BOOL bInterleaved, - IMG_BOOL bSparse); + IMG_BOOL bSparse, + IMG_UINT32 ui32Flags); PVRSRV_ERROR PDumpFreePageTable(PVRSRV_DEVICE_IDENTIFIER *psDevID, IMG_HANDLE hOSMemHandle, IMG_CPU_VIRTADDR pvLinAddr, diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/pdump_osfunc.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/pdump_osfunc.h index 0f2e103..9fc1fd8 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/pdump_osfunc.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/pdump_osfunc.h @@ -58,7 +58,10 @@ extern "C" { * supported (e.g. Linux). */ #define MAX_PDUMP_STRING_LENGTH (256) -#if defined(__QNXNTO__) + + +#if defined(__QNXNTO__) + #define PDUMP_GET_SCRIPT_STRING() \ IMG_CHAR pszScript[MAX_PDUMP_STRING_LENGTH]; \ IMG_UINT32 ui32MaxLen = MAX_PDUMP_STRING_LENGTH-1; \ @@ -79,7 +82,12 @@ extern "C" { IMG_UINT32 ui32MaxLenFileName = MAX_PDUMP_STRING_LENGTH-1; \ IMG_HANDLE hScript = (IMG_HANDLE)pszScript; -#else /* WIN32 or QNX */ +#define PDUMP_LOCK(args...) +#define PDUMP_UNLOCK(args...) +#define PDUMP_LOCK_MSG(args...) +#define PDUMP_UNLOCK_MSG(args...) + +#else /* __QNXNTO__ */ /* @@ -117,6 +125,48 @@ extern "C" { eError = PDumpOSGetFilenameString(&pszFileName, &ui32MaxLenFileName);\ if(eError != PVRSRV_OK) return eError; +#define PDUMP_LOCK() \ + PDumpOSLock(__LINE__); + +#define PDUMP_UNLOCK() \ + PDumpOSUnlock(__LINE__); + +#define PDUMP_LOCK_MSG() \ + PDumpOSLockMessageBuffer(); + +#define PDUMP_UNLOCK_MSG() \ + PDumpOSUnlockMessageBuffer(); + + /*! + * @name PDumpOSLock + * @brief Lock the PDump streams + * @return error none + */ + IMG_VOID PDumpOSLock(IMG_UINT32 ui32Line); + + /*! + * @name PDumpOSUnlock + * @brief Lock the PDump streams + * @return error none + */ + IMG_VOID PDumpOSUnlock(IMG_UINT32 ui32Line); + + /*! + * @name PDumpOSLockMessageBuffer + * @brief Lock the PDump message buffer + * @return error none + */ + IMG_VOID PDumpOSLockMessageBuffer(IMG_VOID); + + /*! + * @name PDumpOSUnlockMessageBuffer + * @brief Lock the PDump message buffer + * @return error none + */ + IMG_VOID PDumpOSUnlockMessageBuffer(IMG_VOID); + +#endif /* __QNXNTO__ */ + /*! * @name PDumpOSGetScriptString * @brief Get the "script" buffer @@ -147,8 +197,6 @@ extern "C" { */ PVRSRV_ERROR PDumpOSGetFilenameString(IMG_CHAR **ppszFile, IMG_UINT32 *pui32MaxLen); -#endif /* WIN32 or QNX */ - /* * Define macro for processing variable args list in OS-independent @@ -305,13 +353,13 @@ IMG_VOID PDumpOSCPUVAddrToDevPAddr(PVRSRV_DEVICE_TYPE eDeviceType, * @param hOSMemHandle mem allocation handle (used if kernel virtual mem space is limited, e.g. linux) * @param ui32Offset offset within mem allocation block * @param pui8LinAddr CPU linear addr - * @param ui32DataPageMask mask for data page (= data page size -1) + * @param uiDataPageMask mask for data page (= data page size -1) * @return pui32PageOffset CPU page offset (same as device page offset if page sizes equal) */ IMG_VOID PDumpOSCPUVAddrToPhysPages(IMG_HANDLE hOSMemHandle, IMG_UINT32 ui32Offset, IMG_PUINT8 pui8LinAddr, - IMG_UINT32 ui32DataPageMask, + IMG_UINTPTR_T uiDataPageMask, IMG_UINT32 *pui32PageOffset); /*! diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/perproc.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/perproc.h index d603613..124f2f2 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/perproc.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/perproc.h @@ -56,21 +56,12 @@ typedef struct _PVRSRV_PER_PROCESS_DATA_ IMG_UINT32 ui32PID; IMG_HANDLE hBlockAlloc; PRESMAN_CONTEXT hResManContext; -#if defined (SUPPORT_SID_INTERFACE) - IMG_SID hPerProcData; -#else IMG_HANDLE hPerProcData; -#endif PVRSRV_HANDLE_BASE *psHandleBase; -#if defined (SUPPORT_SID_INTERFACE) - /* Handles are being allocated in batches */ - IMG_BOOL bHandlesBatched; -#else #if defined (PVR_SECURE_HANDLES) /* Handles are being allocated in batches */ IMG_BOOL bHandlesBatched; #endif /* PVR_SECURE_HANDLES */ -#endif /* SUPPORT_SID_INTERFACE */ IMG_UINT32 ui32RefCount; /* True if the process is the initialisation server. */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/queue.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/queue.h index 58f8093..6bc82ed 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/queue.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/queue.h @@ -43,6 +43,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef QUEUE_H #define QUEUE_H +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) #if defined(__cplusplus) extern "C" { @@ -51,9 +52,9 @@ extern "C" { /*! * Macro to Read Offset in given command queue */ -#define UPDATE_QUEUE_ROFF(psQueue, ui32Size) \ - (psQueue)->ui32ReadOffset = ((psQueue)->ui32ReadOffset + (ui32Size)) \ - & ((psQueue)->ui32QueueSize - 1); +#define UPDATE_QUEUE_ROFF(psQueue, uSize) \ + (psQueue)->uReadOffset = ((psQueue)->uReadOffset + (uSize)) \ + & ((psQueue)->uQueueSize - 1); /*! generic cmd complete structure. @@ -75,6 +76,11 @@ extern "C" { IMG_UINT32 ui32AllocSize; /*!< allocated size*/ PFN_QUEUE_COMMAND_COMPLETE pfnCommandComplete; /*!< Command complete callback */ IMG_HANDLE hCallbackData; /*!< Command complete callback data */ + +#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) + IMG_VOID *pvCleanupFence; /*!< Sync fence to 'put' after timeline inc() */ + IMG_VOID *pvTimeline; /*!< Android sync timeline to inc() */ +#endif }COMMAND_COMPLETE_DATA, *PCOMMAND_COMPLETE_DATA; #if !defined(USE_CODE) @@ -92,7 +98,7 @@ void ProcSeqShowQueue(struct seq_file *sfile,void* el); IMG_IMPORT -PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateCommandQueueKM(IMG_SIZE_T ui32QueueSize, +PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateCommandQueueKM(IMG_SIZE_T uQueueSize, PVRSRV_QUEUE_INFO **ppsQueueInfo); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVDestroyCommandQueueKM(PVRSRV_QUEUE_INFO *psQueueInfo); @@ -108,11 +114,12 @@ PVRSRV_ERROR IMG_CALLCONV PVRSRVInsertCommandKM(PVRSRV_QUEUE_INFO *psQueue, PVRSRV_KERNEL_SYNC_INFO *apsSrcSync[], IMG_SIZE_T ui32DataByteSize, PFN_QUEUE_COMMAND_COMPLETE pfnCommandComplete, - IMG_HANDLE hCallbackData); + IMG_HANDLE hCallbackData, + IMG_HANDLE *phFence); IMG_IMPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVGetQueueSpaceKM(PVRSRV_QUEUE_INFO *psQueue, - IMG_SIZE_T ui32ParamSize, + IMG_SIZE_T uParamSize, IMG_VOID **ppvSpace); IMG_IMPORT @@ -138,6 +145,8 @@ PVRSRV_ERROR PVRSRVRemoveCmdProcListKM(IMG_UINT32 ui32DevIndex, } #endif +#endif /* defined(SUPPORT_PVRSRV_DEVICE_CLASS) */ + #endif /* QUEUE_H */ /****************************************************************************** diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ra.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ra.h index b84a8e5..aaeb345 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ra.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ra.h @@ -87,9 +87,6 @@ struct _RA_STATISTICS_ /** total number of spans deallocated by the callback mechanism */ IMG_SIZE_T uExportCount; - - IMG_SIZE_T uFailedAllocCount; - }; typedef struct _RA_STATISTICS_ RA_STATISTICS; diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/refcount.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/refcount.h index 0e3479d..a2efd6c 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/refcount.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/refcount.h @@ -43,6 +43,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define __REFCOUNT_H__ #include "pvr_bridge_km.h" +#if defined(SUPPORT_ION) +#include "ion_sync.h" +#endif /* defined(SUPPORT_ION) */ #if defined(PVRSRV_REFCOUNT_DEBUG) @@ -111,6 +114,23 @@ void PVRSRVOffsetStructIncMapped2(const IMG_CHAR *pszFile, IMG_INT iLine, void PVRSRVOffsetStructDecMapped2(const IMG_CHAR *pszFile, IMG_INT iLine, PKV_OFFSET_STRUCT psOffsetStruct); +#if defined(SUPPORT_ION) +#define PVRSRVIonBufferSyncInfoIncRef(x...) \ + PVRSRVIonBufferSyncInfoIncRef2(__FILE__, __LINE__, x) +#define PVRSRVIonBufferSyncInfoDecRef(x...) \ + PVRSRVIonBufferSyncInfoDecRef2(__FILE__, __LINE__, x) + +PVRSRV_ERROR PVRSRVIonBufferSyncInfoIncRef2(const IMG_CHAR *pszFile, IMG_INT iLine, + IMG_HANDLE hUnique, + IMG_HANDLE hDevCookie, + IMG_HANDLE hDevMemContext, + PVRSRV_ION_SYNC_INFO **ppsIonSyncInfo, + PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo); +void PVRSRVIonBufferSyncInfoDecRef2(const IMG_CHAR *pszFile, IMG_INT iLine, + PVRSRV_ION_SYNC_INFO *psIonSyncInfo, + PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo); +#endif /* defined (SUPPORT_ION) */ + #endif /* defined(__linux__) */ #else /* defined(PVRSRV_REFCOUNT_DEBUG) */ @@ -196,6 +216,29 @@ static INLINE void PVRSRVOffsetStructDecMapped(PKV_OFFSET_STRUCT psOffsetStruct) psOffsetStruct->ui32Mapped--; } +#if defined(SUPPORT_ION) +static INLINE PVRSRV_ERROR PVRSRVIonBufferSyncInfoIncRef(IMG_HANDLE hUnique, + IMG_HANDLE hDevCookie, + IMG_HANDLE hDevMemContext, + PVRSRV_ION_SYNC_INFO **ppsIonSyncInfo, + PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo) +{ + PVR_UNREFERENCED_PARAMETER(psKernelMemInfo); + + return PVRSRVIonBufferSyncAcquire(hUnique, + hDevCookie, + hDevMemContext, + ppsIonSyncInfo); +} + +static INLINE void PVRSRVIonBufferSyncInfoDecRef(PVRSRV_ION_SYNC_INFO *psIonSyncInfo, + PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo) +{ + PVR_UNREFERENCED_PARAMETER(psKernelMemInfo); + PVRSRVIonBufferSyncRelease(psIonSyncInfo); +} +#endif /* defined (SUPPORT_ION) */ + #endif /* defined(__linux__) */ #endif /* defined(PVRSRV_REFCOUNT_DEBUG) */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/srvkm.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/srvkm.h index 5d396f8..45ac3b1 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/srvkm.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/srvkm.h @@ -42,6 +42,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef SRVKM_H #define SRVKM_H +#include "servicesint.h" #if defined(__cplusplus) extern "C" { @@ -63,12 +64,155 @@ extern "C" { IMG_IMPORT IMG_VOID PVRSRVScheduleDevicesKM(IMG_VOID); +#if defined(SUPPORT_PVRSRV_DEVICE_CLASS) IMG_VOID IMG_CALLCONV PVRSRVSetDCState(IMG_UINT32 ui32State); +#endif PVRSRV_ERROR IMG_CALLCONV PVRSRVSaveRestoreLiveSegments(IMG_HANDLE hArena, IMG_PBYTE pbyBuffer, IMG_SIZE_T *puiBufSize, IMG_BOOL bSave); IMG_VOID PVRSRVScheduleDeviceCallbacks(IMG_VOID); + IMG_IMPORT IMG_VOID IMG_CALLCONV PVRSRVDumpSyncs(IMG_BOOL bActiveOnly); + +#define SYNC_OP_CLASS_MASK 0x0000ffffUL +#define SYNC_OP_CLASS_SHIFT 0 +#define SYNC_OP_CLASS_MODOBJ (1<<0) +#define SYNC_OP_CLASS_QUEUE (1<<1) +#define SYNC_OP_CLASS_KICKTA (1<<2) +#define SYNC_OP_CLASS_TQ_3D (1<<3) +#define SYNC_OP_CLASS_TQ_2D (1<<4) + +#define SYNC_OP_TYPE_MASK 0x00f0000UL +#define SYNC_OP_TYPE_SHIFT 16 +#define SYNC_OP_TYPE_READOP (1<<0) +#define SYNC_OP_TYPE_WRITEOP (1<<1) +#define SYNC_OP_TYPE_READOP2 (1<<2) + +#define SYNC_OP_HAS_DATA 0x80000000UL +#define SYNC_OP_TAKE 0x40000000UL +#define SYNC_OP_ROLLBACK 0x20000000UL + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SyncTakeWriteOp) +#endif +static INLINE +IMG_UINT32 SyncTakeWriteOp(PVRSRV_KERNEL_SYNC_INFO *psKernelSync, IMG_UINT32 ui32OpType) +{ +#if defined(SUPPORT_PER_SYNC_DEBUG) + IMG_UINT32 ui32Index = psKernelSync->ui32HistoryIndex; + + /* Record a history of all the classes of operation taken on this sync */ + psKernelSync->ui32OperationMask |= (ui32OpType & SYNC_OP_CLASS_MASK) >> SYNC_OP_CLASS_SHIFT; + + /* Add this operation to the history buffer */ + psKernelSync->aui32OpInfo[ui32Index] = SYNC_OP_HAS_DATA | ui32OpType | (SYNC_OP_TYPE_WRITEOP << SYNC_OP_TYPE_SHIFT) | SYNC_OP_TAKE; + psKernelSync->aui32ReadOpSample[ui32Index] = psKernelSync->psSyncData->ui32ReadOpsPending; + psKernelSync->aui32WriteOpSample[ui32Index] = psKernelSync->psSyncData->ui32WriteOpsPending; + psKernelSync->aui32ReadOp2Sample[ui32Index] = psKernelSync->psSyncData->ui32ReadOps2Pending; + psKernelSync->ui32HistoryIndex++; + psKernelSync->ui32HistoryIndex = psKernelSync->ui32HistoryIndex % PER_SYNC_HISTORY; +#endif + PVR_UNREFERENCED_PARAMETER(ui32OpType); + return psKernelSync->psSyncData->ui32WriteOpsPending++; +} + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SyncTakeReadOp) +#endif +static INLINE +IMG_UINT32 SyncTakeReadOp(PVRSRV_KERNEL_SYNC_INFO *psKernelSync, IMG_UINT32 ui32OpType) +{ +#if defined(SUPPORT_PER_SYNC_DEBUG) + IMG_UINT32 ui32Index = psKernelSync->ui32HistoryIndex; + + /* Record a history of all the classes of operation taken on this sync */ + psKernelSync->ui32OperationMask |= (ui32OpType & SYNC_OP_CLASS_MASK) >> SYNC_OP_CLASS_SHIFT; + + /* Add this operation to the history buffer */ + psKernelSync->aui32OpInfo[ui32Index] = SYNC_OP_HAS_DATA | ui32OpType | (SYNC_OP_TYPE_READOP << SYNC_OP_TYPE_SHIFT) | SYNC_OP_TAKE; + psKernelSync->aui32ReadOpSample[ui32Index] = psKernelSync->psSyncData->ui32ReadOpsPending; + psKernelSync->aui32WriteOpSample[ui32Index] = psKernelSync->psSyncData->ui32WriteOpsPending; + psKernelSync->aui32ReadOp2Sample[ui32Index] = psKernelSync->psSyncData->ui32ReadOps2Pending; + psKernelSync->ui32HistoryIndex++; + psKernelSync->ui32HistoryIndex = psKernelSync->ui32HistoryIndex % PER_SYNC_HISTORY; +#endif + PVR_UNREFERENCED_PARAMETER(ui32OpType); + return psKernelSync->psSyncData->ui32ReadOpsPending++; +} + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SyncTakeReadOp2) +#endif +static INLINE +IMG_UINT32 SyncTakeReadOp2(PVRSRV_KERNEL_SYNC_INFO *psKernelSync, IMG_UINT32 ui32OpType) +{ +#if defined(SUPPORT_PER_SYNC_DEBUG) + IMG_UINT32 ui32Index = psKernelSync->ui32HistoryIndex; + + /* Record a history of all the classes of operation taken on this sync */ + psKernelSync->ui32OperationMask |= (ui32OpType & SYNC_OP_CLASS_MASK) >> SYNC_OP_CLASS_SHIFT; + + /* Add this operation to the history buffer */ + psKernelSync->aui32OpInfo[ui32Index] = SYNC_OP_HAS_DATA | ui32OpType | (SYNC_OP_TYPE_READOP2 << SYNC_OP_TYPE_SHIFT) | SYNC_OP_TAKE; + psKernelSync->aui32ReadOpSample[ui32Index] = psKernelSync->psSyncData->ui32ReadOpsPending; + psKernelSync->aui32WriteOpSample[ui32Index] = psKernelSync->psSyncData->ui32WriteOpsPending; + psKernelSync->aui32ReadOp2Sample[ui32Index] = psKernelSync->psSyncData->ui32ReadOps2Pending; + psKernelSync->ui32HistoryIndex++; + psKernelSync->ui32HistoryIndex = psKernelSync->ui32HistoryIndex % PER_SYNC_HISTORY; +#endif + PVR_UNREFERENCED_PARAMETER(ui32OpType); + return psKernelSync->psSyncData->ui32ReadOps2Pending++; +} + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SyncRollBackWriteOp) +#endif +static INLINE +IMG_UINT32 SyncRollBackWriteOp(PVRSRV_KERNEL_SYNC_INFO *psKernelSync, IMG_UINT32 ui32OpType) +{ +#if defined(SUPPORT_PER_SYNC_DEBUG) + IMG_UINT32 ui32Index = psKernelSync->ui32HistoryIndex; + + /* Record a history of all the classes of operation taken on this sync */ + psKernelSync->ui32OperationMask |= (ui32OpType & SYNC_OP_CLASS_MASK) >> SYNC_OP_CLASS_SHIFT; + + /* Add this operation to the history buffer */ + psKernelSync->aui32OpInfo[ui32Index] = SYNC_OP_HAS_DATA | ui32OpType | (SYNC_OP_TYPE_WRITEOP << SYNC_OP_TYPE_SHIFT) | SYNC_OP_ROLLBACK; + psKernelSync->aui32ReadOpSample[ui32Index] = psKernelSync->psSyncData->ui32ReadOpsPending; + psKernelSync->aui32WriteOpSample[ui32Index] = psKernelSync->psSyncData->ui32WriteOpsPending; + psKernelSync->aui32ReadOp2Sample[ui32Index] = psKernelSync->psSyncData->ui32ReadOps2Pending; + psKernelSync->ui32HistoryIndex++; + psKernelSync->ui32HistoryIndex = psKernelSync->ui32HistoryIndex % PER_SYNC_HISTORY; +#endif + PVR_UNREFERENCED_PARAMETER(ui32OpType); + return psKernelSync->psSyncData->ui32WriteOpsPending--; +} + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SyncRollBackReadOp) +#endif +static INLINE +IMG_UINT32 SyncRollBackReadOp(PVRSRV_KERNEL_SYNC_INFO *psKernelSync, IMG_UINT32 ui32OpType) +{ +#if defined(SUPPORT_PER_SYNC_DEBUG) + IMG_UINT32 ui32Index = psKernelSync->ui32HistoryIndex; + + /* Record a history of all the classes of operation taken on this sync */ + psKernelSync->ui32OperationMask |= (ui32OpType & SYNC_OP_CLASS_MASK) >> SYNC_OP_CLASS_SHIFT; + + /* Add this operation to the history buffer */ + psKernelSync->aui32OpInfo[ui32Index] = SYNC_OP_HAS_DATA | ui32OpType | (SYNC_OP_TYPE_READOP << SYNC_OP_TYPE_SHIFT) | SYNC_OP_ROLLBACK; + psKernelSync->aui32ReadOpSample[ui32Index] = psKernelSync->psSyncData->ui32ReadOpsPending; + psKernelSync->aui32WriteOpSample[ui32Index] = psKernelSync->psSyncData->ui32WriteOpsPending; + psKernelSync->aui32ReadOp2Sample[ui32Index] = psKernelSync->psSyncData->ui32ReadOps2Pending; + psKernelSync->ui32HistoryIndex++; + psKernelSync->ui32HistoryIndex = psKernelSync->ui32HistoryIndex % PER_SYNC_HISTORY; +#endif + PVR_UNREFERENCED_PARAMETER(ui32OpType); + return psKernelSync->psSyncData->ui32ReadOpsPending--; +} + + #if defined (__cplusplus) } diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ttrace_common.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ttrace_common.h index b14f256..e149c20 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ttrace_common.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ttrace_common.h @@ -121,7 +121,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define READ_HEADER(n,m) \ ((m & (PVRSRV_TRACE_##n##_MASK << PVRSRV_TRACE_##n##_SHIFT)) >> PVRSRV_TRACE_##n##_SHIFT) + +#if defined(TTRACE_LARGE_BUFFER) +#define TIME_TRACE_BUFFER_SIZE 8192 +#else #define TIME_TRACE_BUFFER_SIZE 4096 +#endif /* Type defines for trace items */ #define PVRSRV_TRACE_TYPE_UI8 0 diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ttrace_tokens.h b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ttrace_tokens.h index 24bc484..5f89849 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ttrace_tokens.h +++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/include/ttrace_tokens.h @@ -52,26 +52,29 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define PVRSRV_TRACE_GROUP_QUEUE 2 #define PVRSRV_TRACE_GROUP_POWER 3 #define PVRSRV_TRACE_GROUP_MKSYNC 4 +#define PVRSRV_TRACE_GROUP_MODOBJ 5 #define PVRSRV_TRACE_GROUP_PADDING 255 /* Trace classes */ #define PVRSRV_TRACE_CLASS_FUNCTION_ENTER 0 #define PVRSRV_TRACE_CLASS_FUNCTION_EXIT 1 -#define PVRSRV_TRACE_CLASS_SYNC 2 -#define PVRSRV_TRACE_CLASS_CCB 3 +#define PVRSRV_TRACE_CLASS_SYNC 2 +#define PVRSRV_TRACE_CLASS_CCB 3 #define PVRSRV_TRACE_CLASS_CMD_START 4 -#define PVRSRV_TRACE_CLASS_CMD_END 5 +#define PVRSRV_TRACE_CLASS_CMD_END 5 #define PVRSRV_TRACE_CLASS_CMD_COMP_START 6 #define PVRSRV_TRACE_CLASS_CMD_COMP_END 7 #define PVRSRV_TRACE_CLASS_FLAGS 8 - -#define PVRSRV_TRACE_CLASS_NONE 255 +#define PVRSRV_TRACE_CLASS_DEVVADDR 9 +#define PVRSRV_TRACE_CLASS_FRAMENUM 10 + +#define PVRSRV_TRACE_CLASS_NONE 255 /* Operation about to happen on the sync object */ #define PVRSRV_SYNCOP_SAMPLE 0 #define PVRSRV_SYNCOP_COMPLETE 1 -#define PVRSRV_SYNCOP_DUMP 2 +#define PVRSRV_SYNCOP_DUMP 2 /* * Trace tokens @@ -80,15 +83,19 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Kick group tokens */ -#define KICK_TOKEN_DOKICK 0 +#define KICK_TOKEN_DOKICK 0 #define KICK_TOKEN_CCB_OFFSET 1 #define KICK_TOKEN_TA3D_SYNC 2 -#define KICK_TOKEN_TA_SYNC 3 -#define KICK_TOKEN_3D_SYNC 4 -#define KICK_TOKEN_SRC_SYNC 5 -#define KICK_TOKEN_DST_SYNC 6 -#define KICK_TOKEN_FIRST_KICK 7 -#define KICK_TOKEN_LAST_KICK 8 +#define KICK_TOKEN_TA_SYNC 3 +#define KICK_TOKEN_3D_SYNC 4 +#define KICK_TOKEN_SRC_SYNC 5 +#define KICK_TOKEN_DST_SYNC 6 +#define KICK_TOKEN_FIRST_KICK 7 +#define KICK_TOKEN_LAST_KICK 8 +#define KICK_TOKEN_HWRTDATASET 9 +#define KICK_TOKEN_HWRTDATA 10 +#define KICK_TOKEN_FRAMENUM 11 +#define KICK_TOKEN_RENDERCONTEXT 12 /* Transfer Queue group tokens */ #define TRANSFER_TOKEN_SUBMIT 0 @@ -99,21 +106,30 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define TRANSFER_TOKEN_CCB_OFFSET 5 /* Queue group tokens */ -#define QUEUE_TOKEN_GET_SPACE 0 -#define QUEUE_TOKEN_INSERTKM 1 -#define QUEUE_TOKEN_SUBMITKM 2 -#define QUEUE_TOKEN_PROCESS_COMMAND 3 -#define QUEUE_TOKEN_PROCESS_QUEUES 4 +#define QUEUE_TOKEN_GET_SPACE 0 +#define QUEUE_TOKEN_INSERTKM 1 +#define QUEUE_TOKEN_SUBMITKM 2 +#define QUEUE_TOKEN_PROCESS_COMMAND 3 +#define QUEUE_TOKEN_PROCESS_QUEUES 4 #define QUEUE_TOKEN_COMMAND_COMPLETE 5 -#define QUEUE_TOKEN_UPDATE_DST 6 -#define QUEUE_TOKEN_UPDATE_SRC 7 -#define QUEUE_TOKEN_SRC_SYNC 8 -#define QUEUE_TOKEN_DST_SYNC 9 -#define QUEUE_TOKEN_COMMAND_TYPE 10 +#define QUEUE_TOKEN_UPDATE_DST 6 +#define QUEUE_TOKEN_UPDATE_SRC 7 +#define QUEUE_TOKEN_SRC_SYNC 8 +#define QUEUE_TOKEN_DST_SYNC 9 +#define QUEUE_TOKEN_COMMAND_TYPE 10 /* uKernel Sync tokens */ #define MKSYNC_TOKEN_KERNEL_CCB_OFFSET 0 -#define MKSYNC_TOKEN_CORE_CLK 1 -#define MKSYNC_TOKEN_UKERNEL_CLK 2 +#define MKSYNC_TOKEN_CORE_CLK 1 +#define MKSYNC_TOKEN_UKERNEL_CLK 2 + +/* ModObj tokens */ +#define MODOBJ_TOKEN_MODIFY_PENDING 0 +#define MODOBJ_TOKEN_COMPLETE_PENDING 1 +#define MODOBJ_TOKEN_READ_SYNC 2 +#define MODOBJ_TOKEN_WRITE_SYNC 3 +#define MODOBJ_TOKEN_READ_WRITE_SYNC 4 +#define MODOBJ_TOKEN_SYNC_UPDATE 5 +#define MODOBJ_TOKEN_READ2_SYNC 6 #endif /* __TTRACE_TOKENS_H__ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/include/syscommon.h b/jacinto6/sgx_src/eurasia_km/services4/system/include/syscommon.h index 4fd3512..a31794b 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/system/include/syscommon.h +++ b/jacinto6/sgx_src/eurasia_km/services4/system/include/syscommon.h @@ -116,11 +116,7 @@ typedef struct _SYS_DATA_TAG_ RA_ARENA *apsLocalDevMemArena[SYS_MAX_LOCAL_DEVMEM_ARENAS]; /*!< RA Arenas for local device memory heap management */ IMG_CHAR *pszVersionString; /*!< Human readable string showing relevent system version info */ -#if defined (SUPPORT_SID_INTERFACE) - PVRSRV_EVENTOBJECT_KM *psGlobalEventObject; /*!< OS Global Event Object */ -#else PVRSRV_EVENTOBJECT *psGlobalEventObject; /*!< OS Global Event Object */ -#endif PVRSRV_MISC_INFO_CPUCACHEOP_TYPE ePendingCacheOpType; /*!< Deferred CPU cache op control */ @@ -172,9 +168,6 @@ PVRSRV_ERROR SysPowerLockWrap(IMG_BOOL bTryLock); IMG_VOID SysPowerLockUnwrap(IMG_VOID); #endif -IMG_VOID SysLockSystemSuspend(IMG_VOID); -IMG_VOID SysUnlockSystemSuspend(IMG_VOID); - PVRSRV_ERROR SysOEMFunction ( IMG_UINT32 ui32ID, IMG_VOID *pvIn, IMG_UINT32 ulInSize, diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/oemfuncs.h b/jacinto6/sgx_src/eurasia_km/services4/system/omap/oemfuncs.h new file mode 100644 index 0000000..0902042 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/oemfuncs.h @@ -0,0 +1,80 @@ +/*************************************************************************/ /*! +@Title SGX kernel/client driver interface structures and prototypes +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#if !defined(__OEMFUNCS_H__) +#define __OEMFUNCS_H__ + +#if defined (__cplusplus) +extern "C" { +#endif + +/* function in/out data structures: */ +typedef IMG_UINT32 (*PFN_SRV_BRIDGEDISPATCH)( IMG_UINT32 Ioctl, + IMG_BYTE *pInBuf, + IMG_UINT32 InBufLen, + IMG_BYTE *pOutBuf, + IMG_UINT32 OutBufLen, + IMG_UINT32 *pdwBytesTransferred); +/* + Function table for kernel 3rd party driver to kernel services +*/ +typedef struct PVRSRV_DC_OEM_JTABLE_TAG +{ + PFN_SRV_BRIDGEDISPATCH pfnOEMBridgeDispatch; + IMG_PVOID pvDummy1; + IMG_PVOID pvDummy2; + IMG_PVOID pvDummy3; + +} PVRSRV_DC_OEM_JTABLE; + +#define OEM_GET_EXT_FUNCS (1<<1) + +#if defined(__cplusplus) +} +#endif + +#endif /* __OEMFUNCS_H__ */ + +/***************************************************************************** + End of file (oemfuncs.h) +*****************************************************************************/ + + diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq.c b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq.c new file mode 100644 index 0000000..1febc75 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq.c @@ -0,0 +1,764 @@ +/* + * Copyright (C) 2012 Texas Instruments, Inc + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/opp.h> +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) +#include <plat/gpu.h> +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) +#include <linux/regulator/consumer.h> +#endif + +#include "sgxfreq.h" + +static struct sgxfreq_data { + int freq_cnt; + unsigned long *freq_list; + unsigned long freq; + unsigned long freq_request; + unsigned long freq_limit; + unsigned long total_idle_time; + unsigned long total_active_time; + struct mutex freq_mutex; + struct list_head gov_list; + struct sgxfreq_governor *gov; + struct mutex gov_mutex; + struct sgxfreq_sgx_data sgx_data; + struct device *dev; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + struct gpu_platform_data *pdata; +#else + struct clk *core_clk; + struct clk *gpu_clk; + struct clk *per_clk; + struct clk *gpu_core_clk; + struct clk *gpu_hyd_clk; + struct regulator *gpu_reg; +#endif +} sfd; + +/* Governor init/deinit functions */ +int onoff_init(void); +int onoff_deinit(void); +int activeidle_init(void); +int activeidle_deinit(void); +int on3demand_init(void); +int on3demand_deinit(void); +int userspace_init(void); +int userspace_deinit(void); + + +typedef int sgxfreq_gov_init_t(void); +sgxfreq_gov_init_t *sgxfreq_gov_init[] = { + onoff_init, + activeidle_init, + on3demand_init, + userspace_init, + NULL, +}; + +typedef int sgxfreq_gov_deinit_t(void); +sgxfreq_gov_deinit_t *sgxfreq_gov_deinit[] = { + onoff_deinit, + activeidle_deinit, + on3demand_deinit, + userspace_deinit, + NULL, +}; + +#define SGXFREQ_DEFAULT_GOV_NAME "on3demand" +static unsigned long _idle_curr_time; +static unsigned long _idle_prev_time; +static unsigned long _active_curr_time; +static unsigned long _active_prev_time; + +#if (defined(CONFIG_THERMAL) || defined(CONFIG_THERMAL_FRAMEWORK)) +int cool_init(void); +void cool_deinit(void); +#endif + +/*********************** begin sysfs interface ***********************/ + +struct kobject *sgxfreq_kobj; + +static ssize_t show_frequency_list(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + int i; + ssize_t count = 0; + + for (i = 0; i < sfd.freq_cnt; i++) + count += sprintf(&buf[count], "%lu ", sfd.freq_list[i]); + count += sprintf(&buf[count], "\n"); + + return count; +} + +static ssize_t show_frequency_request(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "%lu\n", sfd.freq_request); +} + +static ssize_t show_frequency_limit(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "%lu\n", sfd.freq_limit); +} + +static ssize_t show_frequency(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "%lu\n", sfd.freq); +} + +static ssize_t show_stat(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "gpu %lu %lu\n", + sfd.total_active_time, sfd.total_idle_time); +} + +static ssize_t show_governor_list(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + ssize_t i = 0; + struct sgxfreq_governor *t; + + list_for_each_entry(t, &sfd.gov_list, governor_list) { + if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char)) + - (SGXFREQ_NAME_LEN + 2))) + goto out; + i += scnprintf(&buf[i], SGXFREQ_NAME_LEN, "%s ", t->name); + } +out: + i += sprintf(&buf[i], "\n"); + return i; +} + +static ssize_t show_governor(struct device *dev, + struct device_attribute *attr, char *buf) +{ + if (sfd.gov) + return scnprintf(buf, SGXFREQ_NAME_LEN, "%s\n", sfd.gov->name); + + return sprintf(buf, "\n"); +} + +static ssize_t store_governor(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + int ret; + char name[16]; + + ret = sscanf(buf, "%15s", name); + if (ret != 1) + return -EINVAL; + + ret = sgxfreq_set_governor(name); + if (ret) + return ret; + else + return count; +} + +static DEVICE_ATTR(frequency_list, 0444, show_frequency_list, NULL); +static DEVICE_ATTR(frequency_request, 0444, show_frequency_request, NULL); +static DEVICE_ATTR(frequency_limit, 0444, show_frequency_limit, NULL); +static DEVICE_ATTR(frequency, 0444, show_frequency, NULL); +static DEVICE_ATTR(governor_list, 0444, show_governor_list, NULL); +static DEVICE_ATTR(governor, 0644, show_governor, store_governor); +static DEVICE_ATTR(stat, 0444, show_stat, NULL); + +static const struct attribute *sgxfreq_attributes[] = { + &dev_attr_frequency_list.attr, + &dev_attr_frequency_request.attr, + &dev_attr_frequency_limit.attr, + &dev_attr_frequency.attr, + &dev_attr_governor_list.attr, + &dev_attr_governor.attr, + &dev_attr_stat.attr, + NULL +}; + +/************************ end sysfs interface ************************/ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) +static int set_volt_for_freq(unsigned long freq) +{ + struct opp *opp; + unsigned long volt = 0; + int ret; + + if (sfd.gpu_reg) { + opp = opp_find_freq_exact(sfd.dev, freq, true); + if(IS_ERR(opp)) + { + int r = PTR_ERR(opp); + pr_err("sgxfreq: Couldn't find opp matching freq: %lu. Err: %d", + freq, r); + return -1; + } + + volt = opp_get_voltage(opp); + if (!volt) + { + pr_err("sgxfreq: Could find volt corresponding to freq: %lu\n", + freq); + return -1; + } + + ret = regulator_set_voltage_tol(sfd.gpu_reg, volt , 6000); + if (ret) { + pr_err("sgxfreq: Error(%d) setting volt: %lu for freq:%lu\n", + ret, volt, freq); + return ret; + } + } + + return 0; + +} +#endif + +static int __set_freq(void) +{ + unsigned long freq; + int ret = 0; + + freq = min(sfd.freq_request, sfd.freq_limit); + if (freq != sfd.freq) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) + if (freq > sfd.freq) { + /* Going up - must scale voltage before clocks */ + if (set_volt_for_freq(freq) != 0) { + pr_err("sgxfreq: Error setting voltage for freq: %lu\n", + freq); + goto err1; + } + } + + ret = clk_set_rate(sfd.gpu_core_clk, freq); + if (ret) { + pr_err("sgxfreq: Error(%d) setting gpu core clock rate: %lu\n", + ret, freq); + goto err2; + } + + ret = clk_set_rate(sfd.gpu_hyd_clk, freq); + if (ret) { + pr_err("sgxfreq: Error(%d) setting gpu hyd clock rate: %lu\n", + ret, freq); + goto err3; + } + + if (freq < sfd.freq) { + /* Going down - must scale voltage after clocks */ + if(set_volt_for_freq(freq) != 0) { + pr_err("sgxfreq: Error setting voltage for freq: %lu\n", + freq); + goto err4; + } + } + +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) + sfd.pdata->device_scale(sfd.dev, sfd.dev, freq); +#else + sfd.pdata->device_scale(sfd.dev, freq); +#endif + sfd.freq = freq; + + goto noerr; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) +err4: + ret |= clk_set_rate(sfd.gpu_hyd_clk, sfd.freq); + +err3: + ret |= clk_set_rate(sfd.gpu_core_clk, sfd.freq); +err2: + if(freq > sfd.freq) + ret |= set_volt_for_freq(sfd.freq); +err1: +#endif +noerr: + return ret; + } +} + +static struct sgxfreq_governor *__find_governor(const char *name) +{ + struct sgxfreq_governor *t; + + list_for_each_entry(t, &sfd.gov_list, governor_list) + if (!strnicmp(name, t->name, SGXFREQ_NAME_LEN)) + return t; + + return NULL; +} + +static void __update_timing_info(bool active) +{ + struct timeval tv; + do_gettimeofday(&tv); + if(active) + { + if(sfd.sgx_data.active == true) { + _active_curr_time = __tv2msec(tv); + sfd.total_active_time += __delta32( + _active_curr_time, _active_prev_time); + SGXFREQ_TRACE("A->A TA:= %lums \tdA: %lums \tTI: %lums \tdI: %lums\n", + sfd.total_active_time, + __delta32(_active_curr_time, _active_prev_time), + sfd.total_active_time, + (unsigned long)0); + _active_prev_time = _active_curr_time; + } else { + _idle_curr_time = __tv2msec(tv); + _active_prev_time = _idle_curr_time; + sfd.total_idle_time += + __delta32(_idle_curr_time, _idle_prev_time); + SGXFREQ_TRACE("I->A TA:= %lums \tdA: %lums \tTI: %lums \tdI: %lums\n", + sfd.total_active_time, + (unsigned long)0, + sfd.total_idle_time, + __delta32(_idle_curr_time, _idle_prev_time)); + } + } else { + if(sfd.sgx_data.active == true) + { + _idle_prev_time = _active_curr_time = __tv2msec(tv); + sfd.total_active_time += + __delta32(_active_curr_time, _active_prev_time); + SGXFREQ_TRACE("A->I TA:= %lums \tdA: %lums \tTI: %lums \tdI: %lums\n", + sfd.total_active_time, + __delta32(_active_curr_time, _active_prev_time), + sfd.total_active_time, + (unsigned long)0); + } + else + { + _idle_curr_time = __tv2msec(tv); + sfd.total_idle_time += __delta32( + _idle_curr_time, _idle_prev_time); + SGXFREQ_TRACE("I->I TA:= %lums \tdA: %lums \tTI: %lums \tdI: %lums\n", + sfd.total_active_time, + (unsigned long)0, + sfd.total_idle_time, + __delta32(_idle_curr_time, _idle_prev_time)); + _idle_prev_time = _idle_curr_time; + } + } +} + +int sgxfreq_init(struct device *dev) +{ + int i, ret; + unsigned long freq; + struct opp *opp; + struct timeval tv; + + sfd.dev = dev; + if (!sfd.dev) + return -EINVAL; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + sfd.pdata = (struct gpu_platform_data *)dev->platform_data; + if (!sfd.pdata || + !sfd.pdata->opp_get_opp_count || + !sfd.pdata->opp_find_freq_ceil || + !sfd.pdata->device_scale) + return -EINVAL; +#endif + + rcu_read_lock(); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + sfd.freq_cnt = sfd.pdata->opp_get_opp_count(dev); +#else + ret = of_init_opp_table(dev); + if (ret) { + pr_err("sgxfreq: failed to init OPP table: %d\n", ret); + return -EINVAL; + } + + sfd.freq_cnt = opp_get_opp_count(dev); +#endif + if (sfd.freq_cnt < 1) { + rcu_read_unlock(); + return -ENODEV; + } + + sfd.freq_list = kmalloc(sfd.freq_cnt * sizeof(unsigned long), GFP_ATOMIC); + if (!sfd.freq_list) { + rcu_read_unlock(); + return -ENOMEM; + } + + freq = 0; + for (i = 0; i < sfd.freq_cnt; i++) { +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + opp = sfd.pdata->opp_find_freq_ceil(dev, &freq); +#else + opp = opp_find_freq_ceil(dev, &freq); +#endif + if (IS_ERR_OR_NULL(opp)) { + rcu_read_unlock(); + kfree(sfd.freq_list); + return -ENODEV; + } + sfd.freq_list[i] = freq; + freq++; + } + rcu_read_unlock(); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) + sfd.core_clk = devm_clk_get(dev, "dpll_core_h14x2_ck"); + if (IS_ERR(sfd.core_clk)) { + ret = PTR_ERR(sfd.core_clk); + pr_err("sgxfreq: failed to get core clock: %d\n", ret); + return ret; + } + + sfd.gpu_clk = devm_clk_get(dev, "dpll_gpu_m2_ck"); + if (IS_ERR(sfd.gpu_clk)) { + ret = PTR_ERR(sfd.gpu_clk); + pr_err("sgxfreq: failed to get gpu clock: %d\n", ret); + return ret; + } + + sfd.per_clk = devm_clk_get(dev, "dpll_per_h14x2_ck"); + if (IS_ERR(sfd.per_clk)) { + ret = PTR_ERR(sfd.per_clk); + pr_err("sgxfreq: failed to get per clock: %d\n", ret); + return ret; + } + + sfd.gpu_core_clk = devm_clk_get(dev, "gpu_core_gclk_mux"); + if (IS_ERR(sfd.gpu_core_clk)) { + ret = PTR_ERR(sfd.gpu_core_clk); + pr_err("sgxfreq: failed to get gpu core clock: %d\n", ret); + return ret; + } + + sfd.gpu_hyd_clk = devm_clk_get(dev, "gpu_core_gclk_mux"); + if (IS_ERR(sfd.gpu_hyd_clk)) { + ret = PTR_ERR(sfd.gpu_hyd_clk); + pr_err("sgxfreq: failed to get gpu hyd clock: %d\n", ret); + return ret; + } + + sfd.gpu_reg = devm_regulator_get(dev, "gpu"); + if (IS_ERR(sfd.gpu_reg)) { + if (PTR_ERR(sfd.gpu_reg) == -EPROBE_DEFER) { + dev_err(dev, "gpu regulator not ready, retry\n"); + return -EPROBE_DEFER; + } + pr_err("sgxfreq: failed to get gpu regulator: %ld\n", PTR_ERR(sfd.gpu_reg)); + sfd.gpu_reg = NULL; + } + + ret = clk_set_parent(sfd.gpu_hyd_clk, sfd.core_clk); + if (ret != 0) { + pr_err("sgxfreq: failed to set gpu_hyd_clk parent: %d\n", ret); + } + + ret = clk_set_parent(sfd.gpu_core_clk, sfd.core_clk); + if (ret != 0) { + pr_err("sgxfreq: failed to set gpu_core_clk parent: %d\n", ret); + } +#endif + + mutex_init(&sfd.freq_mutex); + sfd.freq_limit = sfd.freq_list[sfd.freq_cnt - 1]; + sgxfreq_set_freq_request(sfd.freq_list[sfd.freq_cnt - 1]); + sfd.sgx_data.clk_on = false; + sfd.sgx_data.active = false; + + mutex_init(&sfd.gov_mutex); + INIT_LIST_HEAD(&sfd.gov_list); + + sgxfreq_kobj = kobject_create_and_add("sgxfreq", &sfd.dev->kobj); + ret = sysfs_create_files(sgxfreq_kobj, sgxfreq_attributes); + if (ret) { + kfree(sfd.freq_list); + return ret; + } + +#if (defined(CONFIG_THERMAL) || defined(CONFIG_THERMAL_FRAMEWORK)) + cool_init(); +#endif + + for (i = 0; sgxfreq_gov_init[i] != NULL; i++) + sgxfreq_gov_init[i](); + + if (sgxfreq_set_governor(SGXFREQ_DEFAULT_GOV_NAME)) { + kfree(sfd.freq_list); + return -ENODEV; + } + do_gettimeofday(&tv); + _idle_prev_time = _active_curr_time = _idle_curr_time = + _active_prev_time = __tv2msec(tv); + + return 0; +} + +int sgxfreq_deinit(void) +{ + int i; + + sgxfreq_set_governor(NULL); + + sgxfreq_set_freq_request(sfd.freq_list[0]); + +#if (defined(CONFIG_THERMAL) || defined(CONFIG_THERMAL_FRAMEWORK)) + cool_deinit(); +#endif + + for (i = 0; sgxfreq_gov_deinit[i] != NULL; i++) + sgxfreq_gov_deinit[i](); + + sysfs_remove_files(sgxfreq_kobj, sgxfreq_attributes); + kobject_put(sgxfreq_kobj); + + kfree(sfd.freq_list); + + return 0; +} + +int sgxfreq_register_governor(struct sgxfreq_governor *governor) +{ + if (!governor) + return -EINVAL; + + list_add(&governor->governor_list, &sfd.gov_list); + + return 0; +} + +void sgxfreq_unregister_governor(struct sgxfreq_governor *governor) +{ + if (!governor) + return; + + list_del(&governor->governor_list); +} + +int sgxfreq_set_governor(const char *name) +{ + int ret = 0; + struct sgxfreq_governor *new_gov = 0; + + if (name) { + new_gov = __find_governor(name); + if (!new_gov) + return -EINVAL; + } + + mutex_lock(&sfd.gov_mutex); + + if (sfd.gov && sfd.gov->gov_stop) + sfd.gov->gov_stop(); + + if (new_gov && new_gov->gov_start) + ret = new_gov->gov_start(&sfd.sgx_data); + + if (ret) { + if (sfd.gov && sfd.gov->gov_start) + sfd.gov->gov_start(&sfd.sgx_data); + return -ENODEV; + } + sfd.gov = new_gov; + + mutex_unlock(&sfd.gov_mutex); + + return 0; +} + +int sgxfreq_get_freq_list(unsigned long **pfreq_list) +{ + *pfreq_list = sfd.freq_list; + + return sfd.freq_cnt; +} + +unsigned long sgxfreq_get_freq_min(void) +{ + return sfd.freq_list[0]; +} + +unsigned long sgxfreq_get_freq_max(void) +{ + return sfd.freq_list[sfd.freq_cnt - 1]; +} + +unsigned long sgxfreq_get_freq_floor(unsigned long freq) +{ + int i; + unsigned long f = 0; + + for (i = sfd.freq_cnt - 1; i >= 0; i--) { + f = sfd.freq_list[i]; + if (f <= freq) + return f; + } + + return f; +} + +unsigned long sgxfreq_get_freq_ceil(unsigned long freq) +{ + int i; + unsigned long f = 0; + + for (i = 0; i < sfd.freq_cnt; i++) { + f = sfd.freq_list[i]; + if (f >= freq) + return f; + } + + return f; +} + +unsigned long sgxfreq_get_freq(void) +{ + return sfd.freq; +} + +unsigned long sgxfreq_get_freq_request(void) +{ + return sfd.freq_request; +} + +unsigned long sgxfreq_get_freq_limit(void) +{ + return sfd.freq_limit; +} + +unsigned long sgxfreq_set_freq_request(unsigned long freq_request) +{ + freq_request = sgxfreq_get_freq_ceil(freq_request); + + mutex_lock(&sfd.freq_mutex); + + sfd.freq_request = freq_request; + __set_freq(); + + mutex_unlock(&sfd.freq_mutex); + + return freq_request; +} + +unsigned long sgxfreq_set_freq_limit(unsigned long freq_limit) +{ + freq_limit = sgxfreq_get_freq_ceil(freq_limit); + + mutex_lock(&sfd.freq_mutex); + + sfd.freq_limit = freq_limit; + __set_freq(); + + mutex_unlock(&sfd.freq_mutex); + + return freq_limit; +} + +unsigned long sgxfreq_get_total_active_time(void) +{ + __update_timing_info(sfd.sgx_data.active); + return sfd.total_active_time; +} + +unsigned long sgxfreq_get_total_idle_time(void) +{ + __update_timing_info(sfd.sgx_data.active); + return sfd.total_idle_time; +} + +/* + * sgx_clk_on, sgx_clk_off, sgx_active, and sgx_idle notifications are + * serialized by power lock. governor notif calls need sync with governor + * setting. + */ +void sgxfreq_notif_sgx_clk_on(void) +{ + sfd.sgx_data.clk_on = true; + + mutex_lock(&sfd.gov_mutex); + + if (sfd.gov && sfd.gov->sgx_clk_on) + sfd.gov->sgx_clk_on(); + + mutex_unlock(&sfd.gov_mutex); +} + +void sgxfreq_notif_sgx_clk_off(void) +{ + sfd.sgx_data.clk_on = false; + + mutex_lock(&sfd.gov_mutex); + + if (sfd.gov && sfd.gov->sgx_clk_off) + sfd.gov->sgx_clk_off(); + + mutex_unlock(&sfd.gov_mutex); +} + + +void sgxfreq_notif_sgx_active(void) +{ + __update_timing_info(true); + + sfd.sgx_data.active = true; + + mutex_lock(&sfd.gov_mutex); + + if (sfd.gov && sfd.gov->sgx_active) + sfd.gov->sgx_active(); + + mutex_unlock(&sfd.gov_mutex); + +} + +void sgxfreq_notif_sgx_idle(void) +{ + + __update_timing_info(false); + + sfd.sgx_data.active = false; + + mutex_lock(&sfd.gov_mutex); + + if (sfd.gov && sfd.gov->sgx_idle) + sfd.gov->sgx_idle(); + + mutex_unlock(&sfd.gov_mutex); +} + +void sgxfreq_notif_sgx_frame_done(void) +{ + mutex_lock(&sfd.gov_mutex); + + if (sfd.gov && sfd.gov->sgx_frame_done) + sfd.gov->sgx_frame_done(); + + mutex_unlock(&sfd.gov_mutex); +} diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq.h b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq.h new file mode 100644 index 0000000..ff6fc88 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2012 Texas Instruments, Inc + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef SGXFREQ_H +#define SGXFREQ_H + +#include <linux/device.h> +#include <linux/time.h> + +#define SGXFREQ_NAME_LEN 16 + +//#define SGXFREQ_DEBUG_FTRACE +#if defined(SGXFREQ_DEBUG_FTRACE) +#define SGXFREQ_TRACE(...) trace_printk(__VA_ARGS__) +#else +#define SGXFREQ_TRACE(...) +#endif + +struct sgxfreq_sgx_data { + bool clk_on; + bool active; +}; + +struct sgxfreq_governor { + char name[SGXFREQ_NAME_LEN]; + int (*gov_start) (struct sgxfreq_sgx_data *data); + void (*gov_stop) (void); + void (*sgx_clk_on) (void); + void (*sgx_clk_off) (void); + void (*sgx_active) (void); + void (*sgx_idle) (void); + void (*sgx_frame_done) (void); + struct list_head governor_list; +}; + +/* sgxfreq_init must be called before any other api */ +int sgxfreq_init(struct device *dev); +int sgxfreq_deinit(void); + +int sgxfreq_register_governor(struct sgxfreq_governor *governor); +void sgxfreq_unregister_governor(struct sgxfreq_governor *governor); + +int sgxfreq_set_governor(const char *name); + +int sgxfreq_get_freq_list(unsigned long **pfreq_list); + +unsigned long sgxfreq_get_freq_min(void); +unsigned long sgxfreq_get_freq_max(void); + +unsigned long sgxfreq_get_freq_floor(unsigned long freq); +unsigned long sgxfreq_get_freq_ceil(unsigned long freq); + +unsigned long sgxfreq_get_freq(void); +unsigned long sgxfreq_get_freq_request(void); +unsigned long sgxfreq_get_freq_limit(void); + +unsigned long sgxfreq_set_freq_request(unsigned long freq_request); +unsigned long sgxfreq_set_freq_limit(unsigned long freq_limit); + +unsigned long sgxfreq_get_total_active_time(void); +unsigned long sgxfreq_get_total_idle_time(void); + +/* Helper functions */ +static inline unsigned long __tv2msec(struct timeval tv) +{ + return (tv.tv_sec * 1000) + (tv.tv_usec / 1000); +} + +static inline unsigned long __delta32(unsigned long a, unsigned long b) +{ + if (a >= b) + return a - b; + else + return 1 + (0xFFFFFFFF - b) + a; +} + +/* External notifications to sgxfreq */ +void sgxfreq_notif_sgx_clk_on(void); +void sgxfreq_notif_sgx_clk_off(void); +void sgxfreq_notif_sgx_active(void); +void sgxfreq_notif_sgx_idle(void); +void sgxfreq_notif_sgx_frame_done(void); + +#endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_activeidle.c b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_activeidle.c new file mode 100644 index 0000000..45159d7 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_activeidle.c @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2012 Texas Instruments, Inc + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/sysfs.h> +#include "sgxfreq.h" + +static int activeidle_start(struct sgxfreq_sgx_data *data); +static void activeidle_stop(void); +static void activeidle_sgx_active(void); +static void activeidle_sgx_idle(void); + +static struct activeidle_data { + unsigned long freq_active; + unsigned long freq_idle; + struct mutex mutex; + bool sgx_active; +} aid; + +static struct sgxfreq_governor activeidle_gov = { + .name = "activeidle", + .gov_start = activeidle_start, + .gov_stop = activeidle_stop, + .sgx_active = activeidle_sgx_active, + .sgx_idle = activeidle_sgx_idle, +}; + +/*********************** begin sysfs interface ***********************/ + +extern struct kobject *sgxfreq_kobj; + +static ssize_t show_freq_active(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "%lu\n", aid.freq_active); +} + +static ssize_t store_freq_active(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int ret; + unsigned long freq; + + ret = sscanf(buf, "%lu", &freq); + if (ret != 1) + return -EINVAL; + + freq = sgxfreq_get_freq_ceil(freq); + + mutex_lock(&aid.mutex); + + aid.freq_active = freq; + if (aid.sgx_active) + sgxfreq_set_freq_request(aid.freq_active); + + mutex_unlock(&aid.mutex); + + return count; +} + +static ssize_t show_freq_idle(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "%lu\n", aid.freq_idle); +} + +static ssize_t store_freq_idle(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + int ret; + unsigned long freq; + + ret = sscanf(buf, "%lu", &freq); + if (ret != 1) + return -EINVAL; + + freq = sgxfreq_get_freq_floor(freq); + + mutex_lock(&aid.mutex); + + aid.freq_idle = freq; + if (!aid.sgx_active) + sgxfreq_set_freq_request(aid.freq_idle); + + mutex_unlock(&aid.mutex); + + return count; +} +static DEVICE_ATTR(freq_active, 0644, show_freq_active, store_freq_active); +static DEVICE_ATTR(freq_idle, 0644, show_freq_idle, store_freq_idle); + +static struct attribute *activeidle_attributes[] = { + &dev_attr_freq_active.attr, + &dev_attr_freq_idle.attr, + NULL +}; + +static struct attribute_group activeidle_attr_group = { + .attrs = activeidle_attributes, + .name = "activeidle", +}; + +/************************ end sysfs interface ************************/ + +int activeidle_init(void) +{ + int ret; + + mutex_init(&aid.mutex); + + ret = sgxfreq_register_governor(&activeidle_gov); + if (ret) + return ret; + + aid.freq_idle = sgxfreq_get_freq_min(); + aid.freq_active = sgxfreq_get_freq_max(); + + return 0; +} + +int activeidle_deinit(void) +{ + return 0; +} + +static int activeidle_start(struct sgxfreq_sgx_data *data) +{ + int ret; + + aid.sgx_active = data->active; + + ret = sysfs_create_group(sgxfreq_kobj, &activeidle_attr_group); + if (ret) + return ret; + + if (aid.sgx_active) + sgxfreq_set_freq_request(aid.freq_active); + else + sgxfreq_set_freq_request(aid.freq_idle); + + return 0; +} + +static void activeidle_stop(void) +{ + sysfs_remove_group(sgxfreq_kobj, &activeidle_attr_group); +} + +static void activeidle_sgx_active(void) +{ + mutex_lock(&aid.mutex); + + aid.sgx_active = true; + sgxfreq_set_freq_request(aid.freq_active); + + mutex_unlock(&aid.mutex); +} + +static void activeidle_sgx_idle(void) +{ + mutex_lock(&aid.mutex); + + aid.sgx_active = false; + sgxfreq_set_freq_request(aid.freq_idle); + + mutex_unlock(&aid.mutex); +} diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_cool.c b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_cool.c new file mode 100644 index 0000000..a58eb39 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_cool.c @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2012 Texas Instruments, Inc + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) + +#include <linux/thermal.h> + +static struct cool_data { + int freq_cnt; + unsigned long *freq_list; + unsigned long state; + struct thermal_cooling_device *cdev; +} cd; + +static int sgxfreq_get_max_state(struct thermal_cooling_device *cdev, + unsigned long *state) +{ + *state = cd.freq_cnt - 1; + return 0; +} + +static int sgxfreq_get_cur_state(struct thermal_cooling_device *cdev, + unsigned long *state) +{ + *state = cd.state; + return 0; +} + +static int sgxfreq_set_cur_state(struct thermal_cooling_device *cdev, + unsigned long state) +{ + int freq_max_index, freq_limit_index; + + freq_max_index = cd.freq_cnt - 1; + + freq_limit_index = freq_max_index - (unsigned int)state; + + if (freq_limit_index < 0) + freq_limit_index = 0; + + sgxfreq_set_freq_limit(cd.freq_list[freq_limit_index]); + + cd.state = state; + return 0; +} + + +static const struct thermal_cooling_device_ops sgxfreq_cooling_ops = { + .get_max_state = sgxfreq_get_max_state, + .get_cur_state = sgxfreq_get_cur_state, + .set_cur_state = sgxfreq_set_cur_state, +}; + +int cool_init(void) +{ + int ret; + struct thermal_zone_device *tz; + + cd.freq_cnt = sgxfreq_get_freq_list(&cd.freq_list); + if (!cd.freq_cnt || !cd.freq_list) + return -EINVAL; + + cd.cdev = thermal_cooling_device_register("gpu", (void *)NULL, &sgxfreq_cooling_ops); + + if(IS_ERR(cd.cdev)) { + pr_err("sgxfreq: Error while regeistering cooling device: %ld\n", PTR_ERR(cd.cdev)); + return -1; + } + + tz = thermal_zone_get_zone_by_name("gpu"); + if(IS_ERR(tz)) { + pr_err("sgxfreq: Error while trying to obtain zone device: %ld\n", PTR_ERR(tz)); + return -1; + } + + ret = thermal_zone_bind_cooling_device(tz, 0, cd.cdev, THERMAL_NO_LIMIT, THERMAL_NO_LIMIT); + if (ret) + { + pr_err("sgxfreq: Error binding cooling device: %d\n", ret); + } + + return 0; +} + +void cool_deinit(void) +{ + thermal_cooling_device_unregister(cd.cdev); +} +#else //if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) +#include <linux/thermal_framework.h> + +static int cool_device(struct thermal_dev *dev, int cooling_level); + +static struct cool_data { + int freq_cnt; + unsigned long *freq_list; +} cd; + +static struct thermal_dev_ops cool_dev_ops = { + .cool_device = cool_device, +}; + +static struct thermal_dev cool_dev = { + .name = "gpu_cooling.0", + .domain_name = "gpu", + .dev_ops = &cool_dev_ops, +}; + +static struct thermal_dev case_cool_dev = { + .name = "gpu_cooling.1", + .domain_name = "case", + .dev_ops = &cool_dev_ops, +}; + +static unsigned int gpu_cooling_level; +#if defined(CONFIG_CASE_TEMP_GOVERNOR) +static unsigned int case_cooling_level; +#endif + +int cool_init(void) +{ + int ret; + cd.freq_cnt = sgxfreq_get_freq_list(&cd.freq_list); + if (!cd.freq_cnt || !cd.freq_list) + return -EINVAL; + + ret = thermal_cooling_dev_register(&cool_dev); + if (ret) + return ret; + + return thermal_cooling_dev_register(&case_cool_dev); +} + +void cool_deinit(void) +{ + thermal_cooling_dev_unregister(&cool_dev); + thermal_cooling_dev_unregister(&case_cool_dev); +} + +static int cool_device(struct thermal_dev *dev, int cooling_level) +{ + int freq_max_index, freq_limit_index; + +#if defined(CONFIG_CASE_TEMP_GOVERNOR) + if (!strcmp(dev->domain_name, "case")) + { + int tmp = 0; + tmp = cooling_level - case_subzone_number; + if (tmp < 0) + tmp = 0; + case_cooling_level = tmp; + } + else +#endif + { + gpu_cooling_level = cooling_level; + } + + freq_max_index = cd.freq_cnt - 1; +#if defined(CONFIG_CASE_TEMP_GOVERNOR) + if (case_cooling_level > gpu_cooling_level) + { + freq_limit_index = freq_max_index - case_cooling_level; + } + else +#endif + { + freq_limit_index = freq_max_index - gpu_cooling_level; + } + + if (freq_limit_index < 0) + freq_limit_index = 0; + + sgxfreq_set_freq_limit(cd.freq_list[freq_limit_index]); + + return 0; +} +#endif //if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_on3demand.c b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_on3demand.c new file mode 100644 index 0000000..70764b1 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_on3demand.c @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2012 Texas Instruments, Inc + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/sysfs.h> +#include <linux/vmalloc.h> +#include <asm/io.h> +#include "sgxfreq.h" + +static int on3demand_start(struct sgxfreq_sgx_data *data); +static void on3demand_stop(void); +static void on3demand_predict(void); + + +static struct sgxfreq_governor on3demand_gov = { + .name = "on3demand", + .gov_start = on3demand_start, + .gov_stop = on3demand_stop, + .sgx_frame_done = on3demand_predict +}; + +static struct on3demand_data { + unsigned int load; + unsigned int up_threshold; + unsigned int down_threshold; + unsigned int history_size; + unsigned long prev_total_idle; + unsigned long prev_total_active; + unsigned int low_load_cnt; + struct mutex mutex; +} odd; + +#define ON3DEMAND_DEFAULT_UP_THRESHOLD 80 +#define ON3DEMAND_DEFAULT_DOWN_THRESHOLD 30 +#define ON3DEMAND_DEFAULT_HISTORY_SIZE_THRESHOLD 5 + +/*FIXME: This should be dynamic and queried from platform */ +#define ON3DEMAND_FRAME_DONE_DEADLINE_MS 16 + + +/*********************** begin sysfs interface ***********************/ + +extern struct kobject *sgxfreq_kobj; + +static ssize_t show_down_threshold(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%u\n", odd.down_threshold); +} + +static ssize_t store_down_threshold(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + unsigned int thres; + + ret = sscanf(buf, "%u", &thres); + if (ret != 1) + return -EINVAL; + + mutex_lock(&odd.mutex); + + if (thres <= 100) { + odd.down_threshold = thres; + odd.low_load_cnt = 0; + } else { + return -EINVAL; + } + + mutex_unlock(&odd.mutex); + + return count; +} + +static ssize_t show_up_threshold(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%u\n", odd.up_threshold); +} + +static ssize_t store_up_threshold(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + unsigned int thres; + + ret = sscanf(buf, "%u", &thres); + if (ret != 1) + return -EINVAL; + + mutex_lock(&odd.mutex); + + if (thres <= 100) { + odd.up_threshold = thres; + odd.low_load_cnt = 0; + } else { + return -EINVAL; + } + + mutex_unlock(&odd.mutex); + + return count; +} + +static ssize_t show_history_size(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%u\n", odd.history_size); +} + +static ssize_t store_history_size(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + unsigned int size; + + ret = sscanf(buf, "%u", &size); + if (ret != 1) + return -EINVAL; + + mutex_lock(&odd.mutex); + + if (size >= 1) { + odd.history_size = size; + odd.low_load_cnt = 0; + } else { + return -EINVAL; + } + + mutex_unlock(&odd.mutex); + + return count; +} + +static ssize_t show_load(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%u\n", odd.load); +} + +static DEVICE_ATTR(down_threshold, 0644, + show_down_threshold, store_down_threshold); +static DEVICE_ATTR(up_threshold, 0644, + show_up_threshold, store_up_threshold); +static DEVICE_ATTR(history_size, 0644, + show_history_size, store_history_size); +static DEVICE_ATTR(load, 0444, + show_load, NULL); + +static struct attribute *on3demand_attributes[] = { + &dev_attr_down_threshold.attr, + &dev_attr_up_threshold.attr, + &dev_attr_history_size.attr, + &dev_attr_load.attr, + NULL +}; + +static struct attribute_group on3demand_attr_group = { + .attrs = on3demand_attributes, + .name = "on3demand", +}; +/************************ end sysfs interface ************************/ + +int on3demand_init(void) +{ + int ret; + + mutex_init(&odd.mutex); + + ret = sgxfreq_register_governor(&on3demand_gov); + if (ret) + return ret; + + return 0; +} + +int on3demand_deinit(void) +{ + return 0; +} + +static int on3demand_start(struct sgxfreq_sgx_data *data) +{ + int ret; + + odd.load = 0; + odd.up_threshold = ON3DEMAND_DEFAULT_UP_THRESHOLD; + odd.down_threshold = ON3DEMAND_DEFAULT_DOWN_THRESHOLD; + odd.history_size = ON3DEMAND_DEFAULT_HISTORY_SIZE_THRESHOLD; + odd.prev_total_active = 0; + odd.prev_total_idle = 0; + odd.low_load_cnt = 0; + + ret = sysfs_create_group(sgxfreq_kobj, &on3demand_attr_group); + if (ret) + return ret; + + return 0; +} + +static void on3demand_stop(void) +{ + sysfs_remove_group(sgxfreq_kobj, &on3demand_attr_group); +} + +static void on3demand_predict(void) +{ + static unsigned short first_sample = 1; + unsigned long total_active, delta_active; + unsigned long total_idle, delta_idle; + unsigned long freq; + + if (first_sample == 1) { + first_sample = 0; + odd.prev_total_active = sgxfreq_get_total_active_time(); + odd.prev_total_idle = sgxfreq_get_total_idle_time(); + return; + } + + /* Sample new active and idle times */ + total_active = sgxfreq_get_total_active_time(); + total_idle = sgxfreq_get_total_idle_time(); + + /* Compute load */ + delta_active = __delta32(total_active, odd.prev_total_active); + delta_idle = __delta32(total_idle, odd.prev_total_idle); + + /* + * If SGX was active for longer than frame display time (1/fps), + * scale to highest possible frequency. + */ + if (delta_active > ON3DEMAND_FRAME_DONE_DEADLINE_MS) { + odd.low_load_cnt = 0; + sgxfreq_set_freq_request(sgxfreq_get_freq_max()); + } + + if ((delta_active + delta_idle)) + odd.load = (100 * delta_active / (delta_active + delta_idle)); + odd.prev_total_active = total_active; + odd.prev_total_idle = total_idle; + + /* Scale GPU frequency on purpose */ + if (odd.load >= odd.up_threshold) { + odd.low_load_cnt = 0; + sgxfreq_set_freq_request(sgxfreq_get_freq_max()); + } else if (odd.load <= odd.down_threshold) { + if (odd.low_load_cnt == odd.history_size) { + /* Convert load to frequency */ + freq = (sgxfreq_get_freq() * odd.load) / 100; + sgxfreq_set_freq_request(freq); + odd.low_load_cnt = 0; + } else { + odd.low_load_cnt++; + } + } else { + odd.low_load_cnt = 0; + } +} diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_onoff.c b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_onoff.c new file mode 100644 index 0000000..39dd3fc --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_onoff.c @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2012 Texas Instruments, Inc + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/sysfs.h> +#include "sgxfreq.h" + +static int onoff_start(struct sgxfreq_sgx_data *data); +static void onoff_stop(void); +static void onoff_sgx_clk_on(void); +static void onoff_sgx_clk_off(void); + +static struct onoff_data { + unsigned long freq_off; + unsigned long freq_on; + struct mutex mutex; + bool sgx_clk_on; +} ood; + +static struct sgxfreq_governor onoff_gov = { + .name = "onoff", + .gov_start = onoff_start, + .gov_stop = onoff_stop, + .sgx_clk_on = onoff_sgx_clk_on, + .sgx_clk_off = onoff_sgx_clk_off, +}; + +/*********************** begin sysfs interface ***********************/ + +extern struct kobject *sgxfreq_kobj; + +static ssize_t show_freq_on(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "%lu\n", ood.freq_on); +} + +static ssize_t store_freq_on(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + int ret; + unsigned long freq; + + ret = sscanf(buf, "%lu", &freq); + if (ret != 1) + return -EINVAL; + + freq = sgxfreq_get_freq_ceil(freq); + + mutex_lock(&ood.mutex); + + ood.freq_on = freq; + if (ood.sgx_clk_on) + sgxfreq_set_freq_request(ood.freq_on); + + mutex_unlock(&ood.mutex); + + return count; +} + +static ssize_t show_freq_off(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "%lu\n", ood.freq_off); +} + +static ssize_t store_freq_off(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + int ret; + unsigned long freq; + + ret = sscanf(buf, "%lu", &freq); + if (ret != 1) + return -EINVAL; + + freq = sgxfreq_get_freq_floor(freq); + + mutex_lock(&ood.mutex); + + ood.freq_off = freq; + if (!ood.sgx_clk_on) + sgxfreq_set_freq_request(ood.freq_off); + + mutex_unlock(&ood.mutex); + + return count; +} +static DEVICE_ATTR(freq_on, 0644, show_freq_on, store_freq_on); +static DEVICE_ATTR(freq_off, 0644, show_freq_off, store_freq_off); + +static struct attribute *onoff_attributes[] = { + &dev_attr_freq_on.attr, + &dev_attr_freq_off.attr, + NULL +}; + +static struct attribute_group onoff_attr_group = { + .attrs = onoff_attributes, + .name = "onoff", +}; + +/************************ end sysfs interface ************************/ + +int onoff_init(void) +{ + int ret; + + mutex_init(&ood.mutex); + + ret = sgxfreq_register_governor(&onoff_gov); + if (ret) + return ret; + + ood.freq_off = sgxfreq_get_freq_min(); + ood.freq_on = sgxfreq_get_freq_max(); + + return 0; +} + +int onoff_deinit(void) +{ + return 0; +} + +static int onoff_start(struct sgxfreq_sgx_data *data) +{ + int ret; + + ood.sgx_clk_on = data->clk_on; + + ret = sysfs_create_group(sgxfreq_kobj, &onoff_attr_group); + if (ret) + return ret; + + if (ood.sgx_clk_on) + sgxfreq_set_freq_request(ood.freq_on); + else + sgxfreq_set_freq_request(ood.freq_off); + + return 0; +} + +static void onoff_stop(void) +{ + sysfs_remove_group(sgxfreq_kobj, &onoff_attr_group); +} + +static void onoff_sgx_clk_on(void) +{ + mutex_lock(&ood.mutex); + + ood.sgx_clk_on = true; + sgxfreq_set_freq_request(ood.freq_on); + + mutex_unlock(&ood.mutex); +} + +static void onoff_sgx_clk_off(void) +{ + mutex_lock(&ood.mutex); + + ood.sgx_clk_on = false; + sgxfreq_set_freq_request(ood.freq_off); + + mutex_unlock(&ood.mutex); +} + diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_userspace.c b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_userspace.c new file mode 100644 index 0000000..aff6087 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sgxfreq_userspace.c @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2012 Texas Instruments, Inc + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/sysfs.h> +#include "sgxfreq.h" + + +static int userspace_start(struct sgxfreq_sgx_data *data); +static void userspace_stop(void); + + +static struct sgxfreq_governor userspace_gov = { + .name = "userspace", + .gov_start = userspace_start, + .gov_stop = userspace_stop, +}; + + +static struct userspace_data { + unsigned long freq_user; /* in Hz */ +} usd; + + +/*********************** begin sysfs interface ***********************/ + +extern struct kobject *sgxfreq_kobj; + + +static ssize_t show_frequency_set(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "%lu\n", usd.freq_user); +} + + +static ssize_t store_frequency_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + unsigned long freq; + + ret = sscanf(buf, "%lu", &freq); + if (ret != 1) + return -EINVAL; + + if (freq > sgxfreq_get_freq_max()) + freq = sgxfreq_get_freq_max(); + usd.freq_user = sgxfreq_set_freq_request(freq); + trace_printk("USERSPACE: new freq=%luHz.\n", usd.freq_user); + + return count; +} + + +static DEVICE_ATTR(frequency_set, 0644, + show_frequency_set, store_frequency_set); + + +static struct attribute *userspace_attributes[] = { + &dev_attr_frequency_set.attr, + NULL +}; + + +static struct attribute_group userspace_attr_group = { + .attrs = userspace_attributes, + .name = "userspace", +}; + +/************************ end sysfs interface ************************/ + + +int userspace_init(void) +{ + int ret; + + ret = sgxfreq_register_governor(&userspace_gov); + if (ret) + return ret; + return 0; +} + + +int userspace_deinit(void) +{ + return 0; +} + + +static int userspace_start(struct sgxfreq_sgx_data *data) +{ + int ret; + + usd.freq_user = sgxfreq_get_freq(); + + ret = sysfs_create_group(sgxfreq_kobj, &userspace_attr_group); + if (ret) + return ret; + + trace_printk("USERSPACE: started.\n"); + + return 0; +} + + +static void userspace_stop(void) +{ + sysfs_remove_group(sgxfreq_kobj, &userspace_attr_group); + + trace_printk("USERSPACE: stopped.\n"); +} diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysconfig.c b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysconfig.c new file mode 100644 index 0000000..36384bc --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysconfig.c @@ -0,0 +1,1278 @@ +/*************************************************************************/ /*! +@Title System Configuration +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@Description System Configuration functions +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#include "sysconfig.h" +#include "services_headers.h" +#include "kerneldisplay.h" +#include "oemfuncs.h" +#include "sgxinfo.h" +#include "sgxinfokm.h" +#include "syslocal.h" + +#include "ocpdefs.h" + +/* top level system data anchor point*/ +SYS_DATA* gpsSysData = (SYS_DATA*)IMG_NULL; +SYS_DATA gsSysData; + +static SYS_SPECIFIC_DATA gsSysSpecificData; +SYS_SPECIFIC_DATA *gpsSysSpecificData; + +/* SGX structures */ +static IMG_UINT32 gui32SGXDeviceID; +static SGX_DEVICE_MAP gsSGXDeviceMap; +static PVRSRV_DEVICE_NODE *gpsSGXDevNode; + + +#if defined(NO_HARDWARE) || defined(SGX_OCP_REGS_ENABLED) +static IMG_CPU_VIRTADDR gsSGXRegsCPUVAddr; +#endif + +#if defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) +extern struct platform_device *gpsPVRLDMDev; +#endif + +IMG_UINT32 PVRSRV_BridgeDispatchKM(IMG_UINT32 Ioctl, + IMG_BYTE *pInBuf, + IMG_UINT32 InBufLen, + IMG_BYTE *pOutBuf, + IMG_UINT32 OutBufLen, + IMG_UINT32 *pdwBytesTransferred); + +#if defined(SGX_OCP_REGS_ENABLED) + +static IMG_CPU_VIRTADDR gpvOCPRegsLinAddr; + +static PVRSRV_ERROR EnableSGXClocksWrap(SYS_DATA *psSysData) +{ + PVRSRV_ERROR eError = EnableSGXClocks(psSysData); + +#if !defined(SGX_OCP_NO_INT_BYPASS) + if(eError == PVRSRV_OK) + { + OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_SYSCONFIG, 0x14); + OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_DEBUG_CONFIG, EUR_CR_OCP_DEBUG_CONFIG_THALIA_INT_BYPASS_MASK); + } +#endif + return eError; +} + +#else /* defined(SGX_OCP_REGS_ENABLED) */ + +static INLINE PVRSRV_ERROR EnableSGXClocksWrap(SYS_DATA *psSysData) +{ + return EnableSGXClocks(psSysData); +} + +#endif /* defined(SGX_OCP_REGS_ENABLED) */ + +static INLINE PVRSRV_ERROR EnableSystemClocksWrap(SYS_DATA *psSysData) +{ + PVRSRV_ERROR eError = EnableSystemClocks(psSysData); + +#if !defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + if(eError == PVRSRV_OK) + { + /* + * The SGX Clocks are enabled separately if active power + * management is enabled. + */ + eError = EnableSGXClocksWrap(psSysData); + if (eError != PVRSRV_OK) + { + DisableSystemClocks(psSysData); + } + } +#endif + + return eError; +} + +/*! +****************************************************************************** + + @Function SysLocateDevices + + @Description Specifies devices in the systems memory map + + @Input psSysData - sys data + + @Return PVRSRV_ERROR + +******************************************************************************/ +static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData) +{ +#if defined(NO_HARDWARE) + PVRSRV_ERROR eError; + IMG_CPU_PHYADDR sCpuPAddr; +#else +#if defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) + struct resource *dev_res; + int dev_irq; +#endif +#endif + + PVR_UNREFERENCED_PARAMETER(psSysData); + + /* SGX Device: */ + gsSGXDeviceMap.ui32Flags = 0x0; + +#if defined(NO_HARDWARE) + /* + * For no hardware, allocate some contiguous memory for the + * register block. + */ + + /* Registers */ + gsSGXDeviceMap.ui32RegsSize = SYS_OMAP_SGX_REGS_SIZE; + + eError = OSBaseAllocContigMemory(gsSGXDeviceMap.ui32RegsSize, + &gsSGXRegsCPUVAddr, + &sCpuPAddr); + if(eError != PVRSRV_OK) + { + return eError; + } + gsSGXDeviceMap.sRegsCpuPBase = sCpuPAddr; + gsSGXDeviceMap.sRegsSysPBase = SysCpuPAddrToSysPAddr(gsSGXDeviceMap.sRegsCpuPBase); +#if defined(__linux__) + /* Indicate the registers are already mapped */ + gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr; +#else + /* + * FIXME: Could we just use the virtual address returned by + * OSBaseAllocContigMemory? + */ + gsSGXDeviceMap.pvRegsCpuVBase = IMG_NULL; +#endif + + OSMemSet(gsSGXRegsCPUVAddr, 0, gsSGXDeviceMap.ui32RegsSize); + + /* + device interrupt IRQ + Note: no interrupts available on no hardware system + */ + gsSGXDeviceMap.ui32IRQ = 0; + +#else /* defined(NO_HARDWARE) */ +#if defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) + /* get the resource and IRQ through platform resource API */ + dev_res = platform_get_resource(gpsPVRLDMDev, IORESOURCE_MEM, 0); + if (dev_res == NULL) + { + PVR_DPF((PVR_DBG_ERROR, "%s: platform_get_resource failed", __FUNCTION__)); + return PVRSRV_ERROR_INVALID_DEVICE; + } + + dev_irq = platform_get_irq(gpsPVRLDMDev, 0); + if (dev_irq < 0) + { + PVR_DPF((PVR_DBG_ERROR, "%s: platform_get_irq failed (%d)", __FUNCTION__, -dev_irq)); + return PVRSRV_ERROR_INVALID_DEVICE; + } + + gsSGXDeviceMap.sRegsSysPBase.uiAddr = dev_res->start; + gsSGXDeviceMap.sRegsCpuPBase = + SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase); + PVR_TRACE(("SGX register base: 0x%lx", (unsigned long)gsSGXDeviceMap.sRegsCpuPBase.uiAddr)); + +#if defined(SGX544) && defined(SGX_FEATURE_MP) + /* FIXME: Workaround due to HWMOD change. Otherwise this region is too small. */ + gsSGXDeviceMap.ui32RegsSize = SYS_OMAP_SGX_REGS_SIZE; +#else + gsSGXDeviceMap.ui32RegsSize = (unsigned int)(dev_res->end - dev_res->start); +#endif + PVR_TRACE(("SGX register size: %d",gsSGXDeviceMap.ui32RegsSize)); + + gsSGXDeviceMap.ui32IRQ = dev_irq; + PVR_TRACE(("SGX IRQ: %d", gsSGXDeviceMap.ui32IRQ)); +#else /* defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) */ + gsSGXDeviceMap.sRegsSysPBase.uiAddr = SYS_OMAP_SGX_REGS_SYS_PHYS_BASE; + gsSGXDeviceMap.sRegsCpuPBase = SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase); + gsSGXDeviceMap.ui32RegsSize = SYS_OMAP_SGX_REGS_SIZE; + + gsSGXDeviceMap.ui32IRQ = SYS_OMAP_SGX_IRQ; + +#endif /* defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) */ +#if defined(SGX_OCP_REGS_ENABLED) + gsSGXRegsCPUVAddr = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase, + gsSGXDeviceMap.ui32RegsSize, + PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, + IMG_NULL); + + if (gsSGXRegsCPUVAddr == IMG_NULL) + { + PVR_DPF((PVR_DBG_ERROR,"SysLocateDevices: Failed to map SGX registers")); + return PVRSRV_ERROR_BAD_MAPPING; + } + + /* Indicate the registers are already mapped */ + gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr; + gpvOCPRegsLinAddr = gsSGXRegsCPUVAddr; +#endif +#endif /* defined(NO_HARDWARE) */ + +#if defined(PDUMP) + { + /* initialise memory region name for pdumping */ + static IMG_CHAR pszPDumpDevName[] = "SGXMEM"; + gsSGXDeviceMap.pszPDumpDevName = pszPDumpDevName; + } +#endif + + /* add other devices here: */ + + + return PVRSRV_OK; +} + + +/*! +****************************************************************************** + + @Function SysCreateVersionString + + @Description Read the version string + + @Return IMG_CHAR * : Version string + +******************************************************************************/ +static IMG_CHAR *SysCreateVersionString(void) +{ + static IMG_CHAR aszVersionString[100]; + IMG_UINT32 ui32MaxStrLen; + SYS_DATA *psSysData; + IMG_UINT32 ui32SGXRevision; + IMG_INT32 i32Count; + + SysAcquireData(&psSysData); + + ui32SGXRevision = SGX_CORE_REV; + ui32MaxStrLen = 99; + + i32Count = OSSNPrintf(aszVersionString, ui32MaxStrLen + 1, + "SGX revision = %u", + (IMG_UINT)(ui32SGXRevision)); + if(i32Count == -1) + { + return IMG_NULL; + } + + return aszVersionString; +} + + +/*! +****************************************************************************** + + @Function SysInitialise + + @Description Initialises kernel services at 'driver load' time + + @Return PVRSRV_ERROR : + +******************************************************************************/ +PVRSRV_ERROR SysInitialise(IMG_VOID) +{ + IMG_UINT32 i; + PVRSRV_ERROR eError; + PVRSRV_DEVICE_NODE *psDeviceNode; +#if !defined(PVR_NO_OMAP_TIMER) + IMG_CPU_PHYADDR TimerRegPhysBase; +#endif +#if !defined(SGX_DYNAMIC_TIMING_INFO) + SGX_TIMING_INFORMATION* psTimingInfo; +#endif + gpsSysData = &gsSysData; + OSMemSet(gpsSysData, 0, sizeof(SYS_DATA)); + + gpsSysSpecificData = &gsSysSpecificData; + OSMemSet(gpsSysSpecificData, 0, sizeof(SYS_SPECIFIC_DATA)); + + gpsSysData->pvSysSpecificData = gpsSysSpecificData; + + eError = OSInitEnvData(&gpsSysData->pvEnvSpecificData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to setup env structure")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_ENVDATA); + + gpsSysData->ui32NumDevices = SYS_DEVICE_COUNT; + + /* init device ID's */ + for(i=0; i<SYS_DEVICE_COUNT; i++) + { + gpsSysData->sDeviceID[i].uiID = i; + gpsSysData->sDeviceID[i].bInUse = IMG_FALSE; + } + + gpsSysData->psDeviceNodeList = IMG_NULL; + gpsSysData->psQueueList = IMG_NULL; + + eError = SysInitialiseCommon(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed in SysInitialiseCommon")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + +#if !defined(SGX_DYNAMIC_TIMING_INFO) + /* Set up timing information*/ + psTimingInfo = &gsSGXDeviceMap.sTimingInfo; + psTimingInfo->ui32CoreClockSpeed = SYS_SGX_CLOCK_SPEED; + psTimingInfo->ui32HWRecoveryFreq = SYS_SGX_HWRECOVERY_TIMEOUT_FREQ; +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + psTimingInfo->bEnableActivePM = IMG_TRUE; +#else + psTimingInfo->bEnableActivePM = IMG_FALSE; +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + psTimingInfo->ui32ActivePowManLatencyms = SYS_SGX_ACTIVE_POWER_LATENCY_MS; + psTimingInfo->ui32uKernelFreq = SYS_SGX_PDS_TIMER_FREQ; +#endif + + /* + Setup the Source Clock Divider value + */ + gpsSysSpecificData->ui32SrcClockDiv = 3; + + /* + Locate the devices within the system, specifying + the physical addresses of each devices components + (regs, mem, ports etc.) + */ + eError = SysLocateDevices(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to locate devices")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV); + + eError = SysPMRuntimeRegister(); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register with OSPM!")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_PM_RUNTIME); + + eError = SysDvfsInitialize(gpsSysSpecificData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialize DVFS")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_DVFS_INIT); + + /* + Register devices with the system + This also sets up their memory maps/heaps + */ + eError = PVRSRVRegisterDevice(gpsSysData, SGXRegisterDevice, + DEVICE_SGX_INTERRUPT, &gui32SGXDeviceID); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register device!")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_REGDEV); + + /* + Once all devices are registered, specify the backing store + and, if required, customise the memory heap config + */ + psDeviceNode = gpsSysData->psDeviceNodeList; + while(psDeviceNode) + { + /* perform any OEM SOC address space customisations here */ + switch(psDeviceNode->sDevId.eDeviceType) + { + case PVRSRV_DEVICE_TYPE_SGX: + { + DEVICE_MEMORY_INFO *psDevMemoryInfo; + DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; + + /* + specify the backing store to use for the devices MMU PT/PDs + - the PT/PDs are always UMA in this system + */ + psDeviceNode->psLocalDevMemArena = IMG_NULL; + + /* useful pointers */ + psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo; + psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap; + + /* specify the backing store for all SGX heaps */ + for(i=0; i<psDevMemoryInfo->ui32HeapCount; i++) + { + psDeviceMemoryHeap[i].ui32Attribs |= PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG; + } + + gpsSGXDevNode = psDeviceNode; + gsSysSpecificData.psSGXDevNode = psDeviceNode; + + break; + } + default: + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to find SGX device node!")); + return PVRSRV_ERROR_INIT_FAILURE; + } + + /* advance to next device */ + psDeviceNode = psDeviceNode->psNext; + } + + eError = EnableSystemClocksWrap(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to Enable system clocks (%d)", eError)); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS); +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + eError = EnableSGXClocksWrap(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to Enable SGX clocks (%d)", eError)); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + + eError = PVRSRVInitialiseDevice(gui32SGXDeviceID); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise device!")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITDEV); + +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + /* SGX defaults to D3 power state */ + DisableSGXClocks(gpsSysData); +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + +#if !defined(PVR_NO_OMAP_TIMER) +#if defined(PVR_OMAP_TIMER_BASE_IN_SYS_SPEC_DATA) + TimerRegPhysBase = gsSysSpecificData.sTimerRegPhysBase; +#else + TimerRegPhysBase.uiAddr = SYS_OMAP_GP11TIMER_REGS_SYS_PHYS_BASE; +#endif + gpsSysData->pvSOCTimerRegisterKM = IMG_NULL; + gpsSysData->hSOCTimerRegisterOSMemHandle = 0; + if (TimerRegPhysBase.uiAddr != 0) + { + OSReservePhys(TimerRegPhysBase, + 4, + PVRSRV_HAP_MULTI_PROCESS|PVRSRV_HAP_UNCACHED, + IMG_NULL, + (IMG_VOID **)&gpsSysData->pvSOCTimerRegisterKM, + &gpsSysData->hSOCTimerRegisterOSMemHandle); + } +#endif /* !defined(PVR_NO_OMAP_TIMER) */ + + + return PVRSRV_OK; +} + +#if defined(CONFIG_OMAPLFB) +int OMAPLFBRegisterPVRDriver(void * pfnFuncTable); +#endif + +/*! +****************************************************************************** + + @Function SysFinalise + + @Description Final part of initialisation at 'driver load' time + + @Return PVRSRV_ERROR : + +******************************************************************************/ +PVRSRV_ERROR SysFinalise(IMG_VOID) +{ + PVRSRV_ERROR eError = PVRSRV_OK; + +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + eError = EnableSGXClocksWrap(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to Enable SGX clocks (%d)", eError)); + return eError; + } +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + + eError = OSInstallMISR(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to install MISR")); + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR); + +#if defined(SYS_USING_INTERRUPTS) + /* install a Device ISR */ + eError = OSInstallDeviceLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ, "SGX ISR", gpsSGXDevNode); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to install ISR")); + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR); +#if !defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + SysEnableSGXInterrupts(gpsSysData); +#endif +#endif /* defined(SYS_USING_INTERRUPTS) */ +#if defined(__linux__) || defined(__QNXNTO__) + /* Create a human readable version string for this system */ + gpsSysData->pszVersionString = SysCreateVersionString(); + if (!gpsSysData->pszVersionString) + { + PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to create a system version string")); + } + else + { + PVR_TRACE(("SysFinalise: Version string: %s", gpsSysData->pszVersionString)); + } +#endif + +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + /* SGX defaults to D3 power state */ + DisableSGXClocks(gpsSysData); +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + +#if defined(CONFIG_OMAPLFB) + if (OMAPLFBRegisterPVRDriver((void *)&PVRGetDisplayClassJTable) != 0) + { + PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to register PVR driver with omaplfb")); + return PVRSRV_ERROR_INIT_FAILURE; + } +#endif + + gpsSysSpecificData->bSGXInitComplete = IMG_TRUE; + + return eError; +} + + +/*! +****************************************************************************** + + @Function SysDeinitialise + + @Description De-initialises kernel services at 'driver unload' time + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData) +{ + PVRSRV_ERROR eError; + + PVR_UNREFERENCED_PARAMETER(psSysData); + + if(gpsSysData->pvSOCTimerRegisterKM) + { + OSUnReservePhys(gpsSysData->pvSOCTimerRegisterKM, + 4, + PVRSRV_HAP_MULTI_PROCESS|PVRSRV_HAP_UNCACHED, + gpsSysData->hSOCTimerRegisterOSMemHandle); + } + + +#if defined(SYS_USING_INTERRUPTS) + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) + { + eError = OSUninstallDeviceLISR(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallDeviceLISR failed")); + return eError; + } + } +#endif + + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR)) + { + eError = OSUninstallMISR(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallMISR failed")); + return eError; + } + } + + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITDEV)) + { +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + PVR_ASSERT(SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)); + /* Reenable SGX clocks whilst SGX is being deinitialised. */ + eError = EnableSGXClocksWrap(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: EnableSGXClocks failed")); + return eError; + } +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + + /* Deinitialise SGX */ + eError = PVRSRVDeinitialiseDevice(gui32SGXDeviceID); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device")); + return eError; + } + } + + /* Disable system clocks. Must happen after last access to hardware */ + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)) + { + DisableSystemClocks(gpsSysData); + } + + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_DVFS_INIT)) + { + eError = SysDvfsDeinitialize(gpsSysSpecificData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: Failed to de-init DVFS")); + gpsSysData = IMG_NULL; + return eError; + } + } + + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_PM_RUNTIME)) + { + eError = SysPMRuntimeUnregister(); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: Failed to unregister with OSPM!")); + gpsSysData = IMG_NULL; + return eError; + } + } + + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_ENVDATA)) + { + eError = OSDeInitEnvData(gpsSysData->pvEnvSpecificData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init env structure")); + return eError; + } + } + + SysDeinitialiseCommon(gpsSysData); + +#if defined(NO_HARDWARE) || defined(SGX_OCP_REGS_ENABLED) + if(gsSGXRegsCPUVAddr != IMG_NULL) + { +#if defined(NO_HARDWARE) + /* Free hardware resources. */ + OSBaseFreeContigMemory(SYS_OMAP_SGX_REGS_SIZE, gsSGXRegsCPUVAddr, gsSGXDeviceMap.sRegsCpuPBase); +#else +#if defined(SGX_OCP_REGS_ENABLED) + OSUnMapPhysToLin(gsSGXRegsCPUVAddr, + gsSGXDeviceMap.ui32RegsSize, + PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, + IMG_NULL); + + gpvOCPRegsLinAddr = IMG_NULL; +#endif +#endif /* defined(NO_HARDWARE) */ + gsSGXRegsCPUVAddr = IMG_NULL; + gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr; + } +#endif /* defined(NO_HARDWARE) || defined(SGX_OCP_REGS_ENABLED) */ + + + gpsSysSpecificData->ui32SysSpecificData = 0; + gpsSysSpecificData->bSGXInitComplete = IMG_FALSE; + + gpsSysData = IMG_NULL; + + return PVRSRV_OK; +} + + +/*! +****************************************************************************** + + @Function SysGetDeviceMemoryMap + + @Description returns a device address map for the specified device + + @Input eDeviceType - device type + @Input ppvDeviceMap - void ptr to receive device specific info. + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysGetDeviceMemoryMap(PVRSRV_DEVICE_TYPE eDeviceType, + IMG_VOID **ppvDeviceMap) +{ + + switch(eDeviceType) + { + case PVRSRV_DEVICE_TYPE_SGX: + { + /* just return a pointer to the structure */ + *ppvDeviceMap = (IMG_VOID*)&gsSGXDeviceMap; + + break; + } + default: + { + PVR_DPF((PVR_DBG_ERROR,"SysGetDeviceMemoryMap: unsupported device type")); + } + } + return PVRSRV_OK; +} + + +/*! +****************************************************************************** + @Function SysCpuPAddrToDevPAddr + + @Description Compute a device physical address from a cpu physical + address. Relevant when + + @Input cpu_paddr - cpu physical address. + @Input eDeviceType - device type required if DevPAddr + address spaces vary across devices + in the same system + @Return device physical address. + +******************************************************************************/ +IMG_DEV_PHYADDR SysCpuPAddrToDevPAddr(PVRSRV_DEVICE_TYPE eDeviceType, + IMG_CPU_PHYADDR CpuPAddr) +{ + IMG_DEV_PHYADDR DevPAddr; + + PVR_UNREFERENCED_PARAMETER(eDeviceType); + + /* Note: for UMA system we assume DevP == CpuP */ + DevPAddr.uiAddr = CpuPAddr.uiAddr; + + return DevPAddr; +} + +/*! +****************************************************************************** + @Function SysSysPAddrToCpuPAddr + + @Description Compute a cpu physical address from a system physical + address. + + @Input sys_paddr - system physical address. + @Return cpu physical address. + +******************************************************************************/ +IMG_CPU_PHYADDR SysSysPAddrToCpuPAddr (IMG_SYS_PHYADDR sys_paddr) +{ + IMG_CPU_PHYADDR cpu_paddr; + + /* This would only be an inequality if the CPU's MMU did not point to + sys address 0, ie. multi CPU system */ + cpu_paddr.uiAddr = sys_paddr.uiAddr; + return cpu_paddr; +} + +/*! +****************************************************************************** + @Function SysCpuPAddrToSysPAddr + + @Description Compute a system physical address from a cpu physical + address. + + @Input cpu_paddr - cpu physical address. + @Return device physical address. + +******************************************************************************/ +IMG_SYS_PHYADDR SysCpuPAddrToSysPAddr (IMG_CPU_PHYADDR cpu_paddr) +{ + IMG_SYS_PHYADDR sys_paddr; + + /* This would only be an inequality if the CPU's MMU did not point to + sys address 0, ie. multi CPU system */ + sys_paddr.uiAddr = cpu_paddr.uiAddr; + return sys_paddr; +} + + +/*! +****************************************************************************** + @Function SysSysPAddrToDevPAddr + + @Description Compute a device physical address from a system physical + address. + + @Input SysPAddr - system physical address. + @Input eDeviceType - device type required if DevPAddr + address spaces vary across devices + in the same system + + @Return Device physical address. + +******************************************************************************/ +IMG_DEV_PHYADDR SysSysPAddrToDevPAddr(PVRSRV_DEVICE_TYPE eDeviceType, IMG_SYS_PHYADDR SysPAddr) +{ + IMG_DEV_PHYADDR DevPAddr; + + PVR_UNREFERENCED_PARAMETER(eDeviceType); + + /* Note: for UMA system we assume DevP == CpuP */ + DevPAddr.uiAddr = SysPAddr.uiAddr; + + return DevPAddr; +} + + +/*! +****************************************************************************** + @Function SysDevPAddrToSysPAddr + + @Description Compute a device physical address from a system physical + address. + + @Input DevPAddr - device physical address. + @Input eDeviceType - device type required if DevPAddr + address spaces vary across devices + in the same system + + @Return System physical address. + +******************************************************************************/ +IMG_SYS_PHYADDR SysDevPAddrToSysPAddr(PVRSRV_DEVICE_TYPE eDeviceType, IMG_DEV_PHYADDR DevPAddr) +{ + IMG_SYS_PHYADDR SysPAddr; + + PVR_UNREFERENCED_PARAMETER(eDeviceType); + + /* Note: for UMA system we assume DevP == SysP */ + SysPAddr.uiAddr = DevPAddr.uiAddr; + + return SysPAddr; +} + + +/***************************************************************************** + @Function SysRegisterExternalDevice + + @Description Called when a 3rd party device registers with services + + @Input psDeviceNode - the new device node. + + @Return IMG_VOID +*****************************************************************************/ +IMG_VOID SysRegisterExternalDevice(PVRSRV_DEVICE_NODE *psDeviceNode) +{ + PVR_UNREFERENCED_PARAMETER(psDeviceNode); +} + + +/***************************************************************************** + @Function SysRemoveExternalDevice + + @Description Called when a 3rd party device unregisters from services + + @Input psDeviceNode - the device node being removed. + + @Return IMG_VOID +*****************************************************************************/ +IMG_VOID SysRemoveExternalDevice(PVRSRV_DEVICE_NODE *psDeviceNode) +{ + PVR_UNREFERENCED_PARAMETER(psDeviceNode); +} + +/*! +****************************************************************************** + @Function SysGetInterruptSource + + @Description Returns System specific information about the device(s) that + generated the interrupt in the system + + @Input psSysData + @Input psDeviceNode + + @Return System specific information indicating which device(s) + generated the interrupt + +******************************************************************************/ +IMG_UINT32 SysGetInterruptSource(SYS_DATA *psSysData, + PVRSRV_DEVICE_NODE *psDeviceNode) +{ + PVR_UNREFERENCED_PARAMETER(psSysData); +#if defined(NO_HARDWARE) + /* no interrupts in no_hw system just return all bits */ + return 0xFFFFFFFF; +#else + /* Not a shared irq, so we know this is an interrupt for this device */ + return psDeviceNode->ui32SOCInterruptBit; +#endif +} + + +/*! +****************************************************************************** + @Function SysClearInterrupts + + @Description Clears specified system interrupts + + @Input psSysData + @Input ui32ClearBits + + @Return IMG_VOID + +******************************************************************************/ +IMG_VOID SysClearInterrupts(SYS_DATA* psSysData, IMG_UINT32 ui32ClearBits) +{ + PVR_UNREFERENCED_PARAMETER(ui32ClearBits); + PVR_UNREFERENCED_PARAMETER(psSysData); +#if !defined(NO_HARDWARE) +#if defined(SGX_OCP_NO_INT_BYPASS) + OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_IRQSTATUS_2, 0x1); +#endif + /* Flush posted writes */ + OSReadHWReg(((PVRSRV_SGXDEV_INFO *)gpsSGXDevNode->pvDevice)->pvRegsBaseKM, EUR_CR_EVENT_HOST_CLEAR); +#endif /* defined(NO_HARDWARE) */ +} + +#if defined(SGX_OCP_NO_INT_BYPASS) +/*! +****************************************************************************** + @Function SysEnableSGXInterrupts + + @Description Enables SGX interrupts + + @Input psSysData + + @Return IMG_VOID + +******************************************************************************/ +IMG_VOID SysEnableSGXInterrupts(SYS_DATA *psSysData) +{ + SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *)psSysData->pvSysSpecificData; + if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_ENABLE_LISR) && !SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED)) + { + OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_IRQSTATUS_2, 0x1); + OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_IRQENABLE_SET_2, 0x1); + SYS_SPECIFIC_DATA_SET(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED); + } +} + +/*! +****************************************************************************** + @Function SysDisableSGXInterrupts + + @Description Disables SGX interrupts + + @Input psSysData + + @Return IMG_VOID + +******************************************************************************/ +IMG_VOID SysDisableSGXInterrupts(SYS_DATA *psSysData) +{ + SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *)psSysData->pvSysSpecificData; + + if (SYS_SPECIFIC_DATA_TEST(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED)) + { + OSWriteHWReg(gpvOCPRegsLinAddr, EUR_CR_OCP_IRQENABLE_CLR_2, 0x1); + SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, SYS_SPECIFIC_DATA_IRQ_ENABLED); + } +} +#endif /* defined(SGX_OCP_NO_INT_BYPASS) */ + +/*! +****************************************************************************** + + @Function SysSystemPrePowerState + + @Description Perform system-level processing required before a power transition + + @Input eNewPowerState : + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysSystemPrePowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) +{ + PVRSRV_ERROR eError = PVRSRV_OK; + + if (eNewPowerState == PVRSRV_SYS_POWER_STATE_D3) + { + PVR_TRACE(("SysSystemPrePowerState: Entering state D3")); + +#if defined(SYS_USING_INTERRUPTS) + if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) + { +#if defined(SYS_CUSTOM_POWERLOCK_WRAP) + IMG_BOOL bWrapped = WrapSystemPowerChange(&gsSysSpecificData); +#endif + eError = OSUninstallDeviceLISR(gpsSysData); +#if defined(SYS_CUSTOM_POWERLOCK_WRAP) + if (bWrapped) + { + UnwrapSystemPowerChange(&gsSysSpecificData); + } +#endif + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysSystemPrePowerState: OSUninstallDeviceLISR failed (%d)", eError)); + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR); + SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR); + } +#endif + + if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)) + { + DisableSystemClocks(gpsSysData); + + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS); + SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS); + } + } + + return eError; +} + + +/*! +****************************************************************************** + + @Function SysSystemPostPowerState + + @Description Perform system-level processing required after a power transition + + @Input eNewPowerState : + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysSystemPostPowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) +{ + PVRSRV_ERROR eError = PVRSRV_OK; + + if (eNewPowerState == PVRSRV_SYS_POWER_STATE_D0) + { + PVR_TRACE(("SysSystemPostPowerState: Entering state D0")); + + if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS)) + { + eError = EnableSystemClocksWrap(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: EnableSystemClocksWrap failed (%d)", eError)); + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS); + SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS); + } + +#if defined(SYS_USING_INTERRUPTS) + if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR)) + { +#if defined(SYS_CUSTOM_POWERLOCK_WRAP) + IMG_BOOL bWrapped = WrapSystemPowerChange(&gsSysSpecificData); +#endif + + eError = OSInstallDeviceLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ, "SGX ISR", gpsSGXDevNode); +#if defined(SYS_CUSTOM_POWERLOCK_WRAP) + if (bWrapped) + { + UnwrapSystemPowerChange(&gsSysSpecificData); + } +#endif + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSInstallDeviceLISR failed to install ISR (%d)", eError)); + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR); + SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR); + } +#endif + } + return eError; +} + + +/*! +****************************************************************************** + + @Function SysDevicePrePowerState + + @Description Perform system level processing required before a device power + transition + + @Input ui32DeviceIndex : + @Input eNewPowerState : + @Input eCurrentPowerState : + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysDevicePrePowerState(IMG_UINT32 ui32DeviceIndex, + PVRSRV_DEV_POWER_STATE eNewPowerState, + PVRSRV_DEV_POWER_STATE eCurrentPowerState) +{ + PVR_UNREFERENCED_PARAMETER(eCurrentPowerState); + + if (ui32DeviceIndex != gui32SGXDeviceID) + { + return PVRSRV_OK; + } + +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + if (eNewPowerState == PVRSRV_DEV_POWER_STATE_OFF) + { + PVR_DPF((PVR_DBG_MESSAGE, "SysDevicePrePowerState: SGX Entering state D3")); + DisableSGXClocks(gpsSysData); + } +#else /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + PVR_UNREFERENCED_PARAMETER(eNewPowerState ); +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + return PVRSRV_OK; +} + + +/*! +****************************************************************************** + + @Function SysDevicePostPowerState + + @Description Perform system level processing required after a device power + transition + + @Input ui32DeviceIndex : + @Input eNewPowerState : + @Input eCurrentPowerState : + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysDevicePostPowerState(IMG_UINT32 ui32DeviceIndex, + PVRSRV_DEV_POWER_STATE eNewPowerState, + PVRSRV_DEV_POWER_STATE eCurrentPowerState) +{ + PVRSRV_ERROR eError = PVRSRV_OK; + + PVR_UNREFERENCED_PARAMETER(eNewPowerState); + + if (ui32DeviceIndex != gui32SGXDeviceID) + { + return eError; + } + +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + if (eCurrentPowerState == PVRSRV_DEV_POWER_STATE_OFF) + { + PVR_DPF((PVR_DBG_MESSAGE, "SysDevicePostPowerState: SGX Leaving state D3")); + eError = EnableSGXClocksWrap(gpsSysData); + } +#else /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + PVR_UNREFERENCED_PARAMETER(eCurrentPowerState); +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + + return eError; +} + +/***************************************************************************** + @Function SysOEMFunction + + @Description marshalling function for custom OEM functions + + @Input ui32ID - function ID + @Input pvIn - in data + @Output pvOut - out data + + @Return PVRSRV_ERROR +*****************************************************************************/ +PVRSRV_ERROR SysOEMFunction ( IMG_UINT32 ui32ID, + IMG_VOID *pvIn, + IMG_UINT32 ulInSize, + IMG_VOID *pvOut, + IMG_UINT32 ulOutSize) +{ + PVR_UNREFERENCED_PARAMETER(ui32ID); + PVR_UNREFERENCED_PARAMETER(pvIn); + PVR_UNREFERENCED_PARAMETER(ulInSize); + PVR_UNREFERENCED_PARAMETER(pvOut); + PVR_UNREFERENCED_PARAMETER(ulOutSize); + +#if !defined(__QNXNTO__) + if ((ui32ID == OEM_GET_EXT_FUNCS) && + (ulOutSize == sizeof(PVRSRV_DC_OEM_JTABLE))) + { + PVRSRV_DC_OEM_JTABLE *psOEMJTable = (PVRSRV_DC_OEM_JTABLE*) pvOut; + psOEMJTable->pfnOEMBridgeDispatch = &PVRSRV_BridgeDispatchKM; + return PVRSRV_OK; + } +#endif + + return PVRSRV_ERROR_INVALID_PARAMS; +} +/****************************************************************************** + End of file (sysconfig.c) +******************************************************************************/ diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysconfig.h b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysconfig.h new file mode 100644 index 0000000..faff7df --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysconfig.h @@ -0,0 +1,109 @@ +/*************************************************************************/ /*! +@Title System Description Header +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@Description This header provides system-specific declarations and macros +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#if !defined(__SOCCONFIG_H__) +#define __SOCCONFIG_H__ + +#if defined(VS_PRODUCT_VERSION) && VS_PRODUCT_VERSION == 5 +#define VS_PRODUCT_NAME "OMAP5" +#else +#define VS_PRODUCT_NAME "OMAP4" +#endif + + +#define SYS_SGX_HWRECOVERY_TIMEOUT_FREQ (100) // 10ms (100hz) +#define SYS_SGX_PDS_TIMER_FREQ (1000) // 1ms (1000hz) + +/* Allow the AP latency to be overridden in the build config */ +#if !defined(SYS_SGX_ACTIVE_POWER_LATENCY_MS) +#define SYS_SGX_ACTIVE_POWER_LATENCY_MS (2) +#endif + + +#define SYS_OMAP_SGX_REGS_SYS_PHYS_BASE 0x56000000 +#define SYS_OMAP_SGX_REGS_SIZE 0xFFFF + +#define SYS_OMAP_SGX_IRQ 53 /* OMAP4 IRQ's are offset by 32 */ + +#define SYS_OMAP_DSS_REGS_SYS_PHYS_BASE 0x58000000 +#define SYS_OMAP_DSS_REGS_SIZE 0x7000 + +#define SYS_OMAP_DSS_HDMI_INTERRUPT_STATUS_REG 0x6028 +#define SYS_OMAP_DSS_HDMI_INTERRUPT_ENABLE_REG 0x602c + +#define SYS_OMAP_DSS_HDMI_INTERRUPT_VSYNC_ENABLE_MASK 0x10000 +#define SYS_OMAP_DSS_HDMI_INTERRUPT_VSYNC_STATUS_MASK 0x10000 + +#define SYS_OMAP_DSS_LCD_INTERRUPT_STATUS_REG 0x1018 +#define SYS_OMAP_DSS_LCD_INTERRUPT_ENABLE_REG 0x101c + +#define SYS_OMAP_DSS_LCD_INTERRUPT_VSYNC_ENABLE_MASK 0x40002 +#define SYS_OMAP_DSS_LCD_INTERRUPT_VSYNC_STATUS_MASK 0x40002 + + +#define SYS_OMAP_GP11TIMER_ENABLE_SYS_PHYS_BASE 0x48088038 +#define SYS_OMAP_GP11TIMER_REGS_SYS_PHYS_BASE 0x4808803C +#define SYS_OMAP_GP11TIMER_TSICR_SYS_PHYS_BASE 0x48088054 + +/* Interrupt bits */ +#define DEVICE_SGX_INTERRUPT (1<<0) +#define DEVICE_MSVDX_INTERRUPT (1<<1) +#define DEVICE_DISP_INTERRUPT (1<<2) + +#if defined(__linux__) +/* + * Recent OMAP4 kernels register SGX as platform device "omap_gpu". + * This device must be used with the Linux power management calls + * in sysutils_linux.c, in order for SGX to be powered on. + */ +#if defined(PVR_LDM_PLATFORM_PRE_REGISTERED_DEV) +#define SYS_SGX_DEV_NAME PVR_LDM_PLATFORM_PRE_REGISTERED_DEV +#else +#define SYS_SGX_DEV_NAME "omap_gpu" +#endif /* defined(PVR_LDM_PLATFORM_PRE_REGISTERED_DEV) */ +#endif /* defined(__linux__) */ + +/***************************************************************************** + * system specific data structures + *****************************************************************************/ + +#endif /* __SYSCONFIG_H__ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysinfo.h b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysinfo.h new file mode 100644 index 0000000..84febab --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysinfo.h @@ -0,0 +1,70 @@ +/*************************************************************************/ /*! +@Title System Description Header +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@Description This header provides system-specific declarations and macros +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#if !defined(__SYSINFO_H__) +#define __SYSINFO_H__ + +#if defined(SGX540) && (SGX_CORE_REV == 120) +#define SYS_SGX_CLOCK_SPEED 307200000 +#else +#define SYS_SGX_CLOCK_SPEED 304742400 +#endif + +/*!< System specific poll/timeout details */ +#if defined(PVR_LINUX_USING_WORKQUEUES) +/* + * The workqueue based 3rd party display driver may be blocked for up + * to 500ms waiting for a vsync when the screen goes blank, so we + * need to wait longer for the hardware if a flush of the swap chain is + * required. + */ +#define MAX_HW_TIME_US (1000000) +#define WAIT_TRY_COUNT (20000) +#else +#define MAX_HW_TIME_US (500000) +#define WAIT_TRY_COUNT (10000) +#endif + + +#define SYS_DEVICE_COUNT 15 /* SGX, DISPLAYCLASS (external), BUFFERCLASS (external) */ + +#endif /* __SYSINFO_H__ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/syslocal.h b/jacinto6/sgx_src/eurasia_km/services4/system/omap/syslocal.h new file mode 100644 index 0000000..ba312d6 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/syslocal.h @@ -0,0 +1,269 @@ +/*************************************************************************/ /*! +@Title Local system definitions +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@Description This header provides local system declarations and macros +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#if !defined(__SYSLOCAL_H__) +#define __SYSLOCAL_H__ + +#if defined(__linux__) + +#include <linux/version.h> +#include <linux/clk.h> +#if defined(PVR_LINUX_USING_WORKQUEUES) +#include <linux/mutex.h> +#else +#include <linux/spinlock.h> +#endif +#include <asm/atomic.h> + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26)) +#include <linux/semaphore.h> +#include <linux/resource.h> +#else /* (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26)) */ +#include <asm/semaphore.h> +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22)) +#include <asm/arch/resource.h> +#endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22)) */ +#endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,26)) */ + + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) +#if !defined(LDM_PLATFORM) +#error "LDM_PLATFORM must be set" +#endif +#define PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO +#include <linux/platform_device.h> +#endif + +#if ((defined(DEBUG) || defined(TIMING)) && \ + (LINUX_VERSION_CODE == KERNEL_VERSION(2,6,34))) && \ + !defined(PVR_NO_OMAP_TIMER) +/* + * We need to explicitly enable the GPTIMER11 clocks, or we'll get an + * abort when we try to access the timer registers. + */ +#define PVR_OMAP4_TIMING_PRCM +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) +#include <plat/gpu.h> +#endif +#if !defined(PVR_NO_OMAP_TIMER) +#define PVR_OMAP_USE_DM_TIMER_API +#include <plat/dmtimer.h> +#endif +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) +#include <linux/wakelock.h> +#endif + +#if !defined(PVR_NO_OMAP_TIMER) +#define PVR_OMAP_TIMER_BASE_IN_SYS_SPEC_DATA +#endif +#endif /* defined(__linux__) */ + +#if !defined(NO_HARDWARE) && \ + defined(SYS_USING_INTERRUPTS) +#define SGX_OCP_REGS_ENABLED +#endif + +#if defined(__linux__) +#if defined(SGX_OCP_REGS_ENABLED) +/* FIXME: Temporary workaround for OMAP4470 and active power off in 4430 */ +#if !defined(SGX544) && defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) +#define SGX_OCP_NO_INT_BYPASS +#endif +#endif +#endif + +#if defined (__cplusplus) +extern "C" { +#endif + +/***************************************************************************** + * system specific data structures + *****************************************************************************/ + +/***************************************************************************** + * system specific function prototypes + *****************************************************************************/ + +IMG_VOID DisableSystemClocks(SYS_DATA *psSysData); +PVRSRV_ERROR EnableSystemClocks(SYS_DATA *psSysData); + +IMG_VOID DisableSGXClocks(SYS_DATA *psSysData); +PVRSRV_ERROR EnableSGXClocks(SYS_DATA *psSysData); + +/* + * Various flags to indicate what has been initialised, and what + * has been temporarily deinitialised for power management purposes. + */ +#define SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS 0x00000001 +#define SYS_SPECIFIC_DATA_ENABLE_LISR 0x00000002 +#define SYS_SPECIFIC_DATA_ENABLE_MISR 0x00000004 +#define SYS_SPECIFIC_DATA_ENABLE_ENVDATA 0x00000008 +#define SYS_SPECIFIC_DATA_ENABLE_LOCDEV 0x00000010 +#define SYS_SPECIFIC_DATA_ENABLE_REGDEV 0x00000020 +#define SYS_SPECIFIC_DATA_ENABLE_PDUMPINIT 0x00000040 +#define SYS_SPECIFIC_DATA_ENABLE_INITDEV 0x00000080 +#define SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV 0x00000100 + +#define SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR 0x00000200 +#define SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS 0x00000400 +#define SYS_SPECIFIC_DATA_ENABLE_OCPREGS 0x00000800 +#define SYS_SPECIFIC_DATA_ENABLE_PM_RUNTIME 0x00001000 +#define SYS_SPECIFIC_DATA_IRQ_ENABLED 0x00002000 +#define SYS_SPECIFIC_DATA_DVFS_INIT 0x00004000 + +#define SYS_SPECIFIC_DATA_SET(psSysSpecData, flag) ((IMG_VOID)((psSysSpecData)->ui32SysSpecificData |= (flag))) + +#define SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, flag) ((IMG_VOID)((psSysSpecData)->ui32SysSpecificData &= ~(flag))) + +#define SYS_SPECIFIC_DATA_TEST(psSysSpecData, flag) (((psSysSpecData)->ui32SysSpecificData & (flag)) != 0) + +typedef struct _SYS_SPECIFIC_DATA_TAG_ +{ + IMG_UINT32 ui32SysSpecificData; + PVRSRV_DEVICE_NODE *psSGXDevNode; + IMG_BOOL bSGXInitComplete; +#if defined(PVR_OMAP_TIMER_BASE_IN_SYS_SPEC_DATA) + IMG_CPU_PHYADDR sTimerRegPhysBase; +#endif +#if !defined(__linux__) + IMG_BOOL bSGXClocksEnabled; +#endif + IMG_UINT32 ui32SrcClockDiv; +#if defined(__linux__) + IMG_BOOL bSysClocksOneTimeInit; + atomic_t sSGXClocksEnabled; +#if defined(PVR_LINUX_USING_WORKQUEUES) + struct mutex sPowerLock; +#else + IMG_BOOL bConstraintNotificationsEnabled; + spinlock_t sPowerLock; + atomic_t sPowerLockCPU; + spinlock_t sNotifyLock; + atomic_t sNotifyLockCPU; + IMG_BOOL bCallVDD2PostFunc; +#endif +#if defined(DEBUG) || defined(TIMING) + struct clk *psGPT11_FCK; + struct clk *psGPT11_ICK; +#endif +#if defined(PVR_OMAP_USE_DM_TIMER_API) + struct omap_dm_timer *psGPTimer; +#endif +#if defined(CONFIG_HAS_WAKELOCK) + struct wake_lock wake_lock; +#endif /* CONFIG_HAS_WAKELOCK */ +#endif /* defined(__linux__) */ +} SYS_SPECIFIC_DATA; + +extern SYS_SPECIFIC_DATA *gpsSysSpecificData; + +#if defined(SGX_OCP_REGS_ENABLED) && defined(SGX_OCP_NO_INT_BYPASS) +IMG_VOID SysEnableSGXInterrupts(SYS_DATA* psSysData); +IMG_VOID SysDisableSGXInterrupts(SYS_DATA* psSysData); +#else +#define SysEnableSGXInterrupts(psSysData) +#define SysDisableSGXInterrupts(psSysData) +#endif + +#if defined(SYS_CUSTOM_POWERLOCK_WRAP) +IMG_BOOL WrapSystemPowerChange(SYS_SPECIFIC_DATA *psSysSpecData); +IMG_VOID UnwrapSystemPowerChange(SYS_SPECIFIC_DATA *psSysSpecData); +#endif + +#if defined(__linux__) + +PVRSRV_ERROR SysPMRuntimeRegister(void); +PVRSRV_ERROR SysPMRuntimeUnregister(void); + +PVRSRV_ERROR SysDvfsInitialize(SYS_SPECIFIC_DATA *psSysSpecificData); +PVRSRV_ERROR SysDvfsDeinitialize(SYS_SPECIFIC_DATA *psSysSpecificData); + +#else /* defined(__linux__) */ + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SysPMRuntimeRegister) +#endif +static INLINE PVRSRV_ERROR SysPMRuntimeRegister(void) +{ + return PVRSRV_OK; +} + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SysPMRuntimeUnregister) +#endif +static INLINE PVRSRV_ERROR SysPMRuntimeUnregister(void) +{ + return PVRSRV_OK; +} + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SysDvfsInitialize) +#endif +static INLINE PVRSRV_ERROR SysDvfsInitialize(SYS_SPECIFIC_DATA *psSysSpecificData) +{ + PVR_UNREFERENCED_PARAMETER(psSysSpecificData); + return PVRSRV_OK; +} + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SysDvfsDeinitialize) +#endif +static INLINE PVRSRV_ERROR SysDvfsDeinitialize(SYS_SPECIFIC_DATA *psSysSpecificData) +{ + PVR_UNREFERENCED_PARAMETER(psSysSpecificData); + return PVRSRV_OK; +} + +#endif /* defined(__linux__) */ + +#if defined(__cplusplus) +} +#endif + +#endif /* __SYSLOCAL_H__ */ + + diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysutils.c b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysutils.c new file mode 100644 index 0000000..b1ea055 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysutils.c @@ -0,0 +1,63 @@ +/*************************************************************************/ /*! +@Title Shared (User/kernel) and System dependent utilities +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@Description Provides system-specific functions +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +/* Pull in the correct system dependent sysutils source */ + +#if defined(__linux__) +#include "sysutils_linux.c" +#if defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) +#include "sgxfreq.c" +#include "sgxfreq_onoff.c" +#include "sgxfreq_activeidle.c" +#include "sgxfreq_on3demand.c" +#include "sgxfreq_userspace.c" +#if (defined(CONFIG_THERMAL) || defined(CONFIG_THERMAL_FRAMEWORK)) +#include "sgxfreq_cool.c" +#endif +#endif +#endif + + + +#if defined(__QNXNTO__) +#include "sysutils_nto.c" +#endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysutils_linux.c b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysutils_linux.c new file mode 100644 index 0000000..ad02673 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap/sysutils_linux.c @@ -0,0 +1,721 @@ +/*************************************************************************/ /*! +@Title System dependent utilities +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@Description Provides system-specific functions +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ +#include <linux/version.h> +#include <linux/clk.h> +#include <linux/err.h> +#include <linux/hardirq.h> +#include <linux/mutex.h> +#include <linux/slab.h> + +#include "sgxdefs.h" +#include "services_headers.h" +#include "sysinfo.h" +#include "sgxapi_km.h" +#include "sysconfig.h" +#include "sgxinfokm.h" +#include "syslocal.h" + +#include <linux/platform_device.h> +#include <linux/pm_runtime.h> + +#if defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) +#include "sgxfreq.h" +#endif + +#if defined(SUPPORT_DRI_DRM_PLUGIN) +#include <drm/drmP.h> +#include <drm/drm.h> + +#include <linux/omap_gpu.h> + +#include "pvr_drm.h" +#endif + +#define ONE_MHZ 1000000 +#define HZ_TO_MHZ(m) ((m) / ONE_MHZ) + +#if defined(SUPPORT_OMAP3430_SGXFCLK_96M) +#define SGX_PARENT_CLOCK "cm_96m_fck" +#else +#define SGX_PARENT_CLOCK "core_ck" +#endif + +#if defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) +extern struct platform_device *gpsPVRLDMDev; +#endif + +static PVRSRV_ERROR PowerLockWrap(SYS_SPECIFIC_DATA *psSysSpecData, IMG_BOOL bTryLock) +{ + if (!in_interrupt()) + { + if (bTryLock) + { + int locked = mutex_trylock(&psSysSpecData->sPowerLock); + if (locked == 0) + { + return PVRSRV_ERROR_RETRY; + } + } + else + { + mutex_lock(&psSysSpecData->sPowerLock); + } + } + + return PVRSRV_OK; +} + +static IMG_VOID PowerLockUnwrap(SYS_SPECIFIC_DATA *psSysSpecData) +{ + if (!in_interrupt()) + { + mutex_unlock(&psSysSpecData->sPowerLock); + } +} + +PVRSRV_ERROR SysPowerLockWrap(IMG_BOOL bTryLock) +{ + SYS_DATA *psSysData; + + SysAcquireData(&psSysData); + + return PowerLockWrap(psSysData->pvSysSpecificData, bTryLock); +} + +IMG_VOID SysPowerLockUnwrap(IMG_VOID) +{ + SYS_DATA *psSysData; + + SysAcquireData(&psSysData); + + PowerLockUnwrap(psSysData->pvSysSpecificData); +} + +/* + * This function should be called to unwrap the Services power lock, prior + * to calling any function that might sleep. + * This function shouldn't be called prior to calling EnableSystemClocks + * or DisableSystemClocks, as those functions perform their own power lock + * unwrapping. + * If the function returns IMG_TRUE, UnwrapSystemPowerChange must be + * called to rewrap the power lock, prior to returning to Services. + */ +IMG_BOOL WrapSystemPowerChange(SYS_SPECIFIC_DATA *psSysSpecData) +{ + return IMG_TRUE; +} + +IMG_VOID UnwrapSystemPowerChange(SYS_SPECIFIC_DATA *psSysSpecData) +{ +} + +/* + * Return SGX timining information to caller. + */ +IMG_VOID SysGetSGXTimingInformation(SGX_TIMING_INFORMATION *psTimingInfo) +{ +#if !defined(NO_HARDWARE) + PVR_ASSERT(atomic_read(&gpsSysSpecificData->sSGXClocksEnabled) != 0); +#endif +#if defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) + /* + * The core SGX driver and ukernel code expects SGX frequency + * changes to occur only just prior to SGX initialization. We + * don't wish to constrain the DVFS implementation as such. So + * we let these components believe that frequency setting is + * always at maximum. This produces safe values for derived + * parameters such as APM and HWR timeouts. + */ + psTimingInfo->ui32CoreClockSpeed = (IMG_UINT32)sgxfreq_get_freq_max(); +#else /* defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) */ + psTimingInfo->ui32CoreClockSpeed = SYS_SGX_CLOCK_SPEED; +#endif + psTimingInfo->ui32HWRecoveryFreq = SYS_SGX_HWRECOVERY_TIMEOUT_FREQ; + psTimingInfo->ui32uKernelFreq = SYS_SGX_PDS_TIMER_FREQ; +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + psTimingInfo->bEnableActivePM = IMG_TRUE; +#else + psTimingInfo->bEnableActivePM = IMG_FALSE; +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + psTimingInfo->ui32ActivePowManLatencyms = SYS_SGX_ACTIVE_POWER_LATENCY_MS; +} + +/*! +****************************************************************************** + + @Function EnableSGXClocks + + @Description Enable SGX clocks + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR EnableSGXClocks(SYS_DATA *psSysData) +{ +#if !defined(NO_HARDWARE) + SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; + + /* SGX clocks already enabled? */ + if (atomic_read(&psSysSpecData->sSGXClocksEnabled) != 0) + { + return PVRSRV_OK; + } + + PVR_DPF((PVR_DBG_MESSAGE, "EnableSGXClocks: Enabling SGX Clocks")); + +#if defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) + { + /* + * pm_runtime_get_sync returns 1 after the module has + * been reloaded. + */ + int res = pm_runtime_get_sync(&gpsPVRLDMDev->dev); + if (res < 0) + { + PVR_DPF((PVR_DBG_ERROR, "EnableSGXClocks: pm_runtime_get_sync failed (%d)", -res)); + return PVRSRV_ERROR_UNABLE_TO_ENABLE_CLOCK; + } + } +#if defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) + sgxfreq_notif_sgx_clk_on(); +#endif /* defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) */ +#endif /* defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) */ + + SysEnableSGXInterrupts(psSysData); + + /* Indicate that the SGX clocks are enabled */ + atomic_set(&psSysSpecData->sSGXClocksEnabled, 1); + +#else /* !defined(NO_HARDWARE) */ + PVR_UNREFERENCED_PARAMETER(psSysData); +#endif /* !defined(NO_HARDWARE) */ + return PVRSRV_OK; +} + + +/*! +****************************************************************************** + + @Function DisableSGXClocks + + @Description Disable SGX clocks. + + @Return none + +******************************************************************************/ +IMG_VOID DisableSGXClocks(SYS_DATA *psSysData) +{ +#if !defined(NO_HARDWARE) + SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; + + /* SGX clocks already disabled? */ + if (atomic_read(&psSysSpecData->sSGXClocksEnabled) == 0) + { + return; + } + + PVR_DPF((PVR_DBG_MESSAGE, "DisableSGXClocks: Disabling SGX Clocks")); + + SysDisableSGXInterrupts(psSysData); + +#if defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) + { + int res = pm_runtime_put_sync(&gpsPVRLDMDev->dev); + if (res < 0) + { + PVR_DPF((PVR_DBG_ERROR, "DisableSGXClocks: pm_runtime_put_sync failed (%d)", -res)); + } + } +#if defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) + sgxfreq_notif_sgx_clk_off(); +#endif /* defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) */ +#endif /* defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) */ + + /* Indicate that the SGX clocks are disabled */ + atomic_set(&psSysSpecData->sSGXClocksEnabled, 0); + +#else /* !defined(NO_HARDWARE) */ + PVR_UNREFERENCED_PARAMETER(psSysData); +#endif /* !defined(NO_HARDWARE) */ +} + +#if (defined(DEBUG) || defined(TIMING)) && !defined(PVR_NO_OMAP_TIMER) +#if defined(PVR_OMAP_USE_DM_TIMER_API) +#define GPTIMER_TO_USE 11 +/*! +****************************************************************************** + + @Function AcquireGPTimer + + @Description Acquire a GP timer + + @Return PVRSRV_ERROR + +******************************************************************************/ +static PVRSRV_ERROR AcquireGPTimer(SYS_SPECIFIC_DATA *psSysSpecData) +{ + PVR_ASSERT(psSysSpecData->psGPTimer == NULL); + + /* + * This code has problems on module reload for OMAP5 running Linux + * 3.4.10, due to omap2_dm_timer_set_src (called by + * omap_dm_timer_request_specific), being unable to set the parent + * clock to OMAP_TIMER_SRC_32_KHZ. + * Not calling omap_dm_timer_set_source doesn't help. + */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) || !defined(MODULE) + /* + * This code could try requesting registers 9, 10, and 11, + * stopping at the first succesful request. We'll stick with + * 11 for now, as it avoids having to hard code yet more + * physical addresses into the code. + */ + psSysSpecData->psGPTimer = omap_dm_timer_request_specific(GPTIMER_TO_USE); + if (psSysSpecData->psGPTimer == NULL) + { + + PVR_DPF((PVR_DBG_WARNING, "%s: omap_dm_timer_request_specific failed", __FUNCTION__)); + return PVRSRV_ERROR_CLOCK_REQUEST_FAILED; + } + + omap_dm_timer_set_source(psSysSpecData->psGPTimer, OMAP_TIMER_SRC_SYS_CLK); + omap_dm_timer_enable(psSysSpecData->psGPTimer); + + /* Set autoreload, and start value of 0 */ + omap_dm_timer_set_load_start(psSysSpecData->psGPTimer, 1, 0); + + omap_dm_timer_start(psSysSpecData->psGPTimer); + + /* + * The DM timer API doesn't have a mechanism for obtaining the + * physical address of the counter register. + */ + psSysSpecData->sTimerRegPhysBase.uiAddr = SYS_OMAP_GP11TIMER_REGS_SYS_PHYS_BASE; +#else /* (LINUX_VERSION_CODE <= KERNEL_VERSION(3,4,0)) || !defined(MODULE) */ + (void)psSysSpecData; +#endif /* (LINUX_VERSION_CODE <= KERNEL_VERSION(3,4,0)) || !defined(MODULE) */ + + return PVRSRV_OK; +} + +/*! +****************************************************************************** + + @Function ReleaseGPTimer + + @Description Release a GP timer + + @Return PVRSRV_ERROR + +******************************************************************************/ +static void ReleaseGPTimer(SYS_SPECIFIC_DATA *psSysSpecData) +{ + if (psSysSpecData->psGPTimer != NULL) + { + /* Always returns 0 */ + (void) omap_dm_timer_stop(psSysSpecData->psGPTimer); + + omap_dm_timer_disable(psSysSpecData->psGPTimer); + + omap_dm_timer_free(psSysSpecData->psGPTimer); + + psSysSpecData->sTimerRegPhysBase.uiAddr = 0; + + psSysSpecData->psGPTimer = NULL; + } + +} +#else /* PVR_OMAP_USE_DM_TIMER_API */ +/*! +****************************************************************************** + + @Function AcquireGPTimer + + @Description Acquire a GP timer + + @Return PVRSRV_ERROR + +******************************************************************************/ +static PVRSRV_ERROR AcquireGPTimer(SYS_SPECIFIC_DATA *psSysSpecData) +{ +#if defined(PVR_OMAP4_TIMING_PRCM) + struct clk *psCLK; + IMG_INT res; + struct clk *sys_ck; + IMG_INT rate; +#endif + PVRSRV_ERROR eError; + + IMG_CPU_PHYADDR sTimerRegPhysBase; + IMG_HANDLE hTimerEnable; + IMG_UINT32 *pui32TimerEnable; + + PVR_ASSERT(psSysSpecData->sTimerRegPhysBase.uiAddr == 0); + +#if defined(PVR_OMAP4_TIMING_PRCM) + /* assert our dependence on the GPTIMER11 module */ + psCLK = clk_get(NULL, "gpt11_fck"); + if (IS_ERR(psCLK)) + { + PVR_DPF((PVR_DBG_ERROR, "EnableSystemClocks: Couldn't get GPTIMER11 functional clock")); + goto ExitError; + } + psSysSpecData->psGPT11_FCK = psCLK; + + psCLK = clk_get(NULL, "gpt11_ick"); + if (IS_ERR(psCLK)) + { + PVR_DPF((PVR_DBG_ERROR, "EnableSystemClocks: Couldn't get GPTIMER11 interface clock")); + goto ExitError; + } + psSysSpecData->psGPT11_ICK = psCLK; + + sys_ck = clk_get(NULL, "sys_clkin_ck"); + if (IS_ERR(sys_ck)) + { + PVR_DPF((PVR_DBG_ERROR, "EnableSystemClocks: Couldn't get System clock")); + goto ExitError; + } + + if(clk_get_parent(psSysSpecData->psGPT11_FCK) != sys_ck) + { + PVR_TRACE(("Setting GPTIMER11 parent to System Clock")); + res = clk_set_parent(psSysSpecData->psGPT11_FCK, sys_ck); + if (res < 0) + { + PVR_DPF((PVR_DBG_ERROR, "EnableSystemClocks: Couldn't set GPTIMER11 parent clock (%d)", res)); + goto ExitError; + } + } + + rate = clk_get_rate(psSysSpecData->psGPT11_FCK); + PVR_TRACE(("GPTIMER11 clock is %dMHz", HZ_TO_MHZ(rate))); + + res = clk_enable(psSysSpecData->psGPT11_FCK); + if (res < 0) + { + PVR_DPF((PVR_DBG_ERROR, "EnableSystemClocks: Couldn't enable GPTIMER11 functional clock (%d)", res)); + goto ExitError; + } + + res = clk_enable(psSysSpecData->psGPT11_ICK); + if (res < 0) + { + PVR_DPF((PVR_DBG_ERROR, "EnableSystemClocks: Couldn't enable GPTIMER11 interface clock (%d)", res)); + goto ExitDisableGPT11FCK; + } +#endif /* defined(PVR_OMAP4_TIMING_PRCM) */ + + /* Set the timer to non-posted mode */ + sTimerRegPhysBase.uiAddr = SYS_OMAP_GP11TIMER_TSICR_SYS_PHYS_BASE; + pui32TimerEnable = OSMapPhysToLin(sTimerRegPhysBase, + 4, + PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, + &hTimerEnable); + + if (pui32TimerEnable == IMG_NULL) + { + PVR_DPF((PVR_DBG_ERROR, "EnableSystemClocks: OSMapPhysToLin failed")); + goto ExitDisableGPT11ICK; + } + + if(!(*pui32TimerEnable & 4)) + { + PVR_TRACE(("Setting GPTIMER11 mode to posted (currently is non-posted)")); + + /* Set posted mode */ + *pui32TimerEnable |= 4; + } + + OSUnMapPhysToLin(pui32TimerEnable, + 4, + PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, + hTimerEnable); + + /* Enable the timer */ + sTimerRegPhysBase.uiAddr = SYS_OMAP_GP11TIMER_ENABLE_SYS_PHYS_BASE; + pui32TimerEnable = OSMapPhysToLin(sTimerRegPhysBase, + 4, + PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, + &hTimerEnable); + + if (pui32TimerEnable == IMG_NULL) + { + PVR_DPF((PVR_DBG_ERROR, "EnableSystemClocks: OSMapPhysToLin failed")); + goto ExitDisableGPT11ICK; + } + + /* Enable and set autoreload on overflow */ + *pui32TimerEnable = 3; + + OSUnMapPhysToLin(pui32TimerEnable, + 4, + PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, + hTimerEnable); + + psSysSpecData->sTimerRegPhysBase = sTimerRegPhysBase; + + eError = PVRSRV_OK; + + goto Exit; + +ExitDisableGPT11ICK: +#if defined(PVR_OMAP4_TIMING_PRCM) + clk_disable(psSysSpecData->psGPT11_ICK); +ExitDisableGPT11FCK: + clk_disable(psSysSpecData->psGPT11_FCK); +ExitError: +#endif /* defined(PVR_OMAP4_TIMING_PRCM) */ + eError = PVRSRV_ERROR_CLOCK_REQUEST_FAILED; +Exit: + return eError; +} + +/*! +****************************************************************************** + + @Function ReleaseGPTimer + + @Description Release a GP timer + + @Return PVRSRV_ERROR + +******************************************************************************/ +static void ReleaseGPTimer(SYS_SPECIFIC_DATA *psSysSpecData) +{ + IMG_HANDLE hTimerDisable; + IMG_UINT32 *pui32TimerDisable; + + if (psSysSpecData->sTimerRegPhysBase.uiAddr == 0) + { + return; + } + + /* Disable the timer */ + pui32TimerDisable = OSMapPhysToLin(psSysSpecData->sTimerRegPhysBase, + 4, + PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, + &hTimerDisable); + + if (pui32TimerDisable == IMG_NULL) + { + PVR_DPF((PVR_DBG_ERROR, "DisableSystemClocks: OSMapPhysToLin failed")); + } + else + { + *pui32TimerDisable = 0; + + OSUnMapPhysToLin(pui32TimerDisable, + 4, + PVRSRV_HAP_KERNEL_ONLY|PVRSRV_HAP_UNCACHED, + hTimerDisable); + } + + psSysSpecData->sTimerRegPhysBase.uiAddr = 0; + +#if defined(PVR_OMAP4_TIMING_PRCM) + clk_disable(psSysSpecData->psGPT11_ICK); + + clk_disable(psSysSpecData->psGPT11_FCK); +#endif /* defined(PVR_OMAP4_TIMING_PRCM) */ +} +#endif /* PVR_OMAP_USE_DM_TIMER_API */ +#else /* (DEBUG || TIMING) && !PVR_NO_OMAP_TIMER */ +static PVRSRV_ERROR AcquireGPTimer(SYS_SPECIFIC_DATA *psSysSpecData) +{ + PVR_UNREFERENCED_PARAMETER(psSysSpecData); + + return PVRSRV_OK; +} +static void ReleaseGPTimer(SYS_SPECIFIC_DATA *psSysSpecData) +{ + PVR_UNREFERENCED_PARAMETER(psSysSpecData); +} +#endif /* (DEBUG || TIMING) && !PVR_NO_OMAP_TIMER */ + +/*! +****************************************************************************** + + @Function EnableSystemClocks + + @Description Setup up the clocks for the graphics device to work. + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR EnableSystemClocks(SYS_DATA *psSysData) +{ + SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; + + PVR_TRACE(("EnableSystemClocks: Enabling System Clocks")); + + if (!psSysSpecData->bSysClocksOneTimeInit) + { + mutex_init(&psSysSpecData->sPowerLock); + + atomic_set(&psSysSpecData->sSGXClocksEnabled, 0); + + psSysSpecData->bSysClocksOneTimeInit = IMG_TRUE; + } + + return AcquireGPTimer(psSysSpecData); +} + +/*! +****************************************************************************** + + @Function DisableSystemClocks + + @Description Disable the graphics clocks. + + @Return none + +******************************************************************************/ +IMG_VOID DisableSystemClocks(SYS_DATA *psSysData) +{ + SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; + + PVR_TRACE(("DisableSystemClocks: Disabling System Clocks")); + + /* + * Always disable the SGX clocks when the system clocks are disabled. + * This saves having to make an explicit call to DisableSGXClocks if + * active power management is enabled. + */ + DisableSGXClocks(psSysData); + + ReleaseGPTimer(psSysSpecData); +} + +PVRSRV_ERROR SysPMRuntimeRegister(void) +{ +#if defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) + pm_runtime_enable(&gpsPVRLDMDev->dev); +#endif + return PVRSRV_OK; +} + +PVRSRV_ERROR SysPMRuntimeUnregister(void) +{ +#if defined(LDM_PLATFORM) && !defined(PVR_DRI_DRM_NOT_PCI) + pm_runtime_disable(&gpsPVRLDMDev->dev); +#endif + return PVRSRV_OK; +} + +PVRSRV_ERROR SysDvfsInitialize(SYS_SPECIFIC_DATA *psSysSpecificData) +{ + PVR_UNREFERENCED_PARAMETER(psSysSpecificData); +#if defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) + if (sgxfreq_init(&gpsPVRLDMDev->dev)) + return PVRSRV_ERROR_NOT_SUPPORTED; +#endif /* defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) */ + + return PVRSRV_OK; +} + +PVRSRV_ERROR SysDvfsDeinitialize(SYS_SPECIFIC_DATA *psSysSpecificData) +{ + PVR_UNREFERENCED_PARAMETER(psSysSpecificData); +#if defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) + if (sgxfreq_deinit()) + return PVRSRV_ERROR_NOT_SUPPORTED; +#endif /* defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) */ + + return PVRSRV_OK; +} + +#if defined(SUPPORT_DRI_DRM_PLUGIN) +static struct omap_gpu_plugin sOMAPGPUPlugin; + +#define SYS_DRM_SET_PLUGIN_FIELD(d, s, f) (d)->f = (s)->f +int +SysDRMRegisterPlugin(PVRSRV_DRM_PLUGIN *psDRMPlugin) +{ + int iRes; + + SYS_DRM_SET_PLUGIN_FIELD(&sOMAPGPUPlugin, psDRMPlugin, name); + SYS_DRM_SET_PLUGIN_FIELD(&sOMAPGPUPlugin, psDRMPlugin, open); + SYS_DRM_SET_PLUGIN_FIELD(&sOMAPGPUPlugin, psDRMPlugin, load); + SYS_DRM_SET_PLUGIN_FIELD(&sOMAPGPUPlugin, psDRMPlugin, unload); + SYS_DRM_SET_PLUGIN_FIELD(&sOMAPGPUPlugin, psDRMPlugin, release); + SYS_DRM_SET_PLUGIN_FIELD(&sOMAPGPUPlugin, psDRMPlugin, mmap); + SYS_DRM_SET_PLUGIN_FIELD(&sOMAPGPUPlugin, psDRMPlugin, ioctls); + SYS_DRM_SET_PLUGIN_FIELD(&sOMAPGPUPlugin, psDRMPlugin, num_ioctls); + SYS_DRM_SET_PLUGIN_FIELD(&sOMAPGPUPlugin, psDRMPlugin, ioctl_start); + + iRes = omap_gpu_register_plugin(&sOMAPGPUPlugin); + if (iRes != 0) + { + PVR_DPF((PVR_DBG_ERROR, "%s: omap_gpu_register_plugin failed (%d)", __FUNCTION__, iRes)); + } + + return iRes; +} + +void +SysDRMUnregisterPlugin(PVRSRV_DRM_PLUGIN *psDRMPlugin) +{ + int iRes = omap_gpu_unregister_plugin(&sOMAPGPUPlugin); + if (iRes != 0) + { + PVR_DPF((PVR_DBG_ERROR, "%s: omap_gpu_unregister_plugin failed (%d)", __FUNCTION__, iRes)); + } +} +#endif + +IMG_VOID SysSGXIdleEntered(IMG_VOID) +{ +#if defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) + sgxfreq_notif_sgx_idle(); +#endif +} + +IMG_VOID SysSGXCommandPending(IMG_BOOL bSGXIdle) +{ +#if defined(SYS_OMAP_HAS_DVFS_FRAMEWORK) + if (bSGXIdle) + sgxfreq_notif_sgx_active(); +#else + PVR_UNREFERENCED_PARAMETER(bSGXIdle); +#endif +} diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/omap4/sysconfig.h b/jacinto6/sgx_src/eurasia_km/services4/system/omap4/sysconfig.h index b2eac60..64f3187 100644 --- a/jacinto6/sgx_src/eurasia_km/services4/system/omap4/sysconfig.h +++ b/jacinto6/sgx_src/eurasia_km/services4/system/omap4/sysconfig.h @@ -56,7 +56,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /* Allow the AP latency to be overridden in the build config */ #if !defined(SYS_SGX_ACTIVE_POWER_LATENCY_MS) -#define SYS_SGX_ACTIVE_POWER_LATENCY_MS (100) +#define SYS_SGX_ACTIVE_POWER_LATENCY_MS (2) #endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/oemfuncs.h b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/oemfuncs.h new file mode 100644 index 0000000..eab3174 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/oemfuncs.h @@ -0,0 +1,79 @@ +/*************************************************************************/ /*! +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#if !defined(__OEMFUNCS_H__) +#define __OEMFUNCS_H__ + +#if defined (__cplusplus) +extern "C" { +#endif + +/* function in/out data structures: */ +typedef IMG_UINT32 (*PFN_SRV_BRIDGEDISPATCH)( IMG_UINT32 Ioctl, + IMG_BYTE *pInBuf, + IMG_UINT32 InBufLen, + IMG_BYTE *pOutBuf, + IMG_UINT32 OutBufLen, + IMG_UINT32 *pdwBytesTransferred); +/* + Function table for kernel 3rd party driver to kernel services +*/ +typedef struct PVRSRV_DC_OEM_JTABLE_TAG +{ + PFN_SRV_BRIDGEDISPATCH pfnOEMBridgeDispatch; + IMG_PVOID pvDummy1; + IMG_PVOID pvDummy2; + IMG_PVOID pvDummy3; + +} PVRSRV_DC_OEM_JTABLE; + +#define OEM_GET_EXT_FUNCS (1<<1) + +#if defined(__cplusplus) +} +#endif + +#endif /* __OEMFUNCS_H__ */ + +/***************************************************************************** + End of file (oemfuncs.h) +*****************************************************************************/ + + diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysconfig.c b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysconfig.c new file mode 100644 index 0000000..e6c774e --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysconfig.c @@ -0,0 +1,1156 @@ +/*************************************************************************/ /*! +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#include "sysconfig.h" +#include "services_headers.h" +#include "kerneldisplay.h" +#include "oemfuncs.h" +#include "sgxinfo.h" +#include "sgxinfokm.h" +#include "syslocal.h" + +/* top level system data anchor point*/ +SYS_DATA* gpsSysData = (SYS_DATA*)IMG_NULL; +SYS_DATA gsSysData; +static SYS_SPECIFIC_DATA gsSysSpecificData; +SYS_SPECIFIC_DATA *gpsSysSpecificData; + +/* SGX structures */ +static IMG_UINT32 gui32SGXDeviceID; +static SGX_DEVICE_MAP gsSGXDeviceMap; +static PVRSRV_DEVICE_NODE *gpsSGXDevNode; + +#if defined(NO_HARDWARE) +static IMG_CPU_VIRTADDR gsSGXRegsCPUVAddr; +#endif + +#if defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) +extern struct platform_device *gpsPVRLDMDev; +#endif + +IMG_UINT32 PVRSRV_BridgeDispatchKM(IMG_UINT32 Ioctl, + IMG_BYTE *pInBuf, + IMG_UINT32 InBufLen, + IMG_BYTE *pOutBuf, + IMG_UINT32 OutBufLen, + IMG_UINT32 *pdwBytesTransferred); + +static INLINE PVRSRV_ERROR EnableSGXClocksWrap(SYS_DATA *psSysData) +{ + return EnableSGXClocks(psSysData, IMG_FALSE); +} + +static INLINE PVRSRV_ERROR EnableSystemClocksWrap(SYS_DATA *psSysData) +{ + PVRSRV_ERROR eError = EnableSystemClocks(psSysData); + +#if !defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + if(eError == PVRSRV_OK) + { + /* + * The SGX Clocks are enabled separately if active power + * management is enabled. + */ + eError = EnableSGXClocksWrap(psSysData); + if (eError != PVRSRV_OK) + { + DisableSystemClocks(psSysData); + } + } +#endif + + return eError; +} + +/*! +****************************************************************************** + + @Function SysLocateDevices + + @Description Specifies devices in the systems memory map + + @Input psSysData - sys data + + @Return PVRSRV_ERROR + +******************************************************************************/ +static PVRSRV_ERROR SysLocateDevices(SYS_DATA *psSysData) +{ +#if defined(NO_HARDWARE) + PVRSRV_ERROR eError; + IMG_CPU_PHYADDR sCpuPAddr; +#else +#if defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) + struct resource *dev_res; + int dev_irq; +#endif +#endif + + PVR_UNREFERENCED_PARAMETER(psSysData); + + /* SGX Device: */ + gsSGXDeviceMap.ui32Flags = 0x0; + +#if defined(NO_HARDWARE) + /* + * For no hardware, allocate some contiguous memory for the + * register block. + */ + + /* Registers */ + gsSGXDeviceMap.ui32RegsSize = SYS_SUNXI_SGX_REGS_SIZE; + + eError = OSBaseAllocContigMemory(gsSGXDeviceMap.ui32RegsSize, + &gsSGXRegsCPUVAddr, + &sCpuPAddr); + if(eError != PVRSRV_OK) + { + return eError; + } + gsSGXDeviceMap.sRegsCpuPBase = sCpuPAddr; + gsSGXDeviceMap.sRegsSysPBase = SysCpuPAddrToSysPAddr(gsSGXDeviceMap.sRegsCpuPBase); +#if defined(__linux__) + /* Indicate the registers are already mapped */ + gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr; +#else + /* + * FIXME: Could we just use the virtual address returned by + * OSBaseAllocContigMemory? + */ + gsSGXDeviceMap.pvRegsCpuVBase = IMG_NULL; +#endif + + OSMemSet(gsSGXRegsCPUVAddr, 0, gsSGXDeviceMap.ui32RegsSize); + + /* + device interrupt IRQ + Note: no interrupts available on no hardware system + */ + gsSGXDeviceMap.ui32IRQ = 0; + +#else /* defined(NO_HARDWARE) */ +#if defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) + gsSGXDeviceMap.sRegsSysPBase.uiAddr = SYS_SUNXI_SGX_REGS_SYS_PHYS_BASE; + gsSGXDeviceMap.sRegsCpuPBase = + SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase); + PVR_TRACE(("SGX register base: 0x%lx", (unsigned long)gsSGXDeviceMap.sRegsCpuPBase.uiAddr)); + + gsSGXDeviceMap.ui32RegsSize = SYS_SUNXI_SGX_REGS_SIZE; + PVR_TRACE(("SGX register size: %d",gsSGXDeviceMap.ui32RegsSize)); + + gsSGXDeviceMap.ui32IRQ = SYS_SUNXI_SGX_IRQ; + PVR_TRACE(("SGX IRQ: %d", gsSGXDeviceMap.ui32IRQ)); +#else /* defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) */ + gsSGXDeviceMap.sRegsSysPBase.uiAddr = SYS_SUNXI_SGX_REGS_SYS_PHYS_BASE; + gsSGXDeviceMap.sRegsCpuPBase = SysSysPAddrToCpuPAddr(gsSGXDeviceMap.sRegsSysPBase); + gsSGXDeviceMap.ui32RegsSize = SYS_SUNXI_SGX_REGS_SIZE; + + gsSGXDeviceMap.ui32IRQ = SYS_SUNXI_SGX_IRQ; + +#endif /* defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) */ +#endif /* defined(NO_HARDWARE) */ + +#if defined(PDUMP) + { + /* initialise memory region name for pdumping */ + static IMG_CHAR pszPDumpDevName[] = "SGXMEM"; + gsSGXDeviceMap.pszPDumpDevName = pszPDumpDevName; + } +#endif + + /* add other devices here: */ + + + return PVRSRV_OK; +} + + +/*! +****************************************************************************** + + @Function SysCreateVersionString + + @Description Read the version string + + @Return IMG_CHAR * : Version string + +******************************************************************************/ +static IMG_CHAR *SysCreateVersionString(void) +{ + static IMG_CHAR aszVersionString[100]; + SYS_DATA *psSysData; + IMG_UINT32 ui32SGXRevision; + IMG_INT32 i32Count; +#if !defined(NO_HARDWARE) + IMG_VOID *pvRegsLinAddr; + + pvRegsLinAddr = OSMapPhysToLin(gsSGXDeviceMap.sRegsCpuPBase, + gsSGXDeviceMap.ui32RegsSize, + PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, + IMG_NULL); + if(!pvRegsLinAddr) + { + return IMG_NULL; + } + + //ui32SGXRevision = OSReadHWReg((IMG_PVOID)((IMG_PBYTE)pvRegsLinAddr), + // EUR_CR_CORE_REVISION); + ui32SGXRevision = 0x10105; +#else + ui32SGXRevision = 0; +#endif + + SysAcquireData(&psSysData); + + i32Count = OSSNPrintf(aszVersionString, 100, + "SGX revision = %u.%u.%u", + (IMG_UINT)((ui32SGXRevision & EUR_CR_CORE_REVISION_MAJOR_MASK) + >> EUR_CR_CORE_REVISION_MAJOR_SHIFT), + (IMG_UINT)((ui32SGXRevision & EUR_CR_CORE_REVISION_MINOR_MASK) + >> EUR_CR_CORE_REVISION_MINOR_SHIFT), + (IMG_UINT)((ui32SGXRevision & EUR_CR_CORE_REVISION_MAINTENANCE_MASK) + >> EUR_CR_CORE_REVISION_MAINTENANCE_SHIFT) + ); + +#if !defined(NO_HARDWARE) + OSUnMapPhysToLin(pvRegsLinAddr, + SYS_SUNXI_SGX_REGS_SIZE, + PVRSRV_HAP_UNCACHED|PVRSRV_HAP_KERNEL_ONLY, + IMG_NULL); +#endif + + if(i32Count == -1) + { + return IMG_NULL; + } + + return aszVersionString; +} + + +/*! +****************************************************************************** + + @Function SysInitialise + + @Description Initialises kernel services at 'driver load' time + + @Return PVRSRV_ERROR : + +******************************************************************************/ +PVRSRV_ERROR SysInitialise(IMG_VOID) +{ + IMG_UINT32 i; + PVRSRV_ERROR eError; + PVRSRV_DEVICE_NODE *psDeviceNode; +#if !defined(SGX_DYNAMIC_TIMING_INFO) + SGX_TIMING_INFORMATION* psTimingInfo; +#endif + + gpsSysData = &gsSysData; + OSMemSet(gpsSysData, 0, sizeof(SYS_DATA)); + + gpsSysSpecificData = &gsSysSpecificData; + OSMemSet(gpsSysSpecificData, 0, sizeof(SYS_SPECIFIC_DATA)); + + gpsSysData->pvSysSpecificData = gpsSysSpecificData; + + eError = OSInitEnvData(&gpsSysData->pvEnvSpecificData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to setup env structure")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_ENVDATA); + + gpsSysData->ui32NumDevices = SYS_DEVICE_COUNT; + + /* init device ID's */ + for(i=0; i<SYS_DEVICE_COUNT; i++) + { + gpsSysData->sDeviceID[i].uiID = i; + gpsSysData->sDeviceID[i].bInUse = IMG_FALSE; + } + + gpsSysData->psDeviceNodeList = IMG_NULL; + gpsSysData->psQueueList = IMG_NULL; + + eError = SysInitialiseCommon(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed in SysInitialiseCommon")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + +#if !defined(SGX_DYNAMIC_TIMING_INFO) + /* Set up timing information*/ + psTimingInfo = &gsSGXDeviceMap.sTimingInfo; + psTimingInfo->ui32CoreClockSpeed = SYS_SGX_CLOCK_SPEED; + psTimingInfo->ui32HWRecoveryFreq = SYS_SGX_HWRECOVERY_TIMEOUT_FREQ; +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + psTimingInfo->bEnableActivePM = IMG_TRUE; +#else + psTimingInfo->bEnableActivePM = IMG_FALSE; +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + psTimingInfo->ui32ActivePowManLatencyms = SYS_SGX_ACTIVE_POWER_LATENCY_MS; + psTimingInfo->ui32uKernelFreq = SYS_SGX_PDS_TIMER_FREQ; +#endif + + /* + Setup the Source Clock Divider value + */ + gpsSysSpecificData->ui32SrcClockDiv = 3; + + /* + Locate the devices within the system, specifying + the physical addresses of each devices components + (regs, mem, ports etc.) + */ + eError = SysLocateDevices(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to locate devices")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV); + + eError = SysPMRuntimeRegister(); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register with OSPM!")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_PM_RUNTIME); + + eError = SysDvfsInitialize(gpsSysSpecificData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialize DVFS")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_DVFS_INIT); + + /* + Register devices with the system + This also sets up their memory maps/heaps + */ + eError = PVRSRVRegisterDevice(gpsSysData, SGXRegisterDevice, + DEVICE_SGX_INTERRUPT, &gui32SGXDeviceID); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to register device!")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_REGDEV); + + /* + Once all devices are registered, specify the backing store + and, if required, customise the memory heap config + */ + psDeviceNode = gpsSysData->psDeviceNodeList; + while(psDeviceNode) + { + /* perform any OEM SOC address space customisations here */ + switch(psDeviceNode->sDevId.eDeviceType) + { + case PVRSRV_DEVICE_TYPE_SGX: + { + DEVICE_MEMORY_INFO *psDevMemoryInfo; + DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; + + /* + specify the backing store to use for the devices MMU PT/PDs + - the PT/PDs are always UMA in this system + */ + psDeviceNode->psLocalDevMemArena = IMG_NULL; + + /* useful pointers */ + psDevMemoryInfo = &psDeviceNode->sDevMemoryInfo; + psDeviceMemoryHeap = psDevMemoryInfo->psDeviceMemoryHeap; + + /* specify the backing store for all SGX heaps */ + for(i=0; i<psDevMemoryInfo->ui32HeapCount; i++) + { + psDeviceMemoryHeap[i].ui32Attribs |= PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG; + } + + gpsSGXDevNode = psDeviceNode; + gsSysSpecificData.psSGXDevNode = psDeviceNode; + + break; + } + default: + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to find SGX device node!")); + return PVRSRV_ERROR_INIT_FAILURE; + } + + /* advance to next device */ + psDeviceNode = psDeviceNode->psNext; + } + + eError = EnableSystemClocksWrap(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to Enable system clocks (%d)", eError)); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS); +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + eError = EnableSGXClocksWrap(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to Enable SGX clocks (%d)", eError)); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + + eError = PVRSRVInitialiseDevice(gui32SGXDeviceID); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysInitialise: Failed to initialise device!")); + (IMG_VOID)SysDeinitialise(gpsSysData); + gpsSysData = IMG_NULL; + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITDEV); + +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + /* SGX defaults to D3 power state */ + DisableSGXClocks(gpsSysData); +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + + return PVRSRV_OK; +} + + +/*! +****************************************************************************** + + @Function SysFinalise + + @Description Final part of initialisation at 'driver load' time + + @Return PVRSRV_ERROR : + +******************************************************************************/ +PVRSRV_ERROR SysFinalise(IMG_VOID) +{ + PVRSRV_ERROR eError = PVRSRV_OK; + +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + eError = EnableSGXClocksWrap(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to Enable SGX clocks (%d)", eError)); + return eError; + } +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + + eError = OSInstallMISR(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to install MISR")); + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR); + +#if defined(SYS_USING_INTERRUPTS) + /* install a Device ISR */ + eError = OSInstallDeviceLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ, "SGX ISR", gpsSGXDevNode); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to install ISR")); + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR); +#if !defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + SysEnableSGXInterrupts(gpsSysData); +#endif +#endif /* defined(SYS_USING_INTERRUPTS) */ +#if defined(__linux__) + /* Create a human readable version string for this system */ + gpsSysData->pszVersionString = SysCreateVersionString(); + if (!gpsSysData->pszVersionString) + { + PVR_DPF((PVR_DBG_ERROR,"SysFinalise: Failed to create a system version string")); + } + else + { + PVR_TRACE(("SysFinalise: Version string: %s", gpsSysData->pszVersionString)); + } +#endif + +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + /* SGX defaults to D3 power state */ + DisableSGXClocks(gpsSysData); +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + + gpsSysSpecificData->bSGXInitComplete = IMG_TRUE; + + return eError; +} + + +/*! +****************************************************************************** + + @Function SysDeinitialise + + @Description De-initialises kernel services at 'driver unload' time + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysDeinitialise (SYS_DATA *psSysData) +{ + PVRSRV_ERROR eError; + + PVR_UNREFERENCED_PARAMETER(psSysData); + + if(gpsSysData->pvSOCTimerRegisterKM) + { + OSUnReservePhys(gpsSysData->pvSOCTimerRegisterKM, + 4, + PVRSRV_HAP_MULTI_PROCESS|PVRSRV_HAP_UNCACHED, + gpsSysData->hSOCTimerRegisterOSMemHandle); + } + + +#if defined(SYS_USING_INTERRUPTS) + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) + { + eError = OSUninstallDeviceLISR(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallDeviceLISR failed")); + return eError; + } + } +#endif + + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_MISR)) + { + eError = OSUninstallMISR(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: OSUninstallMISR failed")); + return eError; + } + } + + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_INITDEV)) + { +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + PVR_ASSERT(SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)); + /* Re-enable SGX clocks whilst SGX is being de-initialised */ + eError = EnableSGXClocks(gpsSysData, IMG_TRUE); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: EnableSGXClocks failed")); + return eError; + } +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + + /* De-initialise SGX */ + eError = PVRSRVDeinitialiseDevice (gui32SGXDeviceID); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init the device")); + return eError; + } + } + + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_DVFS_INIT)) + { + eError = SysDvfsDeinitialize(gpsSysSpecificData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: Failed to de-init DVFS")); + gpsSysData = IMG_NULL; + return eError; + } + } + + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_PM_RUNTIME)) + { + eError = SysPMRuntimeUnregister(); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: Failed to unregister with OSPM!")); + gpsSysData = IMG_NULL; + return eError; + } + } + + /* Disable system clocks - must happen after last access to hardware */ + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)) + { + DisableSystemClocks(gpsSysData); + } + + if (SYS_SPECIFIC_DATA_TEST(gpsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_ENVDATA)) + { + eError = OSDeInitEnvData(gpsSysData->pvEnvSpecificData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysDeinitialise: failed to de-init env structure")); + return eError; + } + } + + SysDeinitialiseCommon(gpsSysData); + +#if defined(NO_HARDWARE) + if(gsSGXRegsCPUVAddr != IMG_NULL) + { + /* Free hardware resources. */ + OSBaseFreeContigMemory(SYS_SUNXI_SGX_REGS_SIZE, gsSGXRegsCPUVAddr, gsSGXDeviceMap.sRegsCpuPBase); + gsSGXRegsCPUVAddr = IMG_NULL; + gsSGXDeviceMap.pvRegsCpuVBase = gsSGXRegsCPUVAddr; + } +#endif /* defined(NO_HARDWARE) */ + + + gpsSysSpecificData->ui32SysSpecificData = 0; + gpsSysSpecificData->bSGXInitComplete = IMG_FALSE; + + gpsSysData = IMG_NULL; + + return PVRSRV_OK; +} + + +/*! +****************************************************************************** + + @Function SysGetDeviceMemoryMap + + @Description returns a device address map for the specified device + + @Input eDeviceType - device type + @Input ppvDeviceMap - void ptr to receive device specific info. + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysGetDeviceMemoryMap(PVRSRV_DEVICE_TYPE eDeviceType, + IMG_VOID **ppvDeviceMap) +{ + + switch(eDeviceType) + { + case PVRSRV_DEVICE_TYPE_SGX: + { + /* just return a pointer to the structure */ + *ppvDeviceMap = (IMG_VOID*)&gsSGXDeviceMap; + + break; + } + default: + { + PVR_DPF((PVR_DBG_ERROR,"SysGetDeviceMemoryMap: unsupported device type")); + } + } + return PVRSRV_OK; +} + + +/*! +****************************************************************************** + @Function SysCpuPAddrToDevPAddr + + @Description Compute a device physical address from a cpu physical + address. Relevant when + + @Input cpu_paddr - cpu physical address. + @Input eDeviceType - device type required if DevPAddr + address spaces vary across devices + in the same system + @Return device physical address. + +******************************************************************************/ +IMG_DEV_PHYADDR SysCpuPAddrToDevPAddr(PVRSRV_DEVICE_TYPE eDeviceType, + IMG_CPU_PHYADDR CpuPAddr) +{ + IMG_DEV_PHYADDR DevPAddr; + + PVR_UNREFERENCED_PARAMETER(eDeviceType); + + /* Note: for UMA system we assume DevP == CpuP */ + DevPAddr.uiAddr = CpuPAddr.uiAddr - 0x40000000; + + return DevPAddr; +} + +/*! +****************************************************************************** + @Function SysSysPAddrToCpuPAddr + + @Description Compute a cpu physical address from a system physical + address. + + @Input sys_paddr - system physical address. + @Return cpu physical address. + +******************************************************************************/ +IMG_CPU_PHYADDR SysSysPAddrToCpuPAddr (IMG_SYS_PHYADDR sys_paddr) +{ + IMG_CPU_PHYADDR cpu_paddr; + + /* This would only be an inequality if the CPU's MMU did not point to + sys address 0, ie. multi CPU system */ + cpu_paddr.uiAddr = sys_paddr.uiAddr; + + return cpu_paddr; +} + +/*! +****************************************************************************** + @Function SysCpuPAddrToSysPAddr + + @Description Compute a system physical address from a cpu physical + address. + + @Input cpu_paddr - cpu physical address. + @Return device physical address. + +******************************************************************************/ +IMG_SYS_PHYADDR SysCpuPAddrToSysPAddr (IMG_CPU_PHYADDR cpu_paddr) +{ + IMG_SYS_PHYADDR sys_paddr; + + /* This would only be an inequality if the CPU's MMU did not point to + sys address 0, ie. multi CPU system */ + sys_paddr.uiAddr = cpu_paddr.uiAddr; + + return sys_paddr; +} + + +/*! +****************************************************************************** + @Function SysSysPAddrToDevPAddr + + @Description Compute a device physical address from a system physical + address. + + @Input SysPAddr - system physical address. + @Input eDeviceType - device type required if DevPAddr + address spaces vary across devices + in the same system + + @Return Device physical address. + +******************************************************************************/ +IMG_DEV_PHYADDR SysSysPAddrToDevPAddr(PVRSRV_DEVICE_TYPE eDeviceType, IMG_SYS_PHYADDR SysPAddr) +{ + IMG_DEV_PHYADDR DevPAddr; + + PVR_UNREFERENCED_PARAMETER(eDeviceType); + + /* Note: for UMA system we assume DevP == CpuP */ + DevPAddr.uiAddr = SysPAddr.uiAddr - 0x40000000; + + return DevPAddr; +} + + +/*! +****************************************************************************** + @Function SysDevPAddrToSysPAddr + + @Description Compute a device physical address from a system physical + address. + + @Input DevPAddr - device physical address. + @Input eDeviceType - device type required if DevPAddr + address spaces vary across devices + in the same system + + @Return System physical address. + +******************************************************************************/ +IMG_SYS_PHYADDR SysDevPAddrToSysPAddr(PVRSRV_DEVICE_TYPE eDeviceType, IMG_DEV_PHYADDR DevPAddr) +{ + IMG_SYS_PHYADDR SysPAddr; + + PVR_UNREFERENCED_PARAMETER(eDeviceType); + + /* Note: for UMA system we assume DevP == SysP */ + SysPAddr.uiAddr = DevPAddr.uiAddr + 0x40000000; + + return SysPAddr; +} + + +/***************************************************************************** + @Function SysRegisterExternalDevice + + @Description Called when a 3rd party device registers with services + + @Input psDeviceNode - the new device node. + + @Return IMG_VOID +*****************************************************************************/ +IMG_VOID SysRegisterExternalDevice(PVRSRV_DEVICE_NODE *psDeviceNode) +{ + PVR_UNREFERENCED_PARAMETER(psDeviceNode); +} + + +/***************************************************************************** + @Function SysRemoveExternalDevice + + @Description Called when a 3rd party device unregisters from services + + @Input psDeviceNode - the device node being removed. + + @Return IMG_VOID +*****************************************************************************/ +IMG_VOID SysRemoveExternalDevice(PVRSRV_DEVICE_NODE *psDeviceNode) +{ + PVR_UNREFERENCED_PARAMETER(psDeviceNode); +} + +/*! +****************************************************************************** + @Function SysGetInterruptSource + + @Description Returns System specific information about the device(s) that + generated the interrupt in the system + + @Input psSysData + @Input psDeviceNode + + @Return System specific information indicating which device(s) + generated the interrupt + +******************************************************************************/ +IMG_UINT32 SysGetInterruptSource(SYS_DATA *psSysData, + PVRSRV_DEVICE_NODE *psDeviceNode) +{ + PVR_UNREFERENCED_PARAMETER(psSysData); +#if defined(NO_HARDWARE) + /* no interrupts in no_hw system just return all bits */ + return 0xFFFFFFFF; +#else + /* Not a shared irq, so we know this is an interrupt for this device */ + return psDeviceNode->ui32SOCInterruptBit; +#endif +} + + +/*! +****************************************************************************** + @Function SysClearInterrupts + + @Description Clears specified system interrupts + + @Input psSysData + @Input ui32ClearBits + + @Return IMG_VOID + +******************************************************************************/ +IMG_VOID SysClearInterrupts(SYS_DATA* psSysData, IMG_UINT32 ui32ClearBits) +{ + PVR_UNREFERENCED_PARAMETER(ui32ClearBits); + PVR_UNREFERENCED_PARAMETER(psSysData); +#if !defined(NO_HARDWARE) + /* Flush posted writes */ + OSReadHWReg(((PVRSRV_SGXDEV_INFO *)gpsSGXDevNode->pvDevice)->pvRegsBaseKM, EUR_CR_EVENT_HOST_CLEAR); +#endif /* defined(NO_HARDWARE) */ +} + + +/*! +****************************************************************************** + + @Function SysSystemPrePowerState + + @Description Perform system-level processing required before a power transition + + @Input eNewPowerState : + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysSystemPrePowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) +{ + PVRSRV_ERROR eError = PVRSRV_OK; + + if (eNewPowerState == PVRSRV_SYS_POWER_STATE_D3) + { + PVR_TRACE(("SysSystemPrePowerState: Entering state D3")); + +#if defined(SYS_USING_INTERRUPTS) + if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR)) + { +#if defined(SYS_CUSTOM_POWERLOCK_WRAP) + IMG_BOOL bWrapped = WrapSystemPowerChange(&gsSysSpecificData); +#endif + eError = OSUninstallDeviceLISR(gpsSysData); +#if defined(SYS_CUSTOM_POWERLOCK_WRAP) + if (bWrapped) + { + UnwrapSystemPowerChange(&gsSysSpecificData); + } +#endif + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysSystemPrePowerState: OSUninstallDeviceLISR failed (%d)", eError)); + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR); + SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR); + } +#endif + + if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS)) + { + DisableSystemClocks(gpsSysData); + + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS); + SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS); + } + } + + return eError; +} + + +/*! +****************************************************************************** + + @Function SysSystemPostPowerState + + @Description Perform system-level processing required after a power transition + + @Input eNewPowerState : + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysSystemPostPowerState(PVRSRV_SYS_POWER_STATE eNewPowerState) +{ + PVRSRV_ERROR eError = PVRSRV_OK; + if (eNewPowerState == PVRSRV_SYS_POWER_STATE_D0) + { + PVR_TRACE(("SysSystemPostPowerState: Entering state D0")); + + if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS)) + { + eError = EnableSystemClocksWrap(gpsSysData); + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: EnableSystemClocksWrap failed (%d)", eError)); + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS); + SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS); + } + +#if defined(SYS_USING_INTERRUPTS) + if (SYS_SPECIFIC_DATA_TEST(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR)) + { +#if defined(SYS_CUSTOM_POWERLOCK_WRAP) + IMG_BOOL bWrapped = WrapSystemPowerChange(&gsSysSpecificData); +#endif + + eError = OSInstallDeviceLISR(gpsSysData, gsSGXDeviceMap.ui32IRQ, "SGX ISR", gpsSGXDevNode); +#if defined(SYS_CUSTOM_POWERLOCK_WRAP) + if (bWrapped) + { + UnwrapSystemPowerChange(&gsSysSpecificData); + } +#endif + if (eError != PVRSRV_OK) + { + PVR_DPF((PVR_DBG_ERROR,"SysSystemPostPowerState: OSInstallDeviceLISR failed to install ISR (%d)", eError)); + return eError; + } + SYS_SPECIFIC_DATA_SET(&gsSysSpecificData, SYS_SPECIFIC_DATA_ENABLE_LISR); + SYS_SPECIFIC_DATA_CLEAR(&gsSysSpecificData, SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR); + } +#endif + } + return eError; +} + + +/*! +****************************************************************************** + + @Function SysDevicePrePowerState + + @Description Perform system level processing required before a device power + transition + + @Input ui32DeviceIndex : + @Input eNewPowerState : + @Input eCurrentPowerState : + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysDevicePrePowerState(IMG_UINT32 ui32DeviceIndex, + PVRSRV_DEV_POWER_STATE eNewPowerState, + PVRSRV_DEV_POWER_STATE eCurrentPowerState) +{ + PVR_UNREFERENCED_PARAMETER(eCurrentPowerState); + if (ui32DeviceIndex != gui32SGXDeviceID) + { + return PVRSRV_OK; + } + +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + if (eNewPowerState == PVRSRV_DEV_POWER_STATE_OFF) + { + PVR_DPF((PVR_DBG_MESSAGE, "SysDevicePrePowerState: SGX Entering state D3")); + DisableSGXClocks(gpsSysData); + } +#else /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + PVR_UNREFERENCED_PARAMETER(eNewPowerState ); +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + return PVRSRV_OK; +} + + +/*! +****************************************************************************** + + @Function SysDevicePostPowerState + + @Description Perform system level processing required after a device power + transition + + @Input ui32DeviceIndex : + @Input eNewPowerState : + @Input eCurrentPowerState : + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR SysDevicePostPowerState(IMG_UINT32 ui32DeviceIndex, + PVRSRV_DEV_POWER_STATE eNewPowerState, + PVRSRV_DEV_POWER_STATE eCurrentPowerState) +{ + PVRSRV_ERROR eError = PVRSRV_OK; + + PVR_UNREFERENCED_PARAMETER(eNewPowerState); + if (ui32DeviceIndex != gui32SGXDeviceID) + { + return eError; + } + +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + if (eCurrentPowerState == PVRSRV_DEV_POWER_STATE_OFF) + { + PVR_DPF((PVR_DBG_MESSAGE, "SysDevicePostPowerState: SGX Leaving state D3")); + eError = EnableSGXClocksWrap(gpsSysData); + } +#else /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + PVR_UNREFERENCED_PARAMETER(eCurrentPowerState); +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + + return eError; +} + +#if defined(SYS_SUPPORTS_SGX_IDLE_CALLBACK) + +IMG_VOID SysSGXIdleTransition(IMG_BOOL bSGXIdle) +{ + PVR_DPF((PVR_DBG_MESSAGE, "SysSGXIdleTransition switch to %u", bSGXIdle)); +} + +#endif /* defined(SYS_SUPPORTS_SGX_IDLE_CALLBACK) */ + +/***************************************************************************** + @Function SysOEMFunction + + @Description marshalling function for custom OEM functions + + @Input ui32ID - function ID + @Input pvIn - in data + @Output pvOut - out data + + @Return PVRSRV_ERROR +*****************************************************************************/ +PVRSRV_ERROR SysOEMFunction ( IMG_UINT32 ui32ID, + IMG_VOID *pvIn, + IMG_UINT32 ulInSize, + IMG_VOID *pvOut, + IMG_UINT32 ulOutSize) +{ + PVR_UNREFERENCED_PARAMETER(ui32ID); + PVR_UNREFERENCED_PARAMETER(pvIn); + PVR_UNREFERENCED_PARAMETER(ulInSize); + PVR_UNREFERENCED_PARAMETER(pvOut); + PVR_UNREFERENCED_PARAMETER(ulOutSize); + + if ((ui32ID == OEM_GET_EXT_FUNCS) && + (ulOutSize == sizeof(PVRSRV_DC_OEM_JTABLE))) + { + PVRSRV_DC_OEM_JTABLE *psOEMJTable = (PVRSRV_DC_OEM_JTABLE*) pvOut; + psOEMJTable->pfnOEMBridgeDispatch = &PVRSRV_BridgeDispatchKM; + return PVRSRV_OK; + } + + return PVRSRV_ERROR_INVALID_PARAMS; +} +/****************************************************************************** + End of file (sysconfig.c) +******************************************************************************/ diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysconfig.h b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysconfig.h new file mode 100644 index 0000000..1441311 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysconfig.h @@ -0,0 +1,82 @@ +/*************************************************************************/ /*! +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#if !defined(__SOCCONFIG_H__) +#define __SOCCONFIG_H__ +#include <mach/irqs-sun6i.h> +#define VS_PRODUCT_NAME "sunxi" + +#define SYS_SGX_CLOCK_SPEED 300000000 +#define SYS_SGX_CORE_CLOCK_SPEED 300000000 +#define SYS_SGX_HYD_CLOCK_SPEED 330000000 + +#define SYS_SGX_HWRECOVERY_TIMEOUT_FREQ (100) // 10ms (100hz) +#define SYS_SGX_PDS_TIMER_FREQ (1000) // 1ms (1000hz) + +/* Allow the AP latency to be overridden in the build config */ +#if !defined(SYS_SGX_ACTIVE_POWER_LATENCY_MS) +#define SYS_SGX_ACTIVE_POWER_LATENCY_MS (2) +#endif + + +#define SYS_SUNXI_SGX_REGS_SYS_PHYS_BASE 0x01C40000 +#define SYS_SUNXI_SGX_REGS_SIZE 0xFFFF + +#define SYS_SUNXI_SGX_IRQ AW_IRQ_GPU /* IC 129, FPGA 58 SUNXI IRQ's aren't offset by 32 */ + +/* Interrupt bits */ +#define DEVICE_SGX_INTERRUPT (1<<0) +#define DEVICE_MSVDX_INTERRUPT (1<<1) +#define DEVICE_DISP_INTERRUPT (1<<2) + +#if defined(__linux__) + +#if defined(PVR_LDM_PLATFORM_PRE_REGISTERED_DEV) +#define SYS_SGX_DEV_NAME PVR_LDM_PLATFORM_PRE_REGISTERED_DEV +#else +#define SYS_SGX_DEV_NAME "sunxi_gpu" +#endif /* defined(PVR_LDM_PLATFORM_PRE_REGISTERED_DEV) */ +#endif /* defined(__linux__) */ + +/***************************************************************************** + * system specific data structures + *****************************************************************************/ + +#endif /* __SYSCONFIG_H__ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysinfo.h b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysinfo.h new file mode 100644 index 0000000..d193fde --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysinfo.h @@ -0,0 +1,57 @@ +/*************************************************************************/ /*! +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#if !defined(__SYSINFO_H__) +#define __SYSINFO_H__ + +/*!< System specific poll/timeout details */ +/* + * The workqueue based 3rd party display driver may be blocked for up + * to 500ms waiting for a vsync when the screen goes blank, so we + * need to wait longer for the hardware if a flush of the swap chain is + * required. + */ +#define MAX_HW_TIME_US (1000000) +#define WAIT_TRY_COUNT (20000) + + +#define SYS_DEVICE_COUNT 15 /* SGX, DISPLAYCLASS (external), BUFFERCLASS (external) */ + +#endif /* __SYSINFO_H__ */ diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/syslocal.h b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/syslocal.h new file mode 100644 index 0000000..06cc523 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/syslocal.h @@ -0,0 +1,189 @@ +/*************************************************************************/ /*! +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#if !defined(__SYSLOCAL_H__) +#define __SYSLOCAL_H__ + +#if defined(__linux__) + +#include <linux/version.h> +#include <linux/clk.h> +#include <linux/mutex.h> +#include <asm/atomic.h> + +#include <linux/semaphore.h> +#include <linux/resource.h> + +#if defined(PVR_LINUX_DYNAMIC_SGX_RESOURCE_INFO) +#include <linux/platform_device.h> +#endif + +#if !defined(LDM_PLATFORM) +#error "LDM_PLATFORM must be set" +#endif +#if !defined(PVR_LINUX_USING_WORKQUEUES) +#error "PVR_LINUX_USING_WORKQUEUES must be set" +#endif + +#endif /* defined(__linux__) */ + +#if defined (__cplusplus) +extern "C" { +#endif + +/***************************************************************************** + * system specific data structures + *****************************************************************************/ + +/***************************************************************************** + * system specific function prototypes + *****************************************************************************/ + +IMG_VOID DisableSystemClocks(SYS_DATA *psSysData); +PVRSRV_ERROR EnableSystemClocks(SYS_DATA *psSysData); + +IMG_VOID DisableSGXClocks(SYS_DATA *psSysData); +PVRSRV_ERROR EnableSGXClocks(SYS_DATA *psSysData, IMG_BOOL bNoDev); + +/* + * Various flags to indicate what has been initialised, and what + * has been temporarily deinitialised for power management purposes. + */ +#define SYS_SPECIFIC_DATA_ENABLE_SYSCLOCKS 0x00000001 +#define SYS_SPECIFIC_DATA_ENABLE_LISR 0x00000002 +#define SYS_SPECIFIC_DATA_ENABLE_MISR 0x00000004 +#define SYS_SPECIFIC_DATA_ENABLE_ENVDATA 0x00000008 +#define SYS_SPECIFIC_DATA_ENABLE_LOCDEV 0x00000010 +#define SYS_SPECIFIC_DATA_ENABLE_REGDEV 0x00000020 +#define SYS_SPECIFIC_DATA_ENABLE_PDUMPINIT 0x00000040 +#define SYS_SPECIFIC_DATA_ENABLE_INITDEV 0x00000080 +#define SYS_SPECIFIC_DATA_ENABLE_LOCATEDEV 0x00000100 + +#define SYS_SPECIFIC_DATA_PM_UNINSTALL_LISR 0x00000200 +#define SYS_SPECIFIC_DATA_PM_DISABLE_SYSCLOCKS 0x00000400 +#define SYS_SPECIFIC_DATA_ENABLE_OCPREGS 0x00000800 +#define SYS_SPECIFIC_DATA_ENABLE_PM_RUNTIME 0x00001000 +#define SYS_SPECIFIC_DATA_IRQ_ENABLED 0x00002000 +#define SYS_SPECIFIC_DATA_DVFS_INIT 0x00004000 + +#define SYS_SPECIFIC_DATA_SET(psSysSpecData, flag) ((IMG_VOID)((psSysSpecData)->ui32SysSpecificData |= (flag))) + +#define SYS_SPECIFIC_DATA_CLEAR(psSysSpecData, flag) ((IMG_VOID)((psSysSpecData)->ui32SysSpecificData &= ~(flag))) + +#define SYS_SPECIFIC_DATA_TEST(psSysSpecData, flag) (((psSysSpecData)->ui32SysSpecificData & (flag)) != 0) + +typedef struct _SYS_SPECIFIC_DATA_TAG_ +{ + IMG_UINT32 ui32SysSpecificData; + PVRSRV_DEVICE_NODE *psSGXDevNode; + IMG_BOOL bSGXInitComplete; +#if !defined(__linux__) + IMG_BOOL bSGXClocksEnabled; +#endif + IMG_UINT32 ui32SrcClockDiv; +#if defined(__linux__) + IMG_BOOL bSysClocksOneTimeInit; + atomic_t sSGXClocksEnabled; + struct mutex sPowerLock; + IMG_BOOL bPMRuntimeGetSync; +#endif /* defined(__linux__) */ +} SYS_SPECIFIC_DATA; + +extern SYS_SPECIFIC_DATA *gpsSysSpecificData; + +#define SysEnableSGXInterrupts(psSysData) +#define SysDisableSGXInterrupts(psSysData) + +#if defined(SYS_CUSTOM_POWERLOCK_WRAP) +IMG_BOOL WrapSystemPowerChange(SYS_SPECIFIC_DATA *psSysSpecData); +IMG_VOID UnwrapSystemPowerChange(SYS_SPECIFIC_DATA *psSysSpecData); +#endif + +#if defined(__linux__) + +PVRSRV_ERROR SysPMRuntimeRegister(void); +PVRSRV_ERROR SysPMRuntimeUnregister(void); + +PVRSRV_ERROR SysDvfsInitialize(SYS_SPECIFIC_DATA *psSysSpecificData); +PVRSRV_ERROR SysDvfsDeinitialize(SYS_SPECIFIC_DATA *psSysSpecificData); + +#else /* defined(__linux__) */ + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SysPMRuntimeRegister) +#endif +static INLINE PVRSRV_ERROR SysPMRuntimeRegister(void) +{ + return PVRSRV_OK; +} + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SysPMRuntimeUnregister) +#endif +static INLINE PVRSRV_ERROR SysPMRuntimeUnregister(void) +{ + return PVRSRV_OK; +} + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SysDvfsInitialize) +#endif +static INLINE PVRSRV_ERROR SysDvfsInitialize(void) +{ + return PVRSRV_OK; +} + +#ifdef INLINE_IS_PRAGMA +#pragma inline(SysDvfsDeinitialize) +#endif +static INLINE PVRSRV_ERROR SysDvfsDeinitialize(void) +{ + return PVRSRV_OK; +} + +#endif /* defined(__linux__) */ + +#if defined(__cplusplus) +} +#endif + +#endif /* __SYSLOCAL_H__ */ + + diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysutils.c b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysutils.c new file mode 100644 index 0000000..b4c87a7 --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysutils.c @@ -0,0 +1,45 @@ +/*************************************************************************/ /*! +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +/* Pull in the correct system dependent sysutils source */ + +#if defined(__linux__) +#include "sysutils_linux.c" +#endif diff --git a/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysutils_linux.c b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysutils_linux.c new file mode 100644 index 0000000..f58a7fc --- /dev/null +++ b/jacinto6/sgx_src/eurasia_km/services4/system/sunxi/sysutils_linux.c @@ -0,0 +1,509 @@ +/*************************************************************************/ /*! +@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved +@License Dual MIT/GPLv2 + +The contents of this file are subject to the MIT license as set out below. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Alternatively, the contents of this file may be used under the terms of +the GNU General Public License Version 2 ("GPL") in which case the provisions +of GPL are applicable instead of those above. + +If you wish to allow use of your version of this file only under the terms of +GPL, and not to allow others to use your version of this file under the terms +of the MIT license, indicate your decision by deleting the provisions above +and replace them with the notice and other provisions required by GPL as set +out in the file called "GPL-COPYING" included in this distribution. If you do +not delete the provisions above, a recipient may use your version of this file +under the terms of either the MIT license or GPL. + +This License is also included in this distribution in the file called +"MIT-COPYING". + +EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS +PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ /**************************************************************************/ + +#include <linux/version.h> +#include <linux/clk.h> +#include <linux/err.h> +#include <linux/hardirq.h> +#include <linux/mutex.h> +#include <linux/slab.h> + +#include "sgxdefs.h" +#include "services_headers.h" +#include "sysinfo.h" +#include "sgxapi_km.h" +#include "sysconfig.h" +#include "sgxinfokm.h" +#include "syslocal.h" + +#include <linux/platform_device.h> +#include <linux/pm_runtime.h> +#include <linux/regulator/consumer.h> +#include <mach/hardware.h> +#include <mach/platform.h> +#include <mach/clock.h> + +static struct clk *h_ahb_gpu, *h_gpu_coreclk, *h_gpu_hydclk, *h_gpu_memclk, *h_gpu_hydpll, *h_gpu_corepll; +static struct regulator *gpu_power; + +extern struct platform_device *gpsPVRLDMDev; + +static PVRSRV_ERROR PowerLockWrap(SYS_SPECIFIC_DATA *psSysSpecData, IMG_BOOL bTryLock) +{ + if (!in_interrupt()) + { + if (bTryLock) + { + int locked = mutex_trylock(&psSysSpecData->sPowerLock); + if (locked == 0) + { + return PVRSRV_ERROR_RETRY; + } + } + else + { + mutex_lock(&psSysSpecData->sPowerLock); + } + } + + return PVRSRV_OK; +} + +static IMG_VOID PowerLockUnwrap(SYS_SPECIFIC_DATA *psSysSpecData) +{ + if (!in_interrupt()) + { + mutex_unlock(&psSysSpecData->sPowerLock); + } +} + +PVRSRV_ERROR SysPowerLockWrap(IMG_BOOL bTryLock) +{ + SYS_DATA *psSysData; + + SysAcquireData(&psSysData); + + return PowerLockWrap(psSysData->pvSysSpecificData, bTryLock); +} + +IMG_VOID SysPowerLockUnwrap(IMG_VOID) +{ + SYS_DATA *psSysData; + + SysAcquireData(&psSysData); + + PowerLockUnwrap(psSysData->pvSysSpecificData); +} + +/* + * This function should be called to unwrap the Services power lock, prior + * to calling any function that might sleep. + * This function shouldn't be called prior to calling EnableSystemClocks + * or DisableSystemClocks, as those functions perform their own power lock + * unwrapping. + * If the function returns IMG_TRUE, UnwrapSystemPowerChange must be + * called to rewrap the power lock, prior to returning to Services. + */ +IMG_BOOL WrapSystemPowerChange(SYS_SPECIFIC_DATA *psSysSpecData) +{ + + return IMG_TRUE; +} + +IMG_VOID UnwrapSystemPowerChange(SYS_SPECIFIC_DATA *psSysSpecData) +{ + +} + +/* + * Return SGX timining information to caller. + */ +IMG_VOID SysGetSGXTimingInformation(SGX_TIMING_INFORMATION *psTimingInfo) +{ +#if !defined(NO_HARDWARE) + PVR_ASSERT(atomic_read(&gpsSysSpecificData->sSGXClocksEnabled) != 0); +#endif + psTimingInfo->ui32CoreClockSpeed = SYS_SGX_CLOCK_SPEED; + psTimingInfo->ui32HWRecoveryFreq = SYS_SGX_HWRECOVERY_TIMEOUT_FREQ; + psTimingInfo->ui32uKernelFreq = SYS_SGX_PDS_TIMER_FREQ; +#if defined(SUPPORT_ACTIVE_POWER_MANAGEMENT) + psTimingInfo->bEnableActivePM = IMG_TRUE; +#else + psTimingInfo->bEnableActivePM = IMG_FALSE; +#endif /* SUPPORT_ACTIVE_POWER_MANAGEMENT */ + psTimingInfo->ui32ActivePowManLatencyms = SYS_SGX_ACTIVE_POWER_LATENCY_MS; +} + +/*! +****************************************************************************** + + @Function EnableSGXClocks + + @Description Enable SGX clocks + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR EnableSGXClocks(SYS_DATA *psSysData, IMG_BOOL bNoDev) +{ +#if !defined(NO_HARDWARE) + SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; + + /* SGX clocks already enabled? */ + if (atomic_read(&psSysSpecData->sSGXClocksEnabled) != 0) + { + return PVRSRV_OK; + } + + PVR_DPF((PVR_DBG_MESSAGE, "EnableSGXClocks: Enabling SGX Clocks")); + + /*open clock*/ + if (clk_enable(h_gpu_hydclk)) + { + printk(KERN_ALERT "GPU hyd clk enable failed\n"); + } + if (clk_enable(h_gpu_coreclk)) + { + printk(KERN_ALERT "GPU core clk enable failed\n"); + } + if (clk_enable(h_ahb_gpu)) + { + printk(KERN_ALERT "GPU ahb clk enable failed\n"); + } + if (clk_enable(h_gpu_memclk)) + { + printk(KERN_ALERT "GPU mem clk enable failed\n"); + } + + /* + * pm_runtime_get_sync will fail if called as part of device + * unregistration. + */ + if (!bNoDev) + { + /* + * pm_runtime_get_sync returns 1 after the module has + * been reloaded. + */ + int res = pm_runtime_get_sync(&gpsPVRLDMDev->dev); + if (res < 0) + { + PVR_DPF((PVR_DBG_ERROR, "EnableSGXClocks: pm_runtime_get_sync failed (%d)", -res)); + return PVRSRV_ERROR_UNABLE_TO_ENABLE_CLOCK; + } + psSysSpecData->bPMRuntimeGetSync = IMG_TRUE; + } + + SysEnableSGXInterrupts(psSysData); + + /* Indicate that the SGX clocks are enabled */ + atomic_set(&psSysSpecData->sSGXClocksEnabled, 1); + +#else /* !defined(NO_HARDWARE) */ + PVR_UNREFERENCED_PARAMETER(psSysData); +#endif /* !defined(NO_HARDWARE) */ + return PVRSRV_OK; +} + + +/*! +****************************************************************************** + + @Function DisableSGXClocks + + @Description Disable SGX clocks. + + @Return none + +******************************************************************************/ +IMG_VOID DisableSGXClocks(SYS_DATA *psSysData) +{ +#if !defined(NO_HARDWARE) + SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; + + /* SGX clocks already disabled? */ + if (atomic_read(&psSysSpecData->sSGXClocksEnabled) == 0) + { + return; + } + + PVR_DPF((PVR_DBG_MESSAGE, "DisableSGXClocks: Disabling SGX Clocks")); + + SysDisableSGXInterrupts(psSysData); + + /*close clock*/ + if (NULL == h_gpu_memclk || IS_ERR(h_gpu_memclk)) + { + printk(KERN_CRIT "GPU mem clk handle is invalid\n"); + } + else + { + clk_disable(h_gpu_memclk); + } + if (NULL == h_ahb_gpu || IS_ERR(h_ahb_gpu)) + { + printk(KERN_CRIT "GPU ahb clk handle is invalid\n"); + } + else + { + clk_disable(h_ahb_gpu); + } + if (NULL == h_gpu_coreclk || IS_ERR(h_gpu_coreclk)) + { + printk(KERN_CRIT "GPU core clk handle is invalid\n"); + } + else + { + clk_disable(h_gpu_coreclk); + } + if (NULL == h_gpu_hydclk || IS_ERR(h_gpu_hydclk)) + { + printk(KERN_CRIT "GPU hyd clk handle is invalid\n"); + } + else + { + clk_disable(h_gpu_hydclk); + } + + if (psSysSpecData->bPMRuntimeGetSync) + { + int res = pm_runtime_put_sync(&gpsPVRLDMDev->dev); + if (res < 0) + { + PVR_DPF((PVR_DBG_ERROR, "DisableSGXClocks: pm_runtime_put_sync failed (%d)", -res)); + } + psSysSpecData->bPMRuntimeGetSync = IMG_FALSE; + } + + /* Indicate that the SGX clocks are disabled */ + atomic_set(&psSysSpecData->sSGXClocksEnabled, 0); + +#else /* !defined(NO_HARDWARE) */ + PVR_UNREFERENCED_PARAMETER(psSysData); +#endif /* !defined(NO_HARDWARE) */ +} + +/*! +****************************************************************************** + + @Function EnableSystemClocks + + @Description Setup up the clocks for the graphics device to work. + + @Return PVRSRV_ERROR + +******************************************************************************/ +PVRSRV_ERROR EnableSystemClocks(SYS_DATA *psSysData) +{ + SYS_SPECIFIC_DATA *psSysSpecData = (SYS_SPECIFIC_DATA *) psSysData->pvSysSpecificData; + int pwr_reg; + + PVR_TRACE(("EnableSystemClocks: Enabling System Clocks")); + if (!psSysSpecData->bSysClocksOneTimeInit) + { + /* GPU power setup */ + gpu_power = regulator_get(NULL,"axp22_dcdc2"); + if (IS_ERR(gpu_power)) + { + printk(KERN_ALERT "GPU power setup failed\n"); + } + + /* Set up PLL and clock parents */ + h_gpu_hydpll = clk_get(NULL,CLK_SYS_PLL8); + if (!h_gpu_hydpll || IS_ERR(h_gpu_hydpll)) + { + printk(KERN_ALERT "clk_get of sys_pll8 failed\n"); + } + h_gpu_corepll = clk_get(NULL,CLK_SYS_PLL9); + if (!h_gpu_corepll || IS_ERR(h_gpu_corepll)) + { + printk(KERN_ALERT "clk_get of sys_pll9 failed\n"); + } + h_ahb_gpu = clk_get(NULL, CLK_AHB_GPU); + if (!h_ahb_gpu || IS_ERR(h_ahb_gpu)) + { + printk(KERN_ALERT "clk_get of adb_gpu failed\n"); + } + h_gpu_coreclk = clk_get(NULL, CLK_MOD_GPUCORE); + if (!h_gpu_coreclk || IS_ERR(h_gpu_coreclk)) + { + printk(KERN_ALERT "clk_get of mod_gpucore failed\n"); + } + h_gpu_memclk = clk_get(NULL, CLK_MOD_GPUMEM); + if (!h_gpu_memclk || IS_ERR(h_gpu_memclk)) + { + printk(KERN_ALERT "clk_get of mod_gpumem failed\n"); + } + h_gpu_hydclk = clk_get(NULL, CLK_MOD_GPUHYD); + if (!h_gpu_hydclk || IS_ERR(h_gpu_hydclk)) + { + printk(KERN_ALERT "clk_get of mod_gouhyd failed\n"); + } + + /* Set PLL frequency*/ + if (clk_set_rate(h_gpu_hydpll, SYS_SGX_HYD_CLOCK_SPEED)) + { + printk(KERN_ALERT "clk_set of gpu_hydpll rate %d failed\n", SYS_SGX_HYD_CLOCK_SPEED); + } + if (clk_set_rate(h_gpu_corepll, SYS_SGX_CORE_CLOCK_SPEED)) + { + printk(KERN_ALERT "clk_set of gpu_corepll rate %d failed\n", SYS_SGX_CORE_CLOCK_SPEED); + } + + /* Set clock parents */ + if (clk_set_parent(h_gpu_hydclk, h_gpu_hydpll)) + { + printk(KERN_ALERT "clk_set of gpu_hydclk parent to gpu_hydpll failed\n"); + } + if (clk_set_parent(h_gpu_memclk, h_gpu_hydpll)) + { + printk(KERN_ALERT "clk_set of gpu_memclk parent to gpu_hydpll failed\n"); + } + if (clk_set_parent(h_gpu_coreclk, h_gpu_corepll)) + { + printk(KERN_ALERT "clk_set of gpu_coreclk parent to gpu_corepll failed\n"); + } + + mutex_init(&psSysSpecData->sPowerLock); + + atomic_set(&psSysSpecData->sSGXClocksEnabled, 0); + + psSysSpecData->bSysClocksOneTimeInit = IMG_TRUE; + } + + /* Enable GPU power */ + printk(KERN_DEBUG "GPU power on\n"); + if (regulator_enable(gpu_power)) + { + printk(KERN_ALERT "GPU power on failed\n"); + } + /* GPU power off gating as invalid */ + pwr_reg = readl(IO_ADDRESS(AW_R_PRCM_BASE) + 0x118); + pwr_reg &= (~(0x1)); + writel(pwr_reg, IO_ADDRESS(AW_R_PRCM_BASE) + 0x118); + + OSSleepms(2); + + if (clk_reset(h_gpu_coreclk,AW_CCU_CLK_NRESET)) + { + printk(KERN_ALERT "NRESET of gpu_clk failed\n"); + } + /* Enable PLL, in EnableSystemClocks temporarily */ + if (clk_enable(h_gpu_hydpll)) + { + printk(KERN_ALERT "enable of gpu_hydpll output failed\n"); + } + if (clk_enable(h_gpu_corepll)) + { + printk(KERN_ALERT "enable of gpu_corepll output failed\n"); + } + + return PVRSRV_OK; +} + +/*! +****************************************************************************** + + @Function DisableSystemClocks + + @Description Disable the graphics clocks. + + @Return none + +******************************************************************************/ +IMG_VOID DisableSystemClocks(SYS_DATA *psSysData) +{ + int pwr_reg; + + PVR_TRACE(("DisableSystemClocks: Disabling System Clocks")); + /* + * Always disable the SGX clocks when the system clocks are disabled. + * This saves having to make an explicit call to DisableSGXClocks if + * active power management is enabled. + */ + DisableSGXClocks(psSysData); + + if (clk_reset(h_gpu_coreclk,AW_CCU_CLK_RESET)) + { + printk(KERN_CRIT "RESET of gpu_coreclk failed\n"); + } + + /* Disable PLL, in DisableSystemClocks temporarily */ + if (NULL == h_gpu_hydpll || IS_ERR(h_gpu_hydpll)) + { + printk(KERN_ALERT "gpu_hydpll handle is invalid\n"); + } + else + { + clk_disable(h_gpu_hydpll); + } + if (NULL == h_gpu_corepll || IS_ERR(h_gpu_corepll)) + { + printk(KERN_ALERT "gpu_corepll is invalid\n"); + } + else + { + clk_disable(h_gpu_corepll); + } + + /* GPU power off gating valid */ + pwr_reg = readl(IO_ADDRESS(AW_R_PRCM_BASE) + 0x118); + pwr_reg |= 0x1; + writel(pwr_reg, IO_ADDRESS(AW_R_PRCM_BASE) + 0x118); + + /* GPU power off */ + printk(KERN_DEBUG "GPU power off\n"); + if (regulator_is_enabled(gpu_power)) + { + if (regulator_disable(gpu_power)) + { + printk(KERN_ALERT "GPU power off failed\n"); + } + } +} + +PVRSRV_ERROR SysPMRuntimeRegister(void) +{ + pm_runtime_enable(&gpsPVRLDMDev->dev); + + return PVRSRV_OK; +} + +PVRSRV_ERROR SysPMRuntimeUnregister(void) +{ + pm_runtime_disable(&gpsPVRLDMDev->dev); + + return PVRSRV_OK; +} + +PVRSRV_ERROR SysDvfsInitialize(SYS_SPECIFIC_DATA *psSysSpecificData) +{ + PVR_UNREFERENCED_PARAMETER(psSysSpecificData); + + return PVRSRV_OK; +} + +PVRSRV_ERROR SysDvfsDeinitialize(SYS_SPECIFIC_DATA *psSysSpecificData) +{ + PVR_UNREFERENCED_PARAMETER(psSysSpecificData); + + return PVRSRV_OK; +} + diff --git a/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/common/dbgdriv.c b/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/common/dbgdriv.c index 0b8d445..848367a 100644 --- a/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/common/dbgdriv.c +++ b/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/common/dbgdriv.c @@ -934,7 +934,7 @@ static IMG_UINT32 WriteExpandingBuffer(PDBG_STREAM psStream,IMG_UINT8 * pui8InBu */ if ((psStream->psCtrl->ui32OutMode & DEBUG_OUTMODE_STREAMENABLE) == 0) { - PVR_DPF((PVR_DBG_ERROR, "WriteExpandingBuffer: buffer %x is disabled", (IMG_UINTPTR_T) psStream)); + PVR_DPF((PVR_DBG_ERROR, "WriteExpandingBuffer: buffer %p is disabled", psStream)); return(0); } @@ -949,7 +949,7 @@ static IMG_UINT32 WriteExpandingBuffer(PDBG_STREAM psStream,IMG_UINT8 * pui8InBu */ if (ui32Space < 32) { - PVR_DPF((PVR_DBG_ERROR, "WriteExpandingBuffer: buffer %x is full and isn't expandable", (IMG_UINTPTR_T) psStream)); + PVR_DPF((PVR_DBG_ERROR, "WriteExpandingBuffer: buffer %p is full and isn't expandable", psStream)); return(0); } } @@ -986,7 +986,7 @@ static IMG_UINT32 WriteExpandingBuffer(PDBG_STREAM psStream,IMG_UINT8 * pui8InBu else { /* out of memory */ - PVR_DPF((PVR_DBG_ERROR, "WriteExpandingBuffer: Unable to expand %x. Out of memory.", (IMG_UINTPTR_T) psStream)); + PVR_DPF((PVR_DBG_ERROR, "WriteExpandingBuffer: Unable to expand %p. Out of memory.", psStream)); InvalidateAllStreams(); return (0xFFFFFFFFUL); } @@ -1815,13 +1815,13 @@ IMG_UINT32 IMG_CALLCONV DBGDrivWrite(PDBG_STREAM psMainStream,IMG_UINT8 * pui8In */ if ((psStream->psCtrl->ui32OutMode & DEBUG_OUTMODE_STREAMENABLE) == 0) { - PVR_DPF((PVR_DBG_ERROR, "DBGDrivWrite: buffer %x is disabled", (IMG_UINTPTR_T) psStream)); + PVR_DPF((PVR_DBG_ERROR, "DBGDrivWrite: buffer %p is disabled", psStream)); return(0); } if (ui32Space < 8) { - PVR_DPF((PVR_DBG_ERROR, "DBGDrivWrite: buffer %x is full", (IMG_UINTPTR_T) psStream)); + PVR_DPF((PVR_DBG_ERROR, "DBGDrivWrite: buffer %p is full", psStream)); return(0); } @@ -2002,7 +2002,7 @@ IMG_UINT32 IMG_CALLCONV DBGDrivRead(PDBG_STREAM psMainStream, IMG_BOOL bReadInit */ if (!StreamValidForRead(psMainStream)) { - PVR_DPF((PVR_DBG_ERROR, "DBGDrivRead: buffer %x is invalid", (IMG_UINTPTR_T) psMainStream)); + PVR_DPF((PVR_DBG_ERROR, "DBGDrivRead: buffer %p is invalid", psMainStream)); return(0); } diff --git a/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/common/dbgdriv.h b/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/common/dbgdriv.h index d58c62d..e56d881 100644 --- a/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/common/dbgdriv.h +++ b/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/common/dbgdriv.h @@ -51,7 +51,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define MAX_PROCESSES 2 #define BLOCK_USED 0x01 #define BLOCK_LOCKED 0x02 -#define DBGDRIV_MONOBASE 0x000B0000 +#define DBGDRIV_MONOBASE 0x000B0000UL extern IMG_VOID * g_pvAPIMutex; diff --git a/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/linux/main.c b/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/linux/main.c index c1ca85b..b35cac4 100644 --- a/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/linux/main.c +++ b/jacinto6/sgx_src/eurasia_km/tools/intern/debug/dbgdriv/linux/main.c @@ -61,7 +61,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #if defined(SUPPORT_DRI_DRM) #include "drmP.h" -#include "drm.h" #endif #include "img_types.h" |