r3p201rel2
authorKasin Lee <kasin.li@amlogic.com>
Sun, 9 Jun 2013 11:21:21 +0000 (19:21 +0800)
committerKasin Lee <kasin.li@amlogic.com>
Sun, 9 Jun 2013 11:21:21 +0000 (19:21 +0800)
150 files changed:
mali/Kconfig
mali/Makefile
mali/common/mali_block_allocator.c
mali/common/mali_block_allocator.h
mali/common/mali_broadcast.c
mali/common/mali_broadcast.h
mali/common/mali_device_pause_resume.c
mali/common/mali_device_pause_resume.h
mali/common/mali_dlbu.c
mali/common/mali_dlbu.h
mali/common/mali_gp.c
mali/common/mali_gp.h
mali/common/mali_gp_job.c
mali/common/mali_gp_job.h
mali/common/mali_gp_scheduler.c
mali/common/mali_gp_scheduler.h
mali/common/mali_group.c
mali/common/mali_group.h
mali/common/mali_hw_core.c
mali/common/mali_hw_core.h
mali/common/mali_kernel_common.h
mali/common/mali_kernel_core.c
mali/common/mali_kernel_core.h
mali/common/mali_kernel_descriptor_mapping.c
mali/common/mali_kernel_descriptor_mapping.h
mali/common/mali_kernel_mem_os.c
mali/common/mali_kernel_mem_os.h
mali/common/mali_kernel_memory_engine.c
mali/common/mali_kernel_memory_engine.h
mali/common/mali_kernel_utilization.c
mali/common/mali_kernel_utilization.h
mali/common/mali_kernel_vsync.c
mali/common/mali_l2_cache.c
mali/common/mali_l2_cache.h
mali/common/mali_mem_validation.c
mali/common/mali_mem_validation.h
mali/common/mali_memory.c
mali/common/mali_memory.h
mali/common/mali_mmu.c
mali/common/mali_mmu.h
mali/common/mali_mmu_page_directory.c
mali/common/mali_mmu_page_directory.h
mali/common/mali_osk.h
mali/common/mali_osk_bitops.h
mali/common/mali_osk_list.h
mali/common/mali_osk_mali.h
mali/common/mali_osk_profiling.h
mali/common/mali_pm.c
mali/common/mali_pm.h
mali/common/mali_pmu.c
mali/common/mali_pmu.h
mali/common/mali_pp.c
mali/common/mali_pp.h
mali/common/mali_pp_job.c
mali/common/mali_pp_job.h
mali/common/mali_pp_scheduler.c
mali/common/mali_pp_scheduler.h
mali/common/mali_scheduler.c
mali/common/mali_scheduler.h
mali/common/mali_session.c
mali/common/mali_session.h
mali/common/mali_ukk.h
mali/common/mali_user_settings_db.c
mali/common/mali_user_settings_db.h
mali/include/linux/mali/mali_utgard.h
mali/include/linux/mali/mali_utgard_counters.h
mali/include/linux/mali/mali_utgard_ioctl.h
mali/include/linux/mali/mali_utgard_profiling_events.h
mali/include/linux/mali/mali_utgard_uk_types.h
mali/linux/license/gpl/mali_kernel_license.h
mali/linux/mali_dma_buf.c
mali/linux/mali_dma_buf.h
mali/linux/mali_kernel_linux.c
mali/linux/mali_kernel_linux.h
mali/linux/mali_kernel_sysfs.c
mali/linux/mali_kernel_sysfs.h
mali/linux/mali_linux_pm_testsuite.h [deleted file]
mali/linux/mali_linux_trace.h
mali/linux/mali_osk_atomics.c
mali/linux/mali_osk_irq.c
mali/linux/mali_osk_locks.c
mali/linux/mali_osk_low_level_mem.c
mali/linux/mali_osk_mali.c
mali/linux/mali_osk_math.c
mali/linux/mali_osk_memory.c
mali/linux/mali_osk_misc.c
mali/linux/mali_osk_notification.c
mali/linux/mali_osk_pm.c
mali/linux/mali_osk_profiling.c
mali/linux/mali_osk_specific.h
mali/linux/mali_osk_time.c
mali/linux/mali_osk_timers.c
mali/linux/mali_osk_wait_queue.c
mali/linux/mali_osk_wq.c
mali/linux/mali_pmu_power_up_down.c
mali/linux/mali_profiling_events.h
mali/linux/mali_profiling_internal.c
mali/linux/mali_profiling_internal.h
mali/linux/mali_sync.c
mali/linux/mali_sync.h
mali/linux/mali_sync_user.c
mali/linux/mali_uk_types.h
mali/linux/mali_ukk_core.c
mali/linux/mali_ukk_gp.c
mali/linux/mali_ukk_mem.c
mali/linux/mali_ukk_pp.c
mali/linux/mali_ukk_profiling.c
mali/linux/mali_ukk_vsync.c
mali/linux/mali_ukk_wrappers.h
mali/platform/meson_platform/meson_main.c
mali/regs/mali_200_regs.h
mali/regs/mali_gp_regs.h
mali/timestamp-arm11-cc/mali_timestamp.c
mali/timestamp-arm11-cc/mali_timestamp.h
mali/timestamp-default/mali_timestamp.c
mali/timestamp-default/mali_timestamp.h
ump/Makefile.common
ump/common/ump_kernel_api.c
ump/common/ump_kernel_common.c
ump/common/ump_kernel_common.h
ump/common/ump_kernel_descriptor_mapping.c
ump/common/ump_kernel_descriptor_mapping.h
ump/common/ump_kernel_memory_backend.h
ump/common/ump_kernel_ref_drv.c
ump/common/ump_kernel_types.h
ump/common/ump_osk.h
ump/common/ump_uk_types.h
ump/common/ump_ukk.h
ump/include/ump/ump_kernel_interface.h
ump/include/ump/ump_kernel_interface_ref_drv.h
ump/include/ump/ump_kernel_platform.h
ump/linux/license/gpl/ump_kernel_license.h
ump/linux/ump_ioctl.h
ump/linux/ump_kernel_linux.c
ump/linux/ump_kernel_linux.h
ump/linux/ump_kernel_memory_backend_dedicated.c
ump/linux/ump_kernel_memory_backend_dedicated.h
ump/linux/ump_kernel_memory_backend_os.c
ump/linux/ump_kernel_memory_backend_os.h
ump/linux/ump_memory_backend.c
ump/linux/ump_osk_atomics.c
ump/linux/ump_osk_low_level_mem.c
ump/linux/ump_osk_misc.c
ump/linux/ump_ukk_ref_wrappers.c
ump/linux/ump_ukk_ref_wrappers.h
ump/linux/ump_ukk_wrappers.c
ump/linux/ump_ukk_wrappers.h
umplock/Makefile [new file with mode: 0644]
umplock/umplock_driver.c [new file with mode: 0644]
umplock/umplock_ioctl.h [new file with mode: 0644]

index 67a51a6386653b80e474b70b5a98a985cd7063d5..8af4f6cb38628c842c0b757a804e521d24b4e50d 100644 (file)
@@ -18,6 +18,14 @@ config MALI400_DEBUG
        ---help---
          This enabled extra debug checks and messages in the Mali driver.
 
+config MALI400_OS_MEMORY_SIZE
+       depends on MALI400
+       int "OS Memory Size(MB)"
+       range 64 2048
+       default 480
+       ---help---
+         The size of mali OS memory with unit of mega byte.
+
 if !PROFILING || !FTRACE
 comment "ARM mali streamline with gator is depends on CONFIG_FTRACE and PROFILING.I will"
 comment "select them and other options for you.please refer to ARM DS-5 Documentation."
@@ -51,6 +59,25 @@ config MALI400_UMP
        bool "Enable UMP support"
        depends on MALI400
        ---help---
-         This enables support for the UMP memory sharing API in the Mali driver.         
-endmenu
+         This enables support for the UMP memory sharing API in the Mali driver.
+
+config MALI_DMA_BUF_MAP_ON_ATTACH
+       bool "Map dma-buf attachments on attach"
+       depends on MALI400 && DMA_SHARED_BUFFER
+       default y
+       ---help---
+         This makes the Mali driver map dma-buf attachments after doing
+         attach. If this is not set the dma-buf attachments will be mapped for
+         every time the GPU need to access the buffer.
+
+         Mapping for each access can cause lower performance.
 
+config MALI_SHARED_INTERRUPTS
+       bool "Support for shared interrupts"
+       depends on MALI400
+       default y
+       ---help---
+         Adds functionality required to properly support shared interrupts.  Without this support,
+         the device driver will fail during insmod if it detects shared interrupts.  Works even if
+         the GPU is not using shared interrupts, but can cause lower performance.
+endmenu
index 1351e09d53fb9a4c7f8224979b3f84fc1ec94800..b2676c89d972d540b236f155663352e2d8a7be6a 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+# Copyright (C) 2010-2013 ARM Limited. All rights reserved.
 # 
 # This program is free software and is provided to you under the terms of the GNU General Public License version 2
 # as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -11,6 +11,7 @@
 USE_UMPV2=0
 USING_PROFILING ?= 1
 USING_INTERNAL_PROFILING ?= 0
+MALI_DMA_BUF_MAP_ON_ATTACH ?= 1
 
 # The Makefile sets up "arch" based on the CONFIG, creates the version info
 # string and the __malidrv_build_info.c file, and then call the Linux build
@@ -121,6 +122,16 @@ endif
 endif
 endif
 
+ifeq ($(MALI_DMA_BUF_MAP_ON_ATTACH),1)
+export CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH=y
+export EXTRA_DEFINES += -DCONFIG_MALI_DMA_BUF_MAP_ON_ATTACH
+endif
+
+ifeq ($(MALI_SHARED_INTERRUPTS),1)
+export CONFIG_MALI_SHARED_INTERRUPTS=y
+export EXTRA_DEFINES += -DCONFIG_MALI_SHARED_INTERRUPTS
+endif
+
 ifneq ($(BUILD),release)
 export CONFIG_MALI400_DEBUG=y
 endif
index 7a0b099b822fa3f220866a34ee424890759c6eed..2959874a4e1d47e5438e2e15db134c3b3fdc25d1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -319,6 +319,8 @@ static mali_physical_memory_allocation_result block_allocator_allocate_page_tabl
 
                        alloc->next = NULL; /* Could potentially link many blocks together instead */
 
+                       _mali_osk_memset(block->mapping, 0, size);
+
                        result = MALI_MEM_ALLOC_FINISHED;
                }
        }
index d3f0f9be60ad7d8d2e4c2249eec45942ccfc7711..fe57681cc590b8347ed1d41bf09ca05c672ed077 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index b24c2c28483b29b61829e91cbb4478365c87ac0b..de259d233278e9c528bc12e1fa7cd92353a91297 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -32,6 +32,7 @@ struct mali_bcast_unit *mali_bcast_unit_create(const _mali_osk_resource_t *resou
        bcast_unit = _mali_osk_malloc(sizeof(struct mali_bcast_unit));
        if (NULL == bcast_unit)
        {
+               MALI_PRINT_ERROR(("Mali Broadcast unit: Failed to allocate memory for Broadcast unit\n"));
                return NULL;
        }
 
@@ -44,9 +45,11 @@ struct mali_bcast_unit *mali_bcast_unit_create(const _mali_osk_resource_t *resou
        }
        else
        {
-               MALI_PRINT_ERROR(("Mali Broadcast unit: Failed to allocate memory for Broadcast unit\n"));
+               MALI_PRINT_ERROR(("Mali Broadcast unit: Failed map broadcast unit\n"));
        }
 
+       _mali_osk_free(bcast_unit);
+
        return NULL;
 }
 
@@ -60,19 +63,18 @@ void mali_bcast_unit_delete(struct mali_bcast_unit *bcast_unit)
 
 void mali_bcast_add_group(struct mali_bcast_unit *bcast_unit, struct mali_group *group)
 {
-       u32 core_id;
+       u32 bcast_id;
        u32 broadcast_mask;
 
        MALI_DEBUG_ASSERT_POINTER(bcast_unit);
        MALI_DEBUG_ASSERT_POINTER(group);
 
-       core_id = mali_pp_core_get_id(mali_group_get_pp_core(group));
+       bcast_id = mali_pp_core_get_bcast_id(mali_group_get_pp_core(group));
+
        broadcast_mask = bcast_unit->current_mask;
 
-       /* set the bit corresponding to the group's core's id to 1 */
-       core_id = 1 << core_id;
-       broadcast_mask |= (core_id); /* add PP core to broadcast */
-       broadcast_mask |= (core_id << 16); /* add MMU to broadcast */
+       broadcast_mask |= (bcast_id); /* add PP core to broadcast */
+       broadcast_mask |= (bcast_id << 16); /* add MMU to broadcast */
 
        /* store mask so we can restore on reset */
        bcast_unit->current_mask = broadcast_mask;
@@ -82,18 +84,17 @@ void mali_bcast_add_group(struct mali_bcast_unit *bcast_unit, struct mali_group
 
 void mali_bcast_remove_group(struct mali_bcast_unit *bcast_unit, struct mali_group *group)
 {
-       u32 core_id;
+       u32 bcast_id;
        u32 broadcast_mask;
 
        MALI_DEBUG_ASSERT_POINTER(bcast_unit);
        MALI_DEBUG_ASSERT_POINTER(group);
 
-       core_id = mali_pp_core_get_id(mali_group_get_pp_core(group));
+       bcast_id = mali_pp_core_get_bcast_id(mali_group_get_pp_core(group));
+
        broadcast_mask = bcast_unit->current_mask;
 
-       /* set the bit corresponding to the group's core's id to 0 */
-       core_id = 1 << core_id;
-       broadcast_mask &= ~((core_id << 16) | core_id);
+       broadcast_mask &= ~((bcast_id << 16) | bcast_id);
 
        /* store mask so we can restore on reset */
        bcast_unit->current_mask = broadcast_mask;
@@ -115,3 +116,18 @@ void mali_bcast_reset(struct mali_bcast_unit *bcast_unit)
                                    bcast_unit_addr_irq_override_mask,
                                    bcast_unit->current_mask & 0xFF);
 }
+
+void mali_bcast_disable(struct mali_bcast_unit *bcast_unit)
+{
+       MALI_DEBUG_ASSERT_POINTER(bcast_unit);
+
+       /* set broadcast mask */
+       mali_hw_core_register_write(&bcast_unit->hw_core,
+                                   bcast_unit_addr_broadcast_mask,
+                                   0x0);
+
+       /* set IRQ override mask */
+       mali_hw_core_register_write(&bcast_unit->hw_core,
+                                   bcast_unit_addr_irq_override_mask,
+                                   0x0);
+}
index f292b273e83f1be1342be50264038f8bca62971f..95bc9bb4572a72cc58d0d13ffe730a2d10b3d9d7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -32,3 +32,21 @@ void mali_bcast_remove_group(struct mali_bcast_unit *bcast_unit, struct mali_gro
 
 /* Re-set cached mask. This needs to be called after having been suspended. */
 void mali_bcast_reset(struct mali_bcast_unit *bcast_unit);
+
+/**
+ * Disable broadcast unit
+ *
+ * mali_bcast_enable must be called to re-enable the unit. Cores may not be
+ * added or removed when the unit is disabled.
+ */
+void mali_bcast_disable(struct mali_bcast_unit *bcast_unit);
+
+/**
+ * Re-enable broadcast unit
+ *
+ * This resets the masks to include the cores present when mali_bcast_disable was called.
+ */
+MALI_STATIC_INLINE void mali_bcast_enable(struct mali_bcast_unit *bcast_unit)
+{
+       mali_bcast_reset(bcast_unit);
+}
index bb90380825257ed0030307ea9e0a4c324633aa63..8abf45686301b0523a392946711f89d05f792fc3 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 6be75b0510f3424f375167ae69378c709e3a5bd9..3b6242b776fd77729a3b3de689107dedce6fb005 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index cdb20dbdd77d57f4ffd337c50c0aed313aec11d8..85017a2fc88bba80df88e79937faa896c1503585 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -167,16 +167,16 @@ _mali_osk_errcode_t mali_dlbu_reset(struct mali_dlbu_core *dlbu)
 void mali_dlbu_add_group(struct mali_dlbu_core *dlbu, struct mali_group *group)
 {
        struct mali_pp_core *pp_core;
-       u32 core_id;
+       u32 bcast_id;
 
        MALI_DEBUG_ASSERT_POINTER( dlbu );
        MALI_DEBUG_ASSERT_POINTER( group );
 
        pp_core = mali_group_get_pp_core(group);
-       core_id = mali_pp_core_get_id(pp_core);
+       bcast_id = mali_pp_core_get_bcast_id(pp_core);
 
-       dlbu->pp_cores_mask |= (0x1 << core_id);
-       MALI_DEBUG_PRINT(3, ("Mali DLBU: Adding core[%d] New mask= 0x%02x\n",core_id , dlbu->pp_cores_mask));
+       dlbu->pp_cores_mask |= bcast_id;
+       MALI_DEBUG_PRINT(3, ("Mali DLBU: Adding core[%d] New mask= 0x%02x\n", bcast_id , dlbu->pp_cores_mask));
 
        mali_hw_core_register_write(&dlbu->hw_core, MALI_DLBU_REGISTER_PP_ENABLE_MASK, dlbu->pp_cores_mask);
 }
@@ -185,16 +185,16 @@ void mali_dlbu_add_group(struct mali_dlbu_core *dlbu, struct mali_group *group)
 void mali_dlbu_remove_group(struct mali_dlbu_core *dlbu, struct mali_group *group)
 {
        struct mali_pp_core *pp_core;
-       u32 core_id;
+       u32 bcast_id;
 
        MALI_DEBUG_ASSERT_POINTER( dlbu );
        MALI_DEBUG_ASSERT_POINTER( group );
 
        pp_core = mali_group_get_pp_core(group);
-       core_id = mali_pp_core_get_id(pp_core);
+       bcast_id = mali_pp_core_get_bcast_id(pp_core);
 
-       dlbu->pp_cores_mask &= ~(0x1 << core_id);
-               MALI_DEBUG_PRINT(3, ("Mali DLBU: Removing core[%d] New mask= 0x%02x\n", core_id, dlbu->pp_cores_mask));
+       dlbu->pp_cores_mask &= ~bcast_id;
+               MALI_DEBUG_PRINT(3, ("Mali DLBU: Removing core[%d] New mask= 0x%02x\n", bcast_id, dlbu->pp_cores_mask));
 
        mali_hw_core_register_write(&dlbu->hw_core, MALI_DLBU_REGISTER_PP_ENABLE_MASK, dlbu->pp_cores_mask);
 }
index 5f8df4718039fc9c79f9a577f3c59fe932318636..4b8e2a7d6b96fc3ab099493d8d299a686f239472 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 79fb3e9acc850319fd724ff76230640d2ce2ef88..8dd2d875193ffa88f523c2e028ef0c2c3e1560c3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 2750c7569ccbe9e04e4391632cbcafb63977bb7a..2b3695ecf61a8270ca952d7971b793b8f8e8ae4e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index dae68b1f5e234e439a275d62b986efb470e35f3c..fd67b25d3199ac0900313033d5947ed33fa0de44 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index e021b9bb1b0d8b2f77cc2422e5ea692b2faff151..f241812b2be92d264182759a3a77cb1d93741c5f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index ec0f88e8551ba1129f1181e472382aacdc2487ce..55be0af9eccde453e553c88923dc35296b93a92a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -158,13 +158,12 @@ static void mali_gp_scheduler_schedule(void)
        if (_MALI_OSK_ERR_OK != mali_group_start_gp_job(slot.group, job))
        {
                MALI_DEBUG_PRINT(3, ("Mali GP scheduler: Failed to start GP job\n"));
-               MALI_DEBUG_ASSERT(0); /* @@@@ todo: this cant fail on Mali-300+, no need to implement put back of job */
+               MALI_DEBUG_ASSERT(0); /* this cant fail on Mali-300+, no need to implement put back of job */
        }
 
        mali_group_unlock(slot.group);
 }
 
-/* @@@@ todo: pass the job in as a param to this function, so that we don't have to take the scheduler lock again */
 static void mali_gp_scheduler_schedule_on_group(struct mali_group *group)
 {
        struct mali_gp_job *job;
@@ -194,7 +193,7 @@ static void mali_gp_scheduler_schedule_on_group(struct mali_group *group)
        if (_MALI_OSK_ERR_OK != mali_group_start_gp_job(slot.group, job))
        {
                MALI_DEBUG_PRINT(3, ("Mali GP scheduler: Failed to start GP job\n"));
-               MALI_DEBUG_ASSERT(0); /* @@@@ todo: this cant fail on Mali-300+, no need to implement put back of job */
+               MALI_DEBUG_ASSERT(0); /* this cant fail on Mali-300+, no need to implement put back of job */
        }
 }
 
@@ -386,7 +385,6 @@ _mali_osk_errcode_t _mali_ukk_gp_suspend_response(_mali_uk_gp_suspend_response_s
                resumed_job = mali_group_resume_gp_with_new_heap(slot.group, args->cookie, args->arguments[0], args->arguments[1]);
                if (NULL != resumed_job)
                {
-                       /* @@@@ todo: move this and other notification handling into the job object itself */
                        resumed_job->oom_notification = new_notification;
                        mali_group_unlock(slot.group);
                        return _MALI_OSK_ERR_OK;
index 9f30bd82818e5f1957f980984b7ef7118a5a8e8e..f8571bf8d4fce6193cdb61f8e0fdbf9369fbf2ef 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 12896fd7143fc6590b85500d05bb2bba3a423892..bbc32e60250c08cf51a1d7769f14524c0f86fd92 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -521,6 +521,16 @@ void mali_group_reset(struct mali_group *group)
 
        group->session = NULL;
 
+       if (NULL != group->dlbu_core)
+       {
+               mali_dlbu_reset(group->dlbu_core);
+       }
+
+       if (NULL != group->bcast_core)
+       {
+               mali_bcast_reset(group->bcast_core);
+       }
+
        if (NULL != group->mmu)
        {
                mali_mmu_reset(group->mmu);
@@ -749,8 +759,6 @@ static void mali_group_reset_pp(struct mali_group *group)
        struct mali_group *child;
        struct mali_group *temp;
 
-       /* TODO: If we *know* that the group is idle, this could be faster. */
-
        mali_pp_reset_async(group->pp_core);
 
        if (!mali_group_is_virtual(group) || NULL == group->pp_running_job)
@@ -782,7 +790,12 @@ static void mali_group_complete_pp(struct mali_group *group, mali_bool success)
 
        mali_group_post_process_job_pp(group);
 
-       mali_pp_reset_async(group->pp_core);
+       if (success)
+       {
+               /* Only do soft reset for successful jobs, a full recovery
+                * reset will be done for failed jobs. */
+               mali_pp_reset_async(group->pp_core);
+       }
 
        pp_job_to_return = group->pp_running_job;
        pp_sub_job_to_return = group->pp_running_sub_job;
@@ -791,7 +804,8 @@ static void mali_group_complete_pp(struct mali_group *group, mali_bool success)
 
        mali_group_deactivate_page_directory(group, group->session);
 
-       if (_MALI_OSK_ERR_OK != mali_pp_reset_wait(group->pp_core))
+       /* Do hard reset if the job failed, or if soft reset fails */
+       if (!success || _MALI_OSK_ERR_OK != mali_pp_reset_wait(group->pp_core))
        {
                MALI_DEBUG_PRINT(3, ("Mali group: Failed to reset PP, need to reset entire group\n"));
 
@@ -833,7 +847,7 @@ void mali_group_abort_gp_job(struct mali_group *group, u32 job_id)
 {
        MALI_ASSERT_GROUP_LOCKED(group);
 
-       if (group->state == MALI_GROUP_STATE_IDLE ||
+       if (MALI_GROUP_STATE_IDLE == group->state ||
            mali_gp_job_get_id(group->gp_running_job) != job_id)
        {
                return; /* No need to cancel or job has already been aborted or completed */
@@ -846,7 +860,7 @@ static void mali_group_abort_pp_job(struct mali_group *group, u32 job_id)
 {
        MALI_ASSERT_GROUP_LOCKED(group);
 
-       if (group->state == MALI_GROUP_STATE_IDLE ||
+       if (MALI_GROUP_STATE_IDLE == group->state ||
            mali_pp_job_get_id(group->pp_running_job) != job_id)
        {
                return; /* No need to cancel or job has already been aborted or completed */
@@ -1007,7 +1021,8 @@ void mali_group_power_on(void)
        {
                struct mali_group *group = mali_global_groups[i];
                mali_group_lock(group);
-               MALI_DEBUG_ASSERT(MALI_GROUP_STATE_IDLE == group->state);
+               MALI_DEBUG_ASSERT(MALI_GROUP_STATE_IDLE == group->state
+                                 || MALI_GROUP_STATE_IN_VIRTUAL == group->state);
                group->power_is_on = MALI_TRUE;
 
                if (NULL != group->l2_cache_core[0])
@@ -1040,7 +1055,8 @@ void mali_group_power_off(void)
        {
                struct mali_group *group = mali_global_groups[i];
                mali_group_lock(group);
-               MALI_DEBUG_ASSERT(MALI_GROUP_STATE_IDLE == group->state);
+               MALI_DEBUG_ASSERT(MALI_GROUP_STATE_IDLE == group->state
+                                 || MALI_GROUP_STATE_IN_VIRTUAL == group->state);
                group->session = NULL;
                group->power_is_on = MALI_FALSE;
 
@@ -1085,11 +1101,16 @@ static void mali_group_recovery_reset(struct mali_group *group)
                {
                        struct mali_group *child, *temp;
 
+                       /* Disable the broadcast unit while we do reset directly on the member cores. */
+                       mali_bcast_disable(group->bcast_core);
+
                        _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list, struct mali_group, group_list)
                        {
                                mali_pp_stop_bus_wait(child->pp_core);
                                mali_pp_hard_reset(child->pp_core);
                        }
+
+                       mali_bcast_enable(group->bcast_core);
                }
                else
                {
@@ -1235,16 +1256,13 @@ static void mali_group_bottom_half_mmu(void * data)
        struct mali_group *group = (struct mali_group *)data;
        struct mali_mmu_core *mmu = group->mmu;
        u32 rawstat;
-       u32 status;
+       MALI_DEBUG_CODE(u32 status);
 
        MALI_DEBUG_ASSERT_POINTER(mmu);
 
        mali_group_lock(group);
 
-       /* TODO: Remove some of these asserts? Will we ever end up in
-        * "physical" bottom half for a member of the virtual group? */
        MALI_DEBUG_ASSERT(NULL == group->parent_group);
-       MALI_DEBUG_ASSERT(!mali_group_is_in_virtual(group));
 
        if ( MALI_FALSE == mali_group_power_is_on(group) )
        {
@@ -1254,7 +1272,7 @@ static void mali_group_bottom_half_mmu(void * data)
        }
 
        rawstat = mali_mmu_get_rawstat(mmu);
-       status = mali_mmu_get_status(mmu);
+       MALI_DEBUG_CODE(status = mali_mmu_get_status(mmu));
 
        MALI_DEBUG_PRINT(4, ("Mali MMU: Bottom half, interrupt 0x%08X, status 0x%08X\n", rawstat, status));
 
@@ -1410,7 +1428,6 @@ static void mali_group_post_process_job_gp(struct mali_group *group, mali_bool s
 #if defined(CONFIG_MALI400_PROFILING)
        if (suspend)
        {
-               /* @@@@ todo: test this case and see if it is still working*/
                _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_SUSPEND|MALI_PROFILING_MAKE_EVENT_CHANNEL_GP(0),
                                              mali_gp_job_get_perf_counter_value0(group->gp_running_job),
                                              mali_gp_job_get_perf_counter_value1(group->gp_running_job),
@@ -1486,7 +1503,8 @@ _mali_osk_errcode_t mali_group_upper_half_pp(void *data)
 #endif
 
 #if defined(MALI_UPPER_HALF_SCHEDULING)
-               if (irq_readout & MALI200_REG_VAL_IRQ_END_OF_FRAME)
+               /* Check if job is complete without errors */
+               if (MALI200_REG_VAL_IRQ_END_OF_FRAME == irq_readout)
                {
                        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_START |
                                                      MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
@@ -1497,16 +1515,35 @@ _mali_osk_errcode_t mali_group_upper_half_pp(void *data)
 
                        mali_group_lock(group);
 
-                       /* Read int stat again */
+                       /* Check if job is complete without errors, again, after taking the group lock */
                        irq_readout = mali_pp_read_rawstat(core);
-                       if (!(irq_readout & MALI200_REG_VAL_IRQ_END_OF_FRAME))
+                       if (MALI200_REG_VAL_IRQ_END_OF_FRAME != irq_readout)
                        {
-                               /* There was nothing to do */
                                mali_pp_enable_interrupts(core);
                                mali_group_unlock(group);
+                               _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
+                                                             MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
+                                                             MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
+                                                             0, 0, MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP(core->core_id), 0, 0);
                                return _MALI_OSK_ERR_OK;
                        }
 
+                       if (mali_group_is_virtual(group))
+                       {
+                               u32 status_readout = mali_pp_read_status(group->pp_core);
+                               if (status_readout & MALI200_REG_VAL_STATUS_RENDERING_ACTIVE)
+                               {
+                                       MALI_DEBUG_PRINT(6, ("Mali PP: Not all cores in broadcast completed\n"));
+                                       mali_pp_enable_interrupts(core);
+                                       mali_group_unlock(group);
+                                       _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
+                                                                     MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
+                                                                     MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
+                                                                     0, 0, MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP(core->core_id), 0, 0);
+                                       return _MALI_OSK_ERR_OK;
+                               }
+                       }
+
                        if (mali_group_is_in_virtual(group))
                        {
                                /* We're member of a virtual group, so interrupt should be handled by the virtual group */
@@ -1519,16 +1556,17 @@ _mali_osk_errcode_t mali_group_upper_half_pp(void *data)
                                return _MALI_OSK_ERR_FAULT;
                        }
 
-                       _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
-                                                     MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
-                                                     MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
-                                                     0, 0, MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP(core->core_id), 0, 0);
-
+                       group->core_timed_out = MALI_FALSE;
                        mali_group_complete_pp(group, MALI_TRUE);
                        /* No need to enable interrupts again, since the core will be reset while completing the job */
 
                        mali_group_unlock(group);
 
+                       _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
+                                                     MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
+                                                     MALI_PROFILING_EVENT_REASON_START_STOP_SW_UPPER_HALF,
+                                                     0, 0, MALI_PROFILING_MAKE_EVENT_DATA_CORE_PP(core->core_id), 0, 0);
+
                        return _MALI_OSK_ERR_OK;
                }
 #endif
@@ -1598,16 +1636,36 @@ static void mali_group_bottom_half_pp(void *data)
 
        MALI_DEBUG_PRINT(4, ("Mali PP: Bottom half IRQ 0x%08X from core %s\n", irq_readout, mali_pp_get_hw_core_desc(group->pp_core)));
 
-       if (irq_readout & MALI200_REG_VAL_IRQ_END_OF_FRAME)
+       /* Check if job is complete without errors */
+       if (MALI200_REG_VAL_IRQ_END_OF_FRAME == irq_readout)
        {
+               if (mali_group_is_virtual(group))
+               {
+                       u32 status_readout = mali_pp_read_status(group->pp_core);
+
+                       if (status_readout & MALI200_REG_VAL_STATUS_RENDERING_ACTIVE)
+                       {
+                               MALI_DEBUG_PRINT(6, ("Mali PP: Not all cores in broadcast completed\n"));
+                               mali_pp_enable_interrupts(core);
+                               mali_group_unlock(group);
+
+                               _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
+                                                             MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
+                                                             MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
+                                                             0, _mali_osk_get_tid(), 0, 0, 0);
+                               return;
+                       }
+               }
+
                MALI_DEBUG_PRINT(3, ("Mali PP: Job completed, calling group handler\n"));
                group->core_timed_out = MALI_FALSE;
-               _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
-                                             MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
-                                             MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
-                                             0, _mali_osk_get_tid(), 0, 0, 0);
                mali_group_complete_pp(group, MALI_TRUE);
                mali_group_unlock(group);
+
+               _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
+                                             MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
+                                             MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
+                                             0, _mali_osk_get_tid(), 0, 0, 0);
                return;
        }
 
@@ -1626,24 +1684,21 @@ static void mali_group_bottom_half_pp(void *data)
        irq_errors = irq_readout & ~(MALI200_REG_VAL_IRQ_END_OF_FRAME|MALI200_REG_VAL_IRQ_HANG);
        if (0 != irq_errors)
        {
-               MALI_PRINT_ERROR(("Mali PP: Unknown interrupt 0x%08X from core %s, aborting job\n",
+               MALI_PRINT_ERROR(("Mali PP: Unexpected interrupt 0x%08X from core %s, aborting job\n",
                                  irq_readout, mali_pp_get_hw_core_desc(group->pp_core)));
                group->core_timed_out = MALI_FALSE;
+               mali_group_complete_pp(group, MALI_FALSE);
+               mali_group_unlock(group);
+
                _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
                                              MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
                                              MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
                                              0, _mali_osk_get_tid(), 0, 0, 0);
-               mali_group_complete_pp(group, MALI_FALSE);
-               mali_group_unlock(group);
                return;
        }
        else if (group->core_timed_out) /* SW timeout */
        {
                group->core_timed_out = MALI_FALSE;
-               _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
-                                             MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
-                                             MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
-                                             0, _mali_osk_get_tid(), 0, 0, 0);
                if (!_mali_osk_timer_pending(group->timeout_timer) && NULL != group->pp_running_job)
                {
                        MALI_PRINT(("Mali PP: Job %d timed out on core %s\n",
@@ -1655,6 +1710,11 @@ static void mali_group_bottom_half_pp(void *data)
                {
                        mali_group_unlock(group);
                }
+
+               _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP |
+                                             MALI_PROFILING_EVENT_CHANNEL_SOFTWARE |
+                                             MALI_PROFILING_EVENT_REASON_START_STOP_SW_BOTTOM_HALF,
+                                             0, _mali_osk_get_tid(), 0, 0, 0);
                return;
        }
 
@@ -1687,8 +1747,6 @@ static void mali_group_post_process_job_pp(struct mali_group *group)
        /* Stop the timeout timer. */
        _mali_osk_timer_del_async(group->timeout_timer);
 
-       /*todo add stop SW counters profiling*/
-
        if (NULL != group->pp_running_job)
        {
                if (MALI_TRUE == mali_group_is_virtual(group))
@@ -1699,7 +1757,7 @@ static void mali_group_post_process_job_pp(struct mali_group *group)
                        /* update performance counters from each physical pp core within this virtual group */
                        _MALI_OSK_LIST_FOREACHENTRY(child, temp, &group->group_list, struct mali_group, group_list)
                        {
-                               mali_pp_update_performance_counters(child->pp_core, group->pp_running_job, group->pp_running_sub_job);
+                               mali_pp_update_performance_counters(group->pp_core, child->pp_core, group->pp_running_job, mali_pp_core_get_id(child->pp_core));
                        }
 
 #if defined(CONFIG_MALI400_PROFILING)
@@ -1736,7 +1794,7 @@ static void mali_group_post_process_job_pp(struct mali_group *group)
                else
                {
                        /* update performance counters for a physical group's pp core */
-                       mali_pp_update_performance_counters(group->pp_core, group->pp_running_job, group->pp_running_sub_job);
+                       mali_pp_update_performance_counters(group->pp_core, group->pp_core, group->pp_running_job, group->pp_running_sub_job);
 
 #if defined(CONFIG_MALI400_PROFILING)
                        _mali_osk_profiling_add_event(MALI_PROFILING_EVENT_TYPE_STOP|
index 31af7942ad0ec78f725f6da53c38de675d433f72..8f03f3dd66fa2926948311fe51d245f5a1096a96 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -48,7 +48,7 @@ struct mali_group
        int                         page_dir_ref_count;
 
        mali_bool                   power_is_on;
-       enum mali_group_core_state  state; /* @@@@ TODO: include power_is_on in this state? */
+       enum mali_group_core_state  state;
 
        struct mali_gp_core         *gp_core;
        struct mali_gp_job          *gp_running_job;
index c3a9c8b8a4379e43a6519a2b68b05395ed5e446f..290d457ed7db53a88f63573013e5a37ec674feb2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index e687f606e2647e634da165b30de6f25fb39bf6f5..9c0931c6820110211673651ad5501abb1119fcd1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index c86518c0a4f157c2449677c6935419482c3e1abc..805b4b144f921c25aa09592564d8f394b3505bcb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index dec272bcf411bcf4fab83a8cd047909c85efb337..8d8ea4d399c378106357d96ae425543f0dba5f80 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -39,9 +39,9 @@
 
 
 /* Mali GPU memory. Real values come from module parameter or from device specific data */
-int mali_dedicated_mem_start = 0;
-int mali_dedicated_mem_size = 0;
-int mali_shared_mem_size = 0;
+unsigned int mali_dedicated_mem_start = 0;
+unsigned int mali_dedicated_mem_size = 0;
+unsigned int mali_shared_mem_size = 0;
 
 /* Frame buffer memory to be accessible by Mali GPU */
 int mali_fb_start = 0;
@@ -67,6 +67,46 @@ static u32 global_gpu_minor_version = 0;
 /* timer related */
 int mali_max_job_runtime = WATCHDOG_MSECS_DEFAULT;
 
+static _mali_osk_errcode_t mali_set_global_gpu_base_address(void)
+{
+       global_gpu_base_address = _mali_osk_resource_base_address();
+       if (0 == global_gpu_base_address)
+       {
+               return _MALI_OSK_ERR_ITEM_NOT_FOUND;
+       }
+
+       return _MALI_OSK_ERR_OK;
+}
+
+static u32 mali_get_bcast_id(_mali_osk_resource_t *resource_pp)
+{
+       switch (resource_pp->base - global_gpu_base_address)
+       {
+       case 0x08000:
+       case 0x20000: /* fall-through for aliased mapping */
+               return 0x01;
+       case 0x0A000:
+       case 0x22000: /* fall-through for aliased mapping */
+               return 0x02;
+       case 0x0C000:
+       case 0x24000: /* fall-through for aliased mapping */
+               return 0x04;
+       case 0x0E000:
+       case 0x26000: /* fall-through for aliased mapping */
+               return 0x08;
+       case 0x28000:
+               return 0x10;
+       case 0x2A000:
+               return 0x20;
+       case 0x2C000:
+               return 0x40;
+       case 0x2E000:
+               return 0x80;
+       default:
+               return 0;
+       }
+}
+
 static _mali_osk_errcode_t mali_parse_product_info(void)
 {
        /*
@@ -77,12 +117,6 @@ static _mali_osk_errcode_t mali_parse_product_info(void)
        u32 first_pp_offset;
        _mali_osk_resource_t first_pp_resource;
 
-       global_gpu_base_address = _mali_osk_resource_base_address();
-       if (0 == global_gpu_base_address)
-       {
-               return _MALI_OSK_ERR_ITEM_NOT_FOUND;
-       }
-
        /* Find out where the first PP core is located */
        if (_MALI_OSK_ERR_OK == _mali_osk_resource_find(global_gpu_base_address + 0x8000, NULL))
        {
@@ -102,7 +136,7 @@ static _mali_osk_errcode_t mali_parse_product_info(void)
                struct mali_group *group = mali_group_create(NULL, NULL, NULL);
                if (NULL != group)
                {
-                       struct mali_pp_core *pp_core = mali_pp_create(&first_pp_resource, group, MALI_FALSE);
+                       struct mali_pp_core *pp_core = mali_pp_create(&first_pp_resource, group, MALI_FALSE, mali_get_bcast_id(&first_pp_resource));
                        if (NULL != pp_core)
                        {
                                u32 pp_version = mali_pp_core_get_version(pp_core);
@@ -363,7 +397,7 @@ static _mali_osk_errcode_t mali_create_group(struct mali_l2_cache_core *cache,
                struct mali_pp_core *pp_core;
 
                /* Create the PP core object inside this group */
-               pp_core = mali_pp_create(resource_pp, group, MALI_FALSE);
+               pp_core = mali_pp_create(resource_pp, group, MALI_FALSE, mali_get_bcast_id(resource_pp));
                if (NULL == pp_core)
                {
                        /* No need to clean up now, as we will clean up everything linked in from the cluster when we fail this function */
@@ -429,7 +463,7 @@ static _mali_osk_errcode_t mali_create_virtual_group(_mali_osk_resource_t *resou
        }
 
        /* Create the PP core object inside this group */
-       pp_bcast_core = mali_pp_create(resource_pp_bcast, group, MALI_TRUE);
+       pp_bcast_core = mali_pp_create(resource_pp_bcast, group, MALI_TRUE, 0);
        if (NULL == pp_bcast_core)
        {
                /* No need to clean up now, as we will clean up everything linked in from the cluster when we fail this function */
@@ -624,10 +658,26 @@ static _mali_osk_errcode_t mali_parse_config_groups(void)
        return _MALI_OSK_ERR_FAULT;
 }
 
+static _mali_osk_errcode_t mali_check_shared_interrupts(void)
+{
+#if !defined(CONFIG_MALI_SHARED_INTERRUPTS)
+       if (MALI_TRUE == _mali_osk_shared_interrupts())
+       {
+               MALI_PRINT_ERROR(("Shared interrupts detected, but driver support is not enabled\n"));
+               return _MALI_OSK_ERR_FAULT;
+       }
+#endif /* !defined(CONFIG_MALI_SHARED_INTERRUPTS) */
+
+       /* It is OK to compile support for shared interrupts even if Mali is not using it. */
+       return _MALI_OSK_ERR_OK;
+}
+
 static _mali_osk_errcode_t mali_parse_config_pmu(void)
 {
        _mali_osk_resource_t resource_pmu;
 
+       MALI_DEBUG_ASSERT(0 != global_gpu_base_address);
+
        if (_MALI_OSK_ERR_OK == _mali_osk_resource_find(global_gpu_base_address + 0x02000, &resource_pmu))
        {
                u32 number_of_pp_cores = 0;
@@ -637,6 +687,7 @@ static _mali_osk_errcode_t mali_parse_config_pmu(void)
 
                if (NULL == mali_pmu_create(&resource_pmu, number_of_pp_cores, number_of_l2_caches))
                {
+                       MALI_PRINT_ERROR(("Failed to create PMU\n"));
                        return _MALI_OSK_ERR_FAULT;
                }
        }
@@ -748,7 +799,7 @@ _mali_osk_errcode_t mali_initialize_subsystems(void)
        err = _mali_osk_profiling_init(mali_boot_profiling ? MALI_TRUE : MALI_FALSE);
        if (_MALI_OSK_ERR_OK != err)
        {
-               /* No biggie if we wheren't able to initialize the profiling */
+               /* No biggie if we weren't able to initialize the profiling */
                MALI_PRINT_ERROR(("Failed to initialize profiling, feature will be unavailable\n"));
        }
 #endif
@@ -760,6 +811,12 @@ _mali_osk_errcode_t mali_initialize_subsystems(void)
        err = mali_parse_config_memory();
        if (_MALI_OSK_ERR_OK != err) goto parse_memory_config_failed;
 
+       err = mali_set_global_gpu_base_address();
+       if (_MALI_OSK_ERR_OK != err) goto set_global_gpu_base_address_failed;
+
+       err = mali_check_shared_interrupts();
+       if (_MALI_OSK_ERR_OK != err) goto check_shared_interrupts_failed;
+
        /* Initialize the MALI PMU */
        err = mali_parse_config_pmu();
        if (_MALI_OSK_ERR_OK != err) goto parse_pmu_config_failed;
@@ -841,7 +898,11 @@ pm_init_failed:
                }
        }
 parse_pmu_config_failed:
-       /* undoing mali_parse_config_memory() is done by mali_memory_terminate() */
+       /* undoing mali_parse_config_pmu() is done by mali_memory_terminate() */
+check_shared_interrupts_failed:
+       global_gpu_base_address = 0;
+set_global_gpu_base_address_failed:
+       global_gpu_base_address = 0;
 parse_memory_config_failed:
        mali_memory_terminate();
 memory_init_failed:
index 22406b25c1cef4e4f28e9f0ff86dfa3b5cac53da..5799c3206b10ba622e45eaeab1d20a468bf39e55 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index b9f05ca4965a007645712331633c59dca01975e7..8e9dc2c0f6a4d358b22370d1de8fe714137ff25e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 82ed94d6ffef2794efa3b071501394141dff1561..e0d256de31c133a62ea7074e43f7ea7957e58a12 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index d7e88024d75cb6fe4502d73c61721ecb1ed8007f..e866447fcf5fcc8cc4d9363265173cc7428ae941 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 0946169f79d07cb25e07ee6332e7049f31fb611b..150d6333fa0b1f0928a3d128971fb649583d7bac 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 00257ec5e01499bbc54b2c0148c4dd63cf131e7d..1f001805109fc1e6a8c96268a08172c1041955ae 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 3b41cee4a12d7cfc915cc7a8ac6b1ab43c87e09e..4329f23eb1415937ed1218456e55e403a3a611d5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 8dd1b0992f68bae661092f5135178451bbbc309c..6514ad1db74c65b70744d2be4898deb826f364eb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index ebd0670936fe46a932a19036654b5a5297b73cc2..2b61d7d23d876eae08cbdd58077687c84521f571 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index a1fdf007171d19d981371f3cc32d7ffa052cdb20..a56389879de0e644213f50f46116900340a35aac 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 0fcf4fbf69172f1b161ce434451da50f5efb1601..a62a1e25548c4dee24c1c9d617d3ca60c39713a9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index ebc67aec6afbd81127a38825e77b8baa9c8ca9d1..c46f871e036991842db205a8cfc341ea6d324a03 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index a86912a383cb715360068f30cd03d0ad2babb18c..424e521b15c57d3e9f02cd866b8a96f3c48c626b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 1eeab3885e976a5bfe5b8efbdc55bf778afed9dc..a9ab6d4ca7118f3bf9ead152b4492de06334ccb7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 129cdb046e759a724019ae932dc621ae9eb7ffbc..0d220f5193966b4766d8fd8e4530388f9024a0c6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -756,6 +756,20 @@ static void external_memory_release(void * ctx, void * handle)
        return;
 }
 
+_mali_osk_errcode_t _mali_ukk_mem_write_safe(_mali_uk_mem_write_safe_s *args)
+{
+       MALI_DEBUG_ASSERT_POINTER(args);
+
+       if (NULL == args->ctx)
+       {
+               return _MALI_OSK_ERR_INVALID_ARGS;
+       }
+
+       /* Return number of bytes actually copied */
+       args->size = _mali_osk_mem_write_safe(args->dest, args->src, args->size);
+       return _MALI_OSK_ERR_OK;
+}
+
 _mali_osk_errcode_t _mali_ukk_map_external_mem( _mali_uk_map_external_mem_s *args )
 {
        mali_physical_memory_allocator external_memory_allocator;
index 537c3462a70edafa7f7bfbf4288523797e924ee6..3006a82ae56b54eef350c84999739021518cc58b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index eea37270ae2a644182cda712df4b8798ca7e740d..a373779ae36b9305aa7cfb17a2b78c5c4e4a2b75 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -303,6 +303,7 @@ _mali_osk_errcode_t mali_mmu_reset(struct mali_mmu_core *mmu)
 
        /* The stall can not fail in current hw-state */
        MALI_DEBUG_ASSERT(stall_success);
+       MALI_IGNORE(stall_success);
 
        MALI_DEBUG_PRINT(3, ("Mali MMU: mali_kernel_mmu_reset: %s\n", mmu->hw_core.description));
 
@@ -378,8 +379,11 @@ void mali_mmu_activate_empty_page_directory(struct mali_mmu_core* mmu)
        MALI_DEBUG_PRINT(3, ("Activating the empty page directory on MMU %s\n", mmu->hw_core.description));
 
        stall_success = mali_mmu_enable_stall(mmu);
+
        /* This function can only be called when the core is idle, so it could not fail. */
-       MALI_DEBUG_ASSERT( stall_success );
+       MALI_DEBUG_ASSERT(stall_success);
+       MALI_IGNORE(stall_success);
+
        mali_mmu_activate_address_space(mmu, mali_empty_page_directory);
        mali_mmu_disable_stall(mmu);
 }
index 66102fb5a8007bb24900c50a13f46e7db8f899d3..b6d6f3939440d73123e7dbd44d9ca40a8e42a122 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index d9dbc1ec3cadf4e67e94b5269b6cc2f0ff0c7ebf..21e9a9e4baaeff0499dd7be92e45788718db4ccb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 628833a1180a14c6b8ed06c95d156956c0445161..ee71f9e5736c9f82f8f81a86bc3900155733795b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index f6990527dda16e7e4b609cb47028247e99a16ed9..2fcdf4376c41464630f6e861bd1e9685e1ff9d26 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -615,6 +615,13 @@ _mali_osk_wq_work_t *_mali_osk_wq_create_work( _mali_osk_wq_work_handler_t handl
  */
 void _mali_osk_wq_delete_work( _mali_osk_wq_work_t *work );
 
+/** @brief Delete a work object
+ *
+ * This will NOT flush the work queue, so only call this if you are sure that the work handler will
+ * not be called after deletion.
+ */
+void _mali_osk_wq_delete_work_nonflush( _mali_osk_wq_work_t *work );
+
 /** @brief Cause a queued, deferred call of the work handler
  *
  * _mali_osk_wq_schedule_work provides a mechanism for enqueuing deferred calls
index f262f7dad37d507567885a2fccc5f44f55e8cd41..84af3132830d6a4798e98b4b0bc9a26fe83c312d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 49f01b63b13653714a9bbe97cd22c28497cc0a56..531b0acfc41bdf1c10c748f490f5b450aaf63149 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 4ac8ef6cf1fe33178e1d6afbd34f01d290e15135..af8e8bf417a7110a81da865f216a799b91292310 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -69,6 +69,12 @@ u32 _mali_osk_resource_base_address(void);
  */
 _mali_osk_errcode_t _mali_osk_device_data_get(struct _mali_osk_device_data *data);
 
+/** @brief Determines if Mali GPU has been configured with shared interrupts.
+ *
+ * @return MALI_TRUE if shared interrupts, MALI_FALSE if not.
+ */
+mali_bool _mali_osk_shared_interrupts(void);
+
 /** @} */ /* end group _mali_osk_miscellaneous */
 
 
@@ -233,6 +239,16 @@ _mali_osk_errcode_t _mali_osk_mem_mapregion_map( mali_memory_allocation * descri
  * \ref _MALI_OSK_MEM_MAPREGION_FLAG_OS_ALLOCATED_PHYSADDR set.
  */
 void _mali_osk_mem_mapregion_unmap( mali_memory_allocation * descriptor, u32 offset, u32 size, _mali_osk_mem_mapregion_flags_t flags );
+
+/** @brief Copy as much data as possible from src to dest, do not crash if src or dest isn't available.
+ *
+ * @param dest Destination buffer (limited to user space mapped Mali memory)
+ * @param src Source buffer
+ * @param size Number of bytes to copy
+ * @return Number of bytes actually copied
+ */
+u32 _mali_osk_mem_write_safe(void *dest, const void *src, u32 size);
+
 /** @} */ /* end group _mali_osk_low_level_memory */
 
 
index c87aace89621c4947bc5b47ab41752091d21a2e4..bc3395bb2d23183a381e87b120295d22f3c77d42 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index c09da998df30d4343ab33ef2e5619aa216b1a9d9..fa15aa15a36e70041c06bc1c67e058189787c404 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 97fbc0609b8ffb3baad6b578c6d2e567aedde281..8cccc2f196a9988a781a6b6ac88de694644f3778 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 3c26cb11cedd587a22c1812132a8839a3e9dcbe8..e8aecc3f8573cdf8363accb0ed3b1df7a093f5ef 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -69,10 +69,12 @@ struct mali_pmu_core *mali_pmu_create(_mali_osk_resource_t *resource, u32 number
 void mali_pmu_delete(struct mali_pmu_core *pmu)
 {
        MALI_DEBUG_ASSERT_POINTER(pmu);
+       MALI_DEBUG_ASSERT(pmu == mali_global_pmu_core);
+       MALI_DEBUG_PRINT(2, ("Mali PMU: Deleting Mali PMU core\n"));
 
        mali_hw_core_delete(&pmu->hw_core);
        _mali_osk_free(pmu);
-       pmu = NULL;
+       mali_global_pmu_core = NULL;
 }
 
 _mali_osk_errcode_t mali_pmu_reset(struct mali_pmu_core *pmu)
index fd10c080cbdcf8de1b02036f52642be3debbdde1..2936035259c3084cc90588530c027d99f6e2fcc8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index c655e2012c47c12ad9396a512db02f9c4cc70b03..0713c5f3b7c576bf618ea8ead15a1e136895e106 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -31,7 +31,7 @@ static u32 mali_global_num_pp_cores = 0;
 static void mali_pp_irq_probe_trigger(void *data);
 static _mali_osk_errcode_t mali_pp_irq_probe_ack(void *data);
 
-struct mali_pp_core *mali_pp_create(const _mali_osk_resource_t *resource, struct mali_group *group, mali_bool is_virtual)
+struct mali_pp_core *mali_pp_create(const _mali_osk_resource_t *resource, struct mali_group *group, mali_bool is_virtual, u32 bcast_id)
 {
        struct mali_pp_core* core = NULL;
 
@@ -48,6 +48,7 @@ struct mali_pp_core *mali_pp_create(const _mali_osk_resource_t *resource, struct
        if (NULL != core)
        {
                core->core_id = mali_global_num_pp_cores;
+               core->bcast_id = bcast_id;
                core->counter_src0_used = MALI_HW_CORE_NO_COUNTER;
                core->counter_src1_used = MALI_HW_CORE_NO_COUNTER;
 
@@ -269,14 +270,15 @@ _mali_osk_errcode_t mali_pp_reset_wait(struct mali_pp_core *core)
        int i;
        u32 rawstat = 0;
 
-       /* TODO: For virtual Mali-450 core, check that PP active in STATUS is 0 (this must be initiated from group) */
-
        for (i = 0; i < MALI_REG_POLL_COUNT_FAST; i++)
        {
-               rawstat = mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_RAWSTAT);
-               if (rawstat & MALI400PP_REG_VAL_IRQ_RESET_COMPLETED)
+               if (!(mali_pp_read_status(core) & MALI200_REG_VAL_STATUS_RENDERING_ACTIVE))
                {
-                       break;
+                       rawstat = mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_RAWSTAT);
+                       if (rawstat == MALI400PP_REG_VAL_IRQ_RESET_COMPLETED)
+                       {
+                               break;
+                       }
                }
        }
 
@@ -471,33 +473,30 @@ void mali_pp_print_state(struct mali_pp_core *core)
 }
 #endif
 
-void mali_pp_update_performance_counters(struct mali_pp_core *core, struct mali_pp_job *job, u32 subjob)
+void mali_pp_update_performance_counters(struct mali_pp_core *parent, struct mali_pp_core *child, struct mali_pp_job *job, u32 subjob)
 {
        u32 val0 = 0;
        u32 val1 = 0;
 #if defined(CONFIG_MALI400_PROFILING)
-       int counter_index = COUNTER_FP0_C0 + (2 * core->core_id);
+       int counter_index = COUNTER_FP0_C0 + (2 * child->core_id);
 #endif
 
-       if (MALI_HW_CORE_NO_COUNTER != core->counter_src0_used)
+       if (MALI_HW_CORE_NO_COUNTER != parent->counter_src0_used)
        {
-               val0 = mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_0_VALUE);
-
+               val0 = mali_hw_core_register_read(&child->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_0_VALUE);
                mali_pp_job_set_perf_counter_value0(job, subjob, val0);
 
 #if defined(CONFIG_MALI400_PROFILING)
-               /*todo: check if the group is virtual - in such case, does it make sense to send a HW counter ?*/
                _mali_osk_profiling_report_hw_counter(counter_index, val0);
 #endif
        }
 
-       if (MALI_HW_CORE_NO_COUNTER != core->counter_src1_used)
+       if (MALI_HW_CORE_NO_COUNTER != parent->counter_src1_used)
        {
-               val1 = mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_1_VALUE);
+               val1 = mali_hw_core_register_read(&child->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_1_VALUE);
                mali_pp_job_set_perf_counter_value1(job, subjob, val1);
 
 #if defined(CONFIG_MALI400_PROFILING)
-               /*todo: check if the group is virtual - in such case, does it make sense to send a HW counter ?*/
                _mali_osk_profiling_report_hw_counter(counter_index + 1, val1);
 #endif
        }
index 7906950c8a51d8f44f33c1cc9d12358d5154597c..844310debae56e60f1fee06cd1432af0c5166ba6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -28,6 +28,7 @@ struct mali_pp_core
        struct mali_hw_core  hw_core;           /**< Common for all HW cores */
        _mali_osk_irq_t     *irq;               /**< IRQ handler */
        u32                  core_id;           /**< Unique core ID */
+       u32                  bcast_id;          /**< The "flag" value used by the Mali-450 broadcast and DLBU unit */
        u32                  counter_src0_used; /**< The selected performance counter 0 when a job is running */
        u32                  counter_src1_used; /**< The selected performance counter 1 when a job is running */
 };
@@ -35,7 +36,7 @@ struct mali_pp_core
 _mali_osk_errcode_t mali_pp_initialize(void);
 void mali_pp_terminate(void);
 
-struct mali_pp_core *mali_pp_create(const _mali_osk_resource_t * resource, struct mali_group *group, mali_bool is_virtual);
+struct mali_pp_core *mali_pp_create(const _mali_osk_resource_t * resource, struct mali_group *group, mali_bool is_virtual, u32 bcast_id);
 void mali_pp_delete(struct mali_pp_core *core);
 
 void mali_pp_stop_bus(struct mali_pp_core *core);
@@ -55,13 +56,31 @@ MALI_STATIC_INLINE u32 mali_pp_core_get_id(struct mali_pp_core *core)
        return core->core_id;
 }
 
+MALI_STATIC_INLINE u32 mali_pp_core_get_bcast_id(struct mali_pp_core *core)
+{
+       MALI_DEBUG_ASSERT_POINTER(core);
+       return core->bcast_id;
+}
+
 struct mali_pp_core* mali_pp_get_global_pp_core(u32 index);
 u32 mali_pp_get_glob_num_pp_cores(void);
 
 /* Debug */
 u32 mali_pp_dump_state(struct mali_pp_core *core, char *buf, u32 size);
 
-void mali_pp_update_performance_counters(struct mali_pp_core *core, struct mali_pp_job *job, u32 subjob);
+/**
+ * Put instrumented HW counters from the core(s) to the job object (if enabled)
+ *
+ * parent and child is always the same, except for virtual jobs on Mali-450.
+ * In this case, the counters will be enabled on the virtual core (parent),
+ * but values need to be read from the child cores.
+ *
+ * @param parent The core used to see if the counters was enabled
+ * @param child The core to actually read the values from
+ * @job Job object to update with counter values (if enabled)
+ * @subjob Which subjob the counters are applicable for (core ID for virtual jobs)
+ */
+void mali_pp_update_performance_counters(struct mali_pp_core *parent, struct mali_pp_core *child, struct mali_pp_job *job, u32 subjob);
 
 MALI_STATIC_INLINE const char *mali_pp_get_hw_core_desc(struct mali_pp_core *core)
 {
@@ -79,6 +98,11 @@ MALI_STATIC_INLINE u32 mali_pp_read_rawstat(struct mali_pp_core *core)
        return mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_RAWSTAT) & MALI200_REG_VAL_IRQ_MASK_USED;
 }
 
+MALI_STATIC_INLINE u32 mali_pp_read_status(struct mali_pp_core *core)
+{
+       return mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_STATUS);
+}
+
 MALI_STATIC_INLINE void mali_pp_mask_all_interrupts(struct mali_pp_core *core)
 {
        mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_MASK, MALI200_REG_VAL_IRQ_MASK_NONE);
index 1135e86770554f0a5a5c241169663bf102748924..d8ba6ab7997089d3e40b150982d290e9099d17a5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -22,36 +22,24 @@ struct mali_pp_job *mali_pp_job_create(struct mali_session_data *session, _mali_
        struct mali_pp_job *job;
        u32 perf_counter_flag;
 
-       job = _mali_osk_malloc(sizeof(struct mali_pp_job));
+       job = _mali_osk_calloc(1, sizeof(struct mali_pp_job));
        if (NULL != job)
        {
-               u32 i;
-
                if (0 != _mali_osk_copy_from_user(&job->uargs, uargs, sizeof(_mali_uk_pp_start_job_s)))
                {
-                       _mali_osk_free(job);
-                       return NULL;
+                       goto fail;
                }
 
                if (job->uargs.num_cores > _MALI_PP_MAX_SUB_JOBS)
                {
                        MALI_PRINT_ERROR(("Mali PP job: Too many sub jobs specified in job object\n"));
-                       _mali_osk_free(job);
-                       return NULL;
+                       goto fail;
                }
 
                if (!mali_pp_job_use_no_notification(job))
                {
                        job->finished_notification = _mali_osk_notification_create(_MALI_NOTIFICATION_PP_FINISHED, sizeof(_mali_uk_pp_job_finished_s));
-                       if (NULL == job->finished_notification)
-                       {
-                               _mali_osk_free(job);
-                               return NULL;
-                       }
-               }
-               else
-               {
-                       job->finished_notification = NULL;
+                       if (NULL == job->finished_notification) goto fail;
                }
 
                perf_counter_flag = mali_pp_job_get_perf_counter_flag(job);
@@ -70,32 +58,68 @@ struct mali_pp_job *mali_pp_job_create(struct mali_session_data *session, _mali_
                _mali_osk_list_init(&job->session_list);
                job->id = id;
 
-               for (i = 0; i < job->uargs.num_cores; i++)
-               {
-                       job->perf_counter_value0[i] = 0;
-                       job->perf_counter_value1[i] = 0;
-               }
                job->sub_jobs_num = job->uargs.num_cores ? job->uargs.num_cores : 1;
-               job->sub_jobs_started = 0;
-               job->sub_jobs_completed = 0;
-               job->sub_job_errors = 0;
                job->pid = _mali_osk_get_pid();
                job->tid = _mali_osk_get_tid();
-#if defined(CONFIG_SYNC)
-               job->sync_point = NULL;
-               job->pre_fence = NULL;
-               job->sync_work = NULL;
+
+               job->num_memory_cookies = job->uargs.num_memory_cookies;
+               if (job->num_memory_cookies > 0)
+               {
+                       u32 size;
+
+                       if (job->uargs.num_memory_cookies > session->descriptor_mapping->current_nr_mappings)
+                       {
+                               MALI_PRINT_ERROR(("Mali PP job: Too many memory cookies specified in job object\n"));
+                               goto fail;
+                       }
+
+                       size = sizeof(*job->uargs.memory_cookies) * job->num_memory_cookies;
+
+                       job->memory_cookies = _mali_osk_malloc(size);
+                       if (NULL == job->memory_cookies)
+                       {
+                               MALI_PRINT_ERROR(("Mali PP job: Failed to allocate %d bytes of memory cookies!\n", size));
+                               goto fail;
+                       }
+
+                       if (0 != _mali_osk_copy_from_user(job->memory_cookies, job->uargs.memory_cookies, size))
+                       {
+                               MALI_PRINT_ERROR(("Mali PP job: Failed to copy %d bytes of memory cookies from user!\n", size));
+                               goto fail;
+                       }
+
+#if defined(CONFIG_DMA_SHARED_BUFFER) && !defined(CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH)
+                       job->num_dma_bufs = job->num_memory_cookies;
+                       job->dma_bufs = _mali_osk_calloc(job->num_dma_bufs, sizeof(struct mali_dma_buf_attachment *));
+                       if (NULL == job->dma_bufs)
+                       {
+                               MALI_PRINT_ERROR(("Mali PP job: Failed to allocate dma_bufs array!\n"));
+                               goto fail;
+                       }
 #endif
+               }
+               else
+               {
+                       job->memory_cookies = NULL;
+               }
 
                return job;
        }
 
+fail:
+       if (NULL != job)
+       {
+               mali_pp_job_delete(job);
+       }
+
        return NULL;
 }
 
 void mali_pp_job_delete(struct mali_pp_job *job)
 {
 #ifdef CONFIG_SYNC
+       /* It is safe to delete the work without flushing. */
+       if (NULL != job->sync_work) _mali_osk_wq_delete_work_nonflush(job->sync_work);
        if (NULL != job->pre_fence) sync_fence_put(job->pre_fence);
        if (NULL != job->sync_point) sync_fence_put(job->sync_point->fence);
 #endif
@@ -103,6 +127,13 @@ void mali_pp_job_delete(struct mali_pp_job *job)
        {
                _mali_osk_notification_delete(job->finished_notification);
        }
+
+       _mali_osk_free(job->memory_cookies);
+
+#if defined(CONFIG_DMA_SHARED_BUFFER) && !defined(CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH)
+       _mali_osk_free(job->dma_bufs);
+#endif
+
        _mali_osk_free(job);
 }
 
index 208e73fc2ab61ddb560f4ae43f1642ee782f19d3..1cf19808b3a7937e955b96e8ad0dfeb1db248026 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -22,6 +22,9 @@
 #include <linux/sync.h>
 #endif
 #include "mali_dlbu.h"
+#if defined(CONFIG_DMA_SHARED_BUFFER) && !defined(CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH)
+#include "linux/mali_dma_buf.h"
+#endif
 
 /**
  * The structure represents a PP job, including all sub-jobs
@@ -44,6 +47,12 @@ struct mali_pp_job
        u32 pid;                                           /**< Process ID of submitting process */
        u32 tid;                                           /**< Thread ID of submitting thread */
        _mali_osk_notification_t *finished_notification;   /**< Notification sent back to userspace on job complete */
+       u32 num_memory_cookies;                            /**< Number of memory cookies attached to job */
+       u32 *memory_cookies;                               /**< Memory cookies attached to job */
+#if defined(CONFIG_DMA_SHARED_BUFFER) && !defined(CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH)
+       struct mali_dma_buf_attachment **dma_bufs;         /**< Array of DMA-bufs used by job */
+       u32 num_dma_bufs;                                  /**< Number of DMA-bufs used by job */
+#endif
 #ifdef CONFIG_SYNC
        mali_sync_pt *sync_point;                          /**< Sync point to signal on completion */
        struct sync_fence_waiter sync_waiter;              /**< Sync waiter for async wait */
index bb66d836f945159a4fcf26bcd79b25f8945e649d..dcf105103ea5928fbe84b4f1b49d3b4909254392 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
 #include "mali_group.h"
 #include "mali_pm.h"
 
+#if defined(CONFIG_DMA_SHARED_BUFFER)
+#include "mali_dma_buf.h"
+#endif
+
+/* With certain configurations, job deletion involves functions which cannot be called from atomic context.
+ * This #if checks for those cases and enables job deletion to be deferred and run in a different context. */
 #if defined(CONFIG_SYNC)
 #define MALI_PP_SCHEDULER_USE_DEFERRED_JOB_DELETE 1
 #endif
@@ -185,13 +191,15 @@ void mali_pp_scheduler_terminate(void)
 {
        struct mali_group *group, *temp;
 
+       MALI_DEBUG_ASSERT(_mali_osk_list_empty(&group_list_working));
+       MALI_DEBUG_ASSERT(!virtual_group_working);
+
        /* Delete all groups owned by scheduler */
        if (NULL != virtual_group)
        {
                mali_group_delete(virtual_group);
        }
 
-       MALI_DEBUG_ASSERT(_mali_osk_list_empty(&group_list_working));
        _MALI_OSK_LIST_FOREACHENTRY(group, temp, &group_list_idle, struct mali_group, pp_scheduler_list)
        {
                mali_group_delete(group);
@@ -524,7 +532,7 @@ static void mali_pp_scheduler_schedule(void)
 
                mali_group_unlock(group);
 
-               /* @@@@ todo: remove the return value from mali_group_start_xx_job, since we can't fail on Mali-300++ */
+               /* remove the return value from mali_group_start_xx_job, since we can't fail on Mali-300++ */
        }
 }
 
@@ -533,7 +541,7 @@ static void mali_pp_scheduler_return_job_to_user(struct mali_pp_job *job, mali_b
        if (MALI_FALSE == mali_pp_job_use_no_notification(job))
        {
                u32 i;
-               u32 sub_jobs = mali_pp_job_get_sub_job_count(job);
+               u32 num_counters_to_copy;
                mali_bool success = mali_pp_job_was_success(job);
 
                _mali_uk_pp_job_finished_s *jobres = job->finished_notification->result_buffer;
@@ -548,7 +556,16 @@ static void mali_pp_scheduler_return_job_to_user(struct mali_pp_job *job, mali_b
                        jobres->status = _MALI_UK_JOB_STATUS_END_UNKNOWN_ERR;
                }
 
-               for (i = 0; i < sub_jobs; i++)
+               if (mali_pp_job_is_virtual(job))
+               {
+                       num_counters_to_copy = num_cores; /* Number of physical cores available */
+               }
+               else
+               {
+                       num_counters_to_copy = mali_pp_job_get_sub_job_count(job);
+               }
+
+               for (i = 0; i < num_counters_to_copy; i++)
                {
                        jobres->perf_counter0[i] = mali_pp_job_get_perf_counter_value0(job, i);
                        jobres->perf_counter1[i] = mali_pp_job_get_perf_counter_value1(job, i);
@@ -642,7 +659,6 @@ void mali_pp_scheduler_job_done(struct mali_group *group, struct mali_pp_job *jo
                /* Remove job from session list */
                _mali_osk_list_del(&job->session_list);
 
-               /* Send notification back to user space */
                MALI_DEBUG_PRINT(4, ("Mali PP scheduler: All parts completed for %s job %u (0x%08X)\n",
                                     mali_pp_job_is_virtual(job) ? "virtual" : "physical",
                                     mali_pp_job_get_id(job), job));
@@ -659,6 +675,16 @@ void mali_pp_scheduler_job_done(struct mali_group *group, struct mali_pp_job *jo
                }
 #endif
 
+#if defined(CONFIG_DMA_SHARED_BUFFER) && !defined(CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH)
+               /* Unmap buffers attached to job */
+               if (0 < job->num_dma_bufs)
+               {
+                       mali_dma_buf_unmap_job(job);
+               }
+#endif /* CONFIG_DMA_SHARED_BUFFER */
+
+
+               /* Send notification back to user space */
 #if defined(MALI_PP_SCHEDULER_USE_DEFERRED_JOB_DELETE)
                mali_pp_scheduler_return_job_to_user(job, MALI_TRUE);
 #else
@@ -686,6 +712,14 @@ void mali_pp_scheduler_job_done(struct mali_group *group, struct mali_pp_job *jo
                 * num_slots == num_slots_idle, so unless we are done working, no
                 * threads will actually be woken up.
                 */
+               if (mali_group_is_virtual(group))
+               {
+                       virtual_group_working = MALI_FALSE;
+               }
+               else
+               {
+                       _mali_osk_list_move(&(group->pp_scheduler_list), &group_list_idle);
+               }
                _mali_osk_wait_queue_wake_up(pp_scheduler_working_wait_queue);
                mali_pp_scheduler_unlock();
                return;
@@ -695,8 +729,6 @@ void mali_pp_scheduler_job_done(struct mali_group *group, struct mali_pp_job *jo
        {
                /* A barrier was resolved, so schedule previously blocked jobs */
                _mali_osk_wq_schedule_work(pp_scheduler_wq_schedule);
-
-               /* TODO: Subjob optimisation */
        }
 
        /* Recycle variables */
@@ -788,7 +820,7 @@ void mali_pp_scheduler_job_done(struct mali_group *group, struct mali_pp_job *jo
                        }
                        else
                        {
-                               /* @@@@ todo: this cant fail on Mali-300+, no need to implement put back of job */
+                               /* this cant fail on Mali-300+, no need to implement put back of job */
                                MALI_DEBUG_ASSERT(0);
                        }
 
@@ -828,7 +860,7 @@ void mali_pp_scheduler_job_done(struct mali_group *group, struct mali_pp_job *jo
                else if (NULL != virtual_group)
                {
                        /* Rejoin virtual group */
-                       /* TODO: In the future, a policy check might be useful here */
+                       /* In the future, a policy check might be useful here */
 
                        /* We're no longer needed on the scheduler list */
                        _mali_osk_list_delinit(&(group->pp_scheduler_list));
@@ -841,12 +873,10 @@ void mali_pp_scheduler_job_done(struct mali_group *group, struct mali_pp_job *jo
                        mali_group_unlock(group);
 
                        mali_group_lock(virtual_group);
-                       /* TODO: Take group lock also? */
                        mali_group_add_group(virtual_group, group);
                        mali_group_unlock(virtual_group);
 
                        /* We need to return from this function with the group lock held */
-                       /* TODO: optimise! */
                        mali_group_lock(group);
                }
                else
@@ -886,6 +916,14 @@ MALI_STATIC_INLINE void mali_pp_scheduler_queue_job(struct mali_pp_job *job, str
 {
        MALI_DEBUG_ASSERT_POINTER(job);
 
+#if defined(CONFIG_DMA_SHARED_BUFFER) && !defined(CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH)
+       /* Map buffers attached to job */
+       if (0 != job->num_memory_cookies)
+       {
+               mali_dma_buf_map_job(job);
+       }
+#endif /* CONFIG_DMA_SHARED_BUFFER */
+
        mali_pm_core_event(MALI_CORE_EVENT_PP_START);
 
        mali_pp_scheduler_lock();
@@ -968,9 +1006,6 @@ _mali_osk_errcode_t _mali_ukk_pp_start_job(void *ctx, _mali_uk_pp_start_job_s *u
 {
        struct mali_session_data *session;
        struct mali_pp_job *job;
-#if defined(CONFIG_SYNC)
-       int post_fence = -1;
-#endif
 
        MALI_DEBUG_ASSERT_POINTER(uargs);
        MALI_DEBUG_ASSERT_POINTER(ctx);
@@ -1001,6 +1036,8 @@ _mali_osk_errcode_t _mali_ukk_pp_start_job(void *ctx, _mali_uk_pp_start_job_s *u
 #if defined(CONFIG_SYNC)
        if (_MALI_PP_JOB_FLAG_FENCE & job->uargs.flags)
        {
+               int post_fence = -1;
+
                job->sync_point = mali_stream_create_point(job->uargs.stream);
 
                if (unlikely(NULL == job->sync_point))
@@ -1032,13 +1069,60 @@ _mali_osk_errcode_t _mali_ukk_pp_start_job(void *ctx, _mali_uk_pp_start_job_s *u
 
                MALI_DEBUG_PRINT(3, ("Sync: Created fence %d for job %d\n", post_fence, mali_pp_job_get_id(job)));
        }
+       else if (_MALI_PP_JOB_FLAG_EMPTY_FENCE & job->uargs.flags)
+       {
+               int empty_fence_fd = job->uargs.stream;
+               struct sync_fence *empty_fence;
+               struct sync_pt *pt;
+               int ret;
+
+               /* Grab and keep a reference to the fence. It must be around
+                * when the job is completed, so the point can be signalled. */
+               empty_fence = sync_fence_fdget(empty_fence_fd);
+
+               if (unlikely(NULL == empty_fence))
+               {
+                       MALI_DEBUG_PRINT_ERROR(("Failed to accept empty fence: %d\n", empty_fence_fd));
+                       mali_pp_job_mark_sub_job_completed(job, MALI_FALSE); /* Flagging the job as failed. */
+                       mali_pp_scheduler_return_job_to_user(job, MALI_FALSE); /* This will also delete the job object */
+                       return _MALI_OSK_ERR_OK;
+               }
+
+               if (unlikely(list_empty(&empty_fence->pt_list_head)))
+               {
+                       MALI_DEBUG_PRINT_ERROR(("Failed to accept empty fence: %d\n", empty_fence_fd));
+                       sync_fence_put(empty_fence);
+                       mali_pp_job_mark_sub_job_completed(job, MALI_FALSE); /* Flagging the job as failed. */
+                       mali_pp_scheduler_return_job_to_user(job, MALI_FALSE); /* This will also delete the job object */
+                       return _MALI_OSK_ERR_OK;
+               }
+
+               pt = list_first_entry(&empty_fence->pt_list_head, struct sync_pt, pt_list);
+
+               ret = mali_sync_timed_commit(pt);
+
+               if (unlikely(0 != ret))
+               {
+                       MALI_DEBUG_PRINT_ERROR(("Empty fence not valid: %d\n", empty_fence_fd));
+                       sync_fence_put(empty_fence);
+                       mali_pp_job_mark_sub_job_completed(job, MALI_FALSE); /* Flagging the job as failed. */
+                       mali_pp_scheduler_return_job_to_user(job, MALI_FALSE); /* This will also delete the job object */
+                       return _MALI_OSK_ERR_OK;
+               }
+
+               job->sync_point = pt;
+
+               *fence = empty_fence_fd;
+
+               MALI_DEBUG_PRINT(3, ("Sync: Job %d now backs fence %d\n", mali_pp_job_get_id(job), empty_fence_fd));
+       }
 
        if (0 < job->uargs.fence)
        {
                int pre_fence_fd = job->uargs.fence;
                int err;
 
-               MALI_DEBUG_PRINT(2, ("Sync: Job %d waiting for fence %d\n", mali_pp_job_get_id(job), pre_fence_fd));
+               MALI_DEBUG_PRINT(3, ("Sync: Job %d waiting for fence %d\n", mali_pp_job_get_id(job), pre_fence_fd));
 
                job->pre_fence = sync_fence_fdget(pre_fence_fd); /* Reference will be released when job is deleted. */
                if (NULL == job->pre_fence)
@@ -1079,7 +1163,10 @@ _mali_osk_errcode_t _mali_ukk_pp_start_job(void *ctx, _mali_uk_pp_start_job_s *u
                {
                        /* Fence has already signalled */
                        mali_pp_scheduler_queue_job(job, session);
-                       if (0 == _mali_osk_list_empty(&group_list_idle)) mali_pp_scheduler_schedule();
+                       if (!_mali_osk_list_empty(&group_list_idle) || !virtual_group_working)
+                       {
+                               mali_pp_scheduler_schedule();
+                       }
                        return _MALI_OSK_ERR_OK;
                }
                else if (0 > err)
@@ -1291,6 +1378,7 @@ void mali_pp_scheduler_reset_all_groups(void)
        }
 
        MALI_DEBUG_ASSERT(_mali_osk_list_empty(&group_list_working));
+       MALI_DEBUG_ASSERT(!virtual_group_working);
 
        _MALI_OSK_LIST_FOREACHENTRY(group, temp, &group_list_idle, struct mali_group, pp_scheduler_list)
        {
index d0695c60d6ff9c42c417c5f6d226ec7eefa15377..0dd7feb3f6981eddfd839b07559d2e1b60f95794 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index f36020937e9ec9e5df8641a3cb47013a2ab6ba6f..f288b32ec433cec487b1cf02194fe34de2b48064 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 63e5be886715268ea6305c3ecf276dfd06b6017a..d9c0b2c1017b6793567f7a2c1f68ab12fd54ce8b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 2394bb90889e71d6af486690022c94e35b1fb9a9..ecf89f5df5a5243b54ba9c5d7b8a668ab1c634ad 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 5c34ddebb31679a0f9aec23bf1b384b604fcba21..2115ba5dbbd89c9cabdc799bbddc3e100210b4ba 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 833251e4744bb820e41e5a733c4ed3c444d5d28d..ac590c6863df51a56ab7816d5b7c4c82c5538d39 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -357,6 +357,12 @@ _mali_osk_errcode_t _mali_ukk_query_mmu_page_table_dump_size( _mali_uk_query_mmu
  */
 _mali_osk_errcode_t _mali_ukk_dump_mmu_page_table( _mali_uk_dump_mmu_page_table_s * args );
 
+/** @brief Write user data to specified Mali memory without causing segfaults.
+ * @param args see _mali_uk_mem_write_safe_s in mali_utgard_uk_types.h
+ * @return _MALI_OSK_ERR_OK on success, otherwise a suitable _mali_osk_errcode_t on failure.
+ */
+_mali_osk_errcode_t _mali_ukk_mem_write_safe( _mali_uk_mem_write_safe_s *args );
+
 /** @brief Map a physically contiguous range of memory into Mali
  * @param args see _mali_uk_map_external_mem_s in mali_utgard_uk_types.h
  * @return _MALI_OSK_ERR_OK on success, otherwise a suitable _mali_osk_errcode_t on failure.
index d3f1e5007e9596f651ca69958138e448eefb0d63..6aa14bc0e97423b433f1bdb7a8d69f17f272ad5d 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -38,7 +38,11 @@ void mali_set_user_setting(_mali_uk_user_setting_t setting, u32 value)
 {
        mali_bool notify = MALI_FALSE;
 
-       MALI_DEBUG_ASSERT(setting < _MALI_UK_USER_SETTING_MAX && setting >= 0);
+       if (setting >= _MALI_UK_USER_SETTING_MAX || setting < 0)
+       {
+               MALI_DEBUG_PRINT_ERROR(("Invalid user setting %ud\n"));
+               return;
+       }
 
        if (mali_user_settings[setting] != value)
        {
@@ -55,7 +59,10 @@ void mali_set_user_setting(_mali_uk_user_setting_t setting, u32 value)
 
 u32 mali_get_user_setting(_mali_uk_user_setting_t setting)
 {
-       MALI_DEBUG_ASSERT(setting < _MALI_UK_USER_SETTING_MAX && setting >= 0);
+       if (setting >= _MALI_UK_USER_SETTING_MAX || setting < 0)
+       {
+               return 0;
+       }
 
        return mali_user_settings[setting];
 }
index fbb9415729c64c1d81701b39503332512b74eea4..578b8e3d002ef15fee98403229d3c06c4d883226 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 097d1de5c87e2c46bcfe72b1642938da4c10d85e..e12c4de538eefc83baeca8739d367a68448e2604 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 3ef9a28b74f28bca7c8468acc2e0d8c558f1358a..c8ebba6d6317389706c202dc7c102950789717b9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 88813666365ce93d585251402f82107c6f8f793c..fdb767ba4107e67f984a1d6fc6806f5614ba4c38 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -45,6 +45,7 @@ extern "C"
 #define MALI_IOC_GET_USER_SETTING           _IOWR(MALI_IOC_CORE_BASE, _MALI_UK_GET_USER_SETTING, _mali_uk_get_user_setting_s *)
 #define MALI_IOC_GET_USER_SETTINGS          _IOWR(MALI_IOC_CORE_BASE, _MALI_UK_GET_USER_SETTINGS, _mali_uk_get_user_settings_s *)
 #define MALI_IOC_STREAM_CREATE              _IOWR(MALI_IOC_CORE_BASE, _MALI_UK_STREAM_CREATE, _mali_uk_stream_create_s *)
+#define MALI_IOC_FENCE_CREATE_EMPTY         _IOWR(MALI_IOC_CORE_BASE, _MALI_UK_FENCE_CREATE_EMPTY, _mali_uk_fence_create_empty_s *)
 #define MALI_IOC_FENCE_VALIDATE             _IOR(MALI_IOC_CORE_BASE, _MALI_UK_FENCE_VALIDATE, _mali_uk_fence_validate_s *)
 
 #define MALI_IOC_MEM_GET_BIG_BLOCK          _IOWR(MALI_IOC_MEMORY_BASE, _MALI_UK_GET_BIG_BLOCK, void *)
@@ -60,6 +61,7 @@ extern "C"
 #define MALI_IOC_MEM_RELEASE_UMP            _IOW(MALI_IOC_MEMORY_BASE, _MALI_UK_RELEASE_UMP_MEM, _mali_uk_release_ump_mem_s *)
 #define MALI_IOC_MEM_QUERY_MMU_PAGE_TABLE_DUMP_SIZE _IOR (MALI_IOC_MEMORY_BASE, _MALI_UK_QUERY_MMU_PAGE_TABLE_DUMP_SIZE, _mali_uk_query_mmu_page_table_dump_size_s *)
 #define MALI_IOC_MEM_DUMP_MMU_PAGE_TABLE    _IOWR(MALI_IOC_MEMORY_BASE, _MALI_UK_DUMP_MMU_PAGE_TABLE, _mali_uk_dump_mmu_page_table_s *)
+#define MALI_IOC_MEM_WRITE_SAFE             _IOWR(MALI_IOC_MEMORY_BASE, _MALI_UK_MEM_WRITE_SAFE, _mali_uk_mem_write_safe_s *)
 
 #define MALI_IOC_PP_START_JOB               _IOWR(MALI_IOC_PP_BASE, _MALI_UK_PP_START_JOB, _mali_uk_pp_start_job_s *)
 #define MALI_IOC_PP_NUMBER_OF_CORES_GET            _IOR (MALI_IOC_PP_BASE, _MALI_UK_GET_PP_NUMBER_OF_CORES, _mali_uk_get_pp_number_of_cores_s *)
index 6c0ebaf7a16533d3aa5b4e102d9fd730e705c43d..69e52d48040229076ca95c19e28e3828903904b8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -66,8 +66,11 @@ typedef enum
        MALI_PROFILING_EVENT_REASON_SINGLE_SW_FB_EVENT              = 4,
        MALI_PROFILING_EVENT_REASON_SINGLE_SW_GP_ENQUEUE            = 5,
        MALI_PROFILING_EVENT_REASON_SINGLE_SW_PP_ENQUEUE            = 6,
+       MALI_PROFILING_EVENT_REASON_SINGLE_SW_READBACK              = 7,
+       MALI_PROFILING_EVENT_REASON_SINGLE_SW_WRITEBACK             = 8,
     MALI_PROFILING_EVENT_REASON_SINGLE_SW_ENTER_API_FUNC        = 10,
     MALI_PROFILING_EVENT_REASON_SINGLE_SW_LEAVE_API_FUNC        = 11,
+       MALI_PROFILING_EVENT_REASON_SINGLE_SW_DISCARD_ATTACHMENTS     = 13,
     MALI_PROFILING_EVENT_REASON_SINGLE_SW_UMP_TRY_LOCK          = 53,
        MALI_PROFILING_EVENT_REASON_SINGLE_SW_UMP_LOCK              = 54,
        MALI_PROFILING_EVENT_REASON_SINGLE_SW_UMP_UNLOCK            = 55,
@@ -118,6 +121,8 @@ typedef enum
        MALI_PROFILING_EVENT_REASON_SUSPEND_RESUME_SW_X11_GLOBAL_LOCK        = 37, /* Not currently used */
        MALI_PROFILING_EVENT_REASON_SUSPEND_RESUME_SW_X11_SWAP               = 38, /* Not currently used */
        MALI_PROFILING_EVENT_REASON_SUSPEND_RESUME_SW_MALI_EGL_IMAGE_SYNC_WAIT = 39, /* USED */
+       MALI_PROFILING_EVENT_REASON_SUSPEND_RESUME_SW_GP_JOB_HANDLING         =40, /* USED */
+       MALI_PROFILING_EVENT_REASON_SUSPEND_RESUME_SW_PP_JOB_HANDLING         =41, /* USED */
 } cinstr_profiling_event_reason_suspend_resume_sw_t;
 
 /**
index 4c0c57df801aec8ff75fc845e6a4b3619341ad88..fbcf7cf23ceb9b248c5e4ddc127e3a4f755d46f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -69,6 +69,7 @@ typedef enum
        _MALI_UK_GET_USER_SETTING,       /**< _mali_ukk_get_user_setting() *//**< [out] */
        _MALI_UK_GET_USER_SETTINGS,       /**< _mali_ukk_get_user_settings() *//**< [out] */
        _MALI_UK_STREAM_CREATE,           /**< _mali_ukk_stream_create() */
+       _MALI_UK_FENCE_CREATE_EMPTY,           /**< _mali_ukk_fence_create_empty() */
        _MALI_UK_FENCE_VALIDATE,          /**< _mali_ukk_fence_validate() */
 
        /** Memory functions */
@@ -89,6 +90,7 @@ typedef enum
     _MALI_UK_MAP_EXT_MEM,                    /**< _mali_uku_map_external_mem() */
     _MALI_UK_UNMAP_EXT_MEM,                  /**< _mali_uku_unmap_external_mem() */
     _MALI_UK_VA_TO_MALI_PA,                  /**< _mali_uku_va_to_mali_pa() */
+    _MALI_UK_MEM_WRITE_SAFE,                 /**< _mali_uku_mem_write_safe() */
 
     /** Common functions for each core */
 
@@ -425,6 +427,7 @@ typedef struct
 #define _MALI_PP_JOB_FLAG_NO_NOTIFICATION (1<<0)
 #define _MALI_PP_JOB_FLAG_BARRIER         (1<<1)
 #define _MALI_PP_JOB_FLAG_FENCE           (1<<2)
+#define _MALI_PP_JOB_FLAG_EMPTY_FENCE     (1<<3)
 
 /** @defgroup _mali_uk_ppstartjob_s Fragment Processor Start Job
  * @{ */
@@ -490,7 +493,9 @@ typedef struct
        u32 flush_id;                       /**< [in] flush id within the originating frame builder */
        u32 flags;                          /**< [in] See _MALI_PP_JOB_FLAG_* for a list of avaiable flags */
        s32 fence;                          /**< [in,out] Fence to wait on / fence that will be signalled on job completion, if _MALI_PP_JOB_FLAG_FENCE is set */
-       s32 stream;                         /**< [in] Steam identifier */
+       s32 stream;                         /**< [in] Steam identifier if _MALI_PP_JOB_FLAG_FENCE, an empty fence to use for this job if _MALI_PP_JOB_FLAG_EMPTY_FENCE is set */
+       u32 num_memory_cookies;             /**< [in] number of memory cookies attached to job */
+       u32 *memory_cookies;                /**< [in] memory cookies attached to job  */
 } _mali_uk_pp_start_job_s;
 /** @} */ /* end group _mali_uk_ppstartjob_s */
 
@@ -708,7 +713,7 @@ typedef struct
  * The 16bit integer is stored twice in a 32bit integer
  * For example, for version 1 the value would be 0x00010001
  */
-#define _MALI_API_VERSION 19
+#define _MALI_API_VERSION 20
 #define _MALI_UK_API_VERSION _MAKE_VERSION_ID(_MALI_API_VERSION)
 
 /**
@@ -877,6 +882,16 @@ typedef struct
        u32 size;                       /**< [in,out] Size of the range, in bytes. */
 } _mali_uk_va_to_mali_pa_s;
 
+/**
+ * @brief Arguments for _mali_uk[uk]_mem_write_safe()
+ */
+typedef struct
+{
+       void *ctx;        /**< [in,out] user-kernel context (trashed on output) */
+       const void *src;  /**< [in]     Pointer to source data */
+       void *dest;       /**< [in]     Destination Mali buffer */
+       u32 size;         /**< [in,out] Number of bytes to write/copy on input, number of bytes actually written/copied on output */
+} _mali_uk_mem_write_safe_s;
 
 typedef struct
 {
@@ -1111,6 +1126,15 @@ typedef struct
        int fd;                         /**< [in] file descriptor describing stream */
 } _mali_uk_stream_destroy_s;
 
+/** @brief Create empty fence
+ */
+typedef struct
+{
+       void *ctx;                      /**< [in,out] user-kernel context (trashed on output) */
+       s32 stream;                     /**< [in] stream to create fence on */
+       s32 fence;                      /**< [out] file descriptor describing fence */
+} _mali_uk_fence_create_empty_s;
+
 /** @brief Check fence validity
  */
 typedef struct
index e9e5e55a08222775d2e31d9b449e8378edee39af..3791cfe2d60e019791933c6798056e99249b6821 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 01eef95034df04bbbddf859f4d39709de1ca82bd..39955c5f8b4df41c6dce719a70d7b3764e332c13 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -14,6 +14,9 @@
 #include <linux/scatterlist.h>
 #include <linux/rbtree.h>
 #include <linux/platform_device.h>
+#include <linux/wait.h>
+#include <linux/sched.h>
+#include <asm/spinlock.h>
 
 #include "mali_ukk.h"
 #include "mali_osk.h"
 
 #include "mali_kernel_memory_engine.h"
 #include "mali_memory.h"
+#include "mali_dma_buf.h"
 
 
 struct mali_dma_buf_attachment {
        struct dma_buf *buf;
        struct dma_buf_attachment *attachment;
        struct sg_table *sgt;
-       _mali_osk_atomic_t ref;
-       struct rb_node rb_node;
+       struct mali_session_data *session;
+       int map_ref;
+       spinlock_t map_lock;
+       mali_bool is_mapped;
+       wait_queue_head_t wait_queue;
 };
 
-static struct rb_root mali_dma_bufs = RB_ROOT;
-static DEFINE_SPINLOCK(mali_dma_bufs_lock);
+void mali_dma_buf_release(void *ctx, void *handle)
+{
+       struct mali_dma_buf_attachment *mem;
+
+       mem = (struct mali_dma_buf_attachment *)handle;
+
+       MALI_DEBUG_PRINT(3, ("Mali DMA-buf: release attachment %p\n", mem));
+
+       MALI_DEBUG_ASSERT_POINTER(mem);
+       MALI_DEBUG_ASSERT_POINTER(mem->attachment);
+       MALI_DEBUG_ASSERT_POINTER(mem->buf);
+
+#if defined(CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH)
+       /* We mapped implicitly on attach, so we need to unmap on release */
+       mali_dma_buf_unmap(mem);
+#endif
+
+       /* Wait for buffer to become unmapped */
+       wait_event(mem->wait_queue, 0 == mem->map_ref);
+       MALI_DEBUG_ASSERT(!mem->is_mapped);
 
-static inline struct mali_dma_buf_attachment *mali_dma_buf_lookup(struct rb_root *root, struct dma_buf *target)
+       dma_buf_detach(mem->buf, mem->attachment);
+       dma_buf_put(mem->buf);
+
+       _mali_osk_free(mem);
+}
+
+/*
+ * Map DMA buf attachment \a mem into \a session at virtual address \a virt.
+ */
+int mali_dma_buf_map(struct mali_dma_buf_attachment *mem, struct mali_session_data *session, u32 virt, u32 *offset, u32 flags)
 {
-       struct rb_node *node = root->rb_node;
-       struct mali_dma_buf_attachment *res;
+       struct mali_page_directory *pagedir;
+       struct scatterlist *sg;
+       unsigned long irq_flags;
+       int i;
+
+       MALI_DEBUG_ASSERT_POINTER(mem);
+       MALI_DEBUG_ASSERT_POINTER(session);
+       MALI_DEBUG_ASSERT(mem->session == session);
+
+       spin_lock_irqsave(&mem->map_lock, irq_flags);
 
-       spin_lock(&mali_dma_bufs_lock);
-       while (node)
+       mem->map_ref++;
+
+       MALI_DEBUG_PRINT(5, ("Mali DMA-buf: map attachment %p, new map_ref = %d\n", mem, mem->map_ref));
+
+       if (1 == mem->map_ref)
        {
-               res = rb_entry(node, struct mali_dma_buf_attachment, rb_node);
+               spin_unlock_irqrestore(&mem->map_lock, irq_flags);
+
+               /* First reference taken, so we need to map the dma buf */
+               MALI_DEBUG_ASSERT(!mem->is_mapped);
+
+               pagedir = mali_session_get_page_directory(session);
+               MALI_DEBUG_ASSERT_POINTER(pagedir);
+
+               mem->sgt = dma_buf_map_attachment(mem->attachment, DMA_BIDIRECTIONAL);
+               if (IS_ERR_OR_NULL(mem->sgt))
+               {
+                       MALI_DEBUG_PRINT_ERROR(("Failed to map dma-buf attachment\n"));
+                       return -EFAULT;
+               }
 
-               if (target < res->buf) node = node->rb_left;
-               else if (target > res->buf) node = node->rb_right;
-               else
+               for_each_sg(mem->sgt->sgl, sg, mem->sgt->nents, i)
                {
-                       _mali_osk_atomic_inc(&res->ref);
-                       spin_unlock(&mali_dma_bufs_lock);
-                       return res;
+                       u32 size = sg_dma_len(sg);
+                       dma_addr_t phys = sg_dma_address(sg);
+
+                       /* sg must be page aligned. */
+                       MALI_DEBUG_ASSERT(0 == size % MALI_MMU_PAGE_SIZE);
+
+                       mali_mmu_pagedir_update(pagedir, virt, phys, size, MALI_CACHE_STANDARD);
+
+                       virt += size;
+                       *offset += size;
+               }
+
+               if (flags & MALI_MEMORY_ALLOCATION_FLAG_MAP_GUARD_PAGE)
+               {
+                       u32 guard_phys;
+                       MALI_DEBUG_PRINT(7, ("Mapping in extra guard page\n"));
+
+                       guard_phys = sg_dma_address(mem->sgt->sgl);
+                       mali_mmu_pagedir_update(pagedir, virt, guard_phys, MALI_MMU_PAGE_SIZE, MALI_CACHE_STANDARD);
+               }
+
+               spin_lock_irqsave(&mem->map_lock, irq_flags);
+               mem->is_mapped = MALI_TRUE;
+               spin_unlock_irqrestore(&mem->map_lock, irq_flags);
+
+               /* Wake up any thread waiting for buffer to become mapped */
+               wake_up_all(&mem->wait_queue);
+       }
+       else
+       {
+               /* Wait for buffer to become mapped */
+               if (!mem->is_mapped)
+               {
+                       MALI_DEBUG_PRINT(4, ("Mali DMA-buf: Waiting for buffer to become mapped...\n"));
                }
+               spin_unlock_irqrestore(&mem->map_lock, irq_flags);
+               wait_event(mem->wait_queue, MALI_TRUE == mem->is_mapped);
        }
-       spin_unlock(&mali_dma_bufs_lock);
 
-       return NULL;
+       return 0;
 }
 
-static void mali_dma_buf_add(struct rb_root *root, struct mali_dma_buf_attachment *new)
+void mali_dma_buf_unmap(struct mali_dma_buf_attachment *mem)
 {
-       struct rb_node **node = &root->rb_node;
-       struct rb_node *parent = NULL;
-       struct mali_dma_buf_attachment *res;
+       unsigned long irq_flags;
+
+       MALI_DEBUG_ASSERT_POINTER(mem);
+       MALI_DEBUG_ASSERT_POINTER(mem->attachment);
+       MALI_DEBUG_ASSERT_POINTER(mem->buf);
+
+       spin_lock_irqsave(&mem->map_lock, irq_flags);
 
-       spin_lock(&mali_dma_bufs_lock);
-       while (*node)
+       mem->map_ref--;
+
+       MALI_DEBUG_PRINT(5, ("Mali DMA-buf: unmap attachment %p, new map_ref = %d\n", mem, mem->map_ref));
+
+       if (0 == mem->map_ref)
        {
-               parent = *node;
-               res = rb_entry(*node, struct mali_dma_buf_attachment, rb_node);
+               dma_buf_unmap_attachment(mem->attachment, mem->sgt, DMA_BIDIRECTIONAL);
 
-               if (new->buf < res->buf) node = &(*node)->rb_left;
-               else node = &(*node)->rb_right;
+               mem->is_mapped = MALI_FALSE;
        }
 
-       rb_link_node(&new->rb_node, parent, node);
-       rb_insert_color(&new->rb_node, &mali_dma_bufs);
-
-       spin_unlock(&mali_dma_bufs_lock);
+       spin_unlock_irqrestore(&mem->map_lock, irq_flags);
 
-       return;
+       /* Wake up any thread waiting for buffer to become unmapped */
+       wake_up_all(&mem->wait_queue);
 }
 
-
-static void mali_dma_buf_release(void *ctx, void *handle)
+#if !defined(CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH)
+int mali_dma_buf_map_job(struct mali_pp_job *job)
 {
+       mali_memory_allocation *descriptor;
        struct mali_dma_buf_attachment *mem;
-       u32 ref;
+       _mali_osk_errcode_t err;
+       int i;
+       u32 offset = 0;
+       int ret = 0;
 
-       mem = (struct mali_dma_buf_attachment *)handle;
+       _mali_osk_lock_wait( job->session->memory_lock, _MALI_OSK_LOCKMODE_RW );
 
-       MALI_DEBUG_ASSERT_POINTER(mem);
-       MALI_DEBUG_ASSERT_POINTER(mem->attachment);
-       MALI_DEBUG_ASSERT_POINTER(mem->buf);
+       for (i = 0; i < job->num_memory_cookies; i++)
+       {
+               int cookie = job->memory_cookies[i];
 
-       spin_lock(&mali_dma_bufs_lock);
-       ref = _mali_osk_atomic_dec_return(&mem->ref);
+               if (0 == cookie)
+               {
+                       /* 0 is not a valid cookie */
+                       MALI_DEBUG_ASSERT(NULL == job->dma_bufs[i]);
+                       continue;
+               }
 
-       if (0 == ref)
-       {
-               rb_erase(&mem->rb_node, &mali_dma_bufs);
-               spin_unlock(&mali_dma_bufs_lock);
+               MALI_DEBUG_ASSERT(0 < cookie);
 
-               MALI_DEBUG_ASSERT(0 == _mali_osk_atomic_read(&mem->ref));
+               err = mali_descriptor_mapping_get(job->session->descriptor_mapping,
+                               cookie, (void**)&descriptor);
 
-               dma_buf_unmap_attachment(mem->attachment, mem->sgt, DMA_BIDIRECTIONAL);
+               if (_MALI_OSK_ERR_OK != err)
+               {
+                       MALI_DEBUG_PRINT_ERROR(("Mali DMA-buf: Failed to get descriptor for cookie %d\n", cookie));
+                       ret = -EFAULT;
+                       MALI_DEBUG_ASSERT(NULL == job->dma_bufs[i]);
+                       continue;
+               }
 
-               dma_buf_detach(mem->buf, mem->attachment);
-               dma_buf_put(mem->buf);
+               if (mali_dma_buf_release != descriptor->physical_allocation.release)
+               {
+                       /* Not a DMA-buf */
+                       MALI_DEBUG_ASSERT(NULL == job->dma_bufs[i]);
+                       continue;
+               }
 
-               _mali_osk_free(mem);
+               mem = (struct mali_dma_buf_attachment *)descriptor->physical_allocation.handle;
+
+               MALI_DEBUG_ASSERT_POINTER(mem);
+               MALI_DEBUG_ASSERT(mem->session == job->session);
+
+               err = mali_dma_buf_map(mem, mem->session, descriptor->mali_address, &offset, descriptor->flags);
+               if (0 != err)
+               {
+                       MALI_DEBUG_PRINT_ERROR(("Mali DMA-buf: Failed to map dma-buf for cookie %d at mali address %x\b",
+                                               cookie, descriptor->mali_address));
+                       ret = -EFAULT;
+                       MALI_DEBUG_ASSERT(NULL == job->dma_bufs[i]);
+                       continue;
+               }
+
+               /* Add mem to list of DMA-bufs mapped for this job */
+               job->dma_bufs[i] = mem;
        }
-       else
+
+       _mali_osk_lock_signal( job->session->memory_lock, _MALI_OSK_LOCKMODE_RW );
+
+       return ret;
+}
+
+void mali_dma_buf_unmap_job(struct mali_pp_job *job)
+{
+       int i;
+       for (i = 0; i < job->num_dma_bufs; i++)
        {
-               spin_unlock(&mali_dma_bufs_lock);
+               if (NULL == job->dma_bufs[i]) continue;
+
+               mali_dma_buf_unmap(job->dma_bufs[i]);
+               job->dma_bufs[i] = NULL;
        }
 }
+#endif /* !CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH */
 
 /* Callback from memory engine which will map into Mali virtual address space */
 static mali_physical_memory_allocation_result mali_dma_buf_commit(void* ctx, mali_allocation_engine * engine, mali_memory_allocation * descriptor, u32* offset, mali_physical_memory_allocation * alloc_info)
 {
        struct mali_session_data *session;
-       struct mali_page_directory *pagedir;
        struct mali_dma_buf_attachment *mem;
-       struct scatterlist *sg;
-       int i;
-       u32 virt;
 
        MALI_DEBUG_ASSERT_POINTER(ctx);
        MALI_DEBUG_ASSERT_POINTER(engine);
@@ -138,54 +270,29 @@ static mali_physical_memory_allocation_result mali_dma_buf_commit(void* ctx, mal
        /* Mapping dma-buf with an offset is not supported. */
        MALI_DEBUG_ASSERT(0 == *offset);
 
-       virt = descriptor->mali_address;
        session = (struct mali_session_data *)descriptor->mali_addr_mapping_info;
-       pagedir = mali_session_get_page_directory(session);
-
        MALI_DEBUG_ASSERT_POINTER(session);
 
        mem = (struct mali_dma_buf_attachment *)ctx;
 
-       MALI_DEBUG_ASSERT_POINTER(mem);
-
-       mem->sgt = dma_buf_map_attachment(mem->attachment, DMA_BIDIRECTIONAL);
-       if (IS_ERR_OR_NULL(mem->sgt))
-       {
-               MALI_PRINT_ERROR(("Failed to map dma-buf attachment\n"));
-               return MALI_MEM_ALLOC_INTERNAL_FAILURE;
-       }
+       MALI_DEBUG_ASSERT(mem->session == session);
 
-       for_each_sg(mem->sgt->sgl, sg, mem->sgt->nents, i)
+#if defined(CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH)
+       if (0 == mali_dma_buf_map(mem, session, descriptor->mali_address, offset, descriptor->flags))
        {
-               u32 size = sg_dma_len(sg);
-               dma_addr_t phys = sg_dma_address(sg);
-
-               /* sg must be page aligned. */
-               MALI_DEBUG_ASSERT(0 == size % MALI_MMU_PAGE_SIZE);
-
-               mali_mmu_pagedir_update(pagedir, virt, phys, size, MALI_CACHE_STANDARD);
-
-               virt += size;
-               *offset += size;
-       }
-
-       if (descriptor->flags & MALI_MEMORY_ALLOCATION_FLAG_MAP_GUARD_PAGE)
+               MALI_DEBUG_ASSERT(*offset == descriptor->size);
+#else
        {
-               u32 guard_phys;
-               MALI_DEBUG_PRINT(7, ("Mapping in extra guard page\n"));
+#endif
+               alloc_info->ctx = NULL;
+               alloc_info->handle = mem;
+               alloc_info->next = NULL;
+               alloc_info->release = mali_dma_buf_release;
 
-               guard_phys = sg_dma_address(mem->sgt->sgl);
-               mali_mmu_pagedir_update(mali_session_get_page_directory(session), virt, guard_phys, MALI_MMU_PAGE_SIZE, MALI_CACHE_STANDARD);
+               return MALI_MEM_ALLOC_FINISHED;
        }
 
-       MALI_DEBUG_ASSERT(*offset == descriptor->size);
-
-       alloc_info->ctx = NULL;
-       alloc_info->handle = mem;
-       alloc_info->next = NULL;
-       alloc_info->release = mali_dma_buf_release;
-
-       return MALI_MEM_ALLOC_FINISHED;
+       return MALI_MEM_ALLOC_INTERNAL_FAILURE;
 }
 
 int mali_attach_dma_buf(struct mali_session_data *session, _mali_uk_attach_dma_buf_s __user *user_arg)
@@ -210,49 +317,39 @@ int mali_attach_dma_buf(struct mali_session_data *session, _mali_uk_attach_dma_b
        buf = dma_buf_get(fd);
        if (IS_ERR_OR_NULL(buf))
        {
-               MALI_DEBUG_PRINT(2, ("Failed to get dma-buf from fd: %d\n", fd));
+               MALI_DEBUG_PRINT_ERROR(("Failed to get dma-buf from fd: %d\n", fd));
                return PTR_RET(buf);
        }
 
        /* Currently, mapping of the full buffer are supported. */
        if (args.size != buf->size)
        {
-               MALI_DEBUG_PRINT(2, ("dma-buf size doesn't match mapping size.\n"));
+               MALI_DEBUG_PRINT_ERROR(("dma-buf size doesn't match mapping size.\n"));
                dma_buf_put(buf);
                return -EINVAL;
        }
 
-
-       mem = mali_dma_buf_lookup(&mali_dma_bufs, buf);
+       mem = _mali_osk_calloc(1, sizeof(struct mali_dma_buf_attachment));
        if (NULL == mem)
        {
-               /* dma-buf is not already attached to Mali */
-               mem = _mali_osk_calloc(1, sizeof(struct mali_dma_buf_attachment));
-               if (NULL == mem)
-               {
-                       MALI_PRINT_ERROR(("Failed to allocate dma-buf tracing struct\n"));
-                       dma_buf_put(buf);
-                       return -ENOMEM;
-               }
-               _mali_osk_atomic_init(&mem->ref, 1);
-               mem->buf = buf;
+               MALI_DEBUG_PRINT_ERROR(("Failed to allocate dma-buf tracing struct\n"));
+               dma_buf_put(buf);
+               return -ENOMEM;
+       }
 
-               mem->attachment = dma_buf_attach(mem->buf, &mali_platform_device->dev);
-               if (NULL == mem->attachment)
-               {
-                       MALI_DEBUG_PRINT(2, ("Failed to attach to dma-buf %d\n", fd));
-                       dma_buf_put(mem->buf);
-                       _mali_osk_free(mem);
-                       return -EFAULT;
-               }
+       mem->buf = buf;
+       mem->session = session;
+       mem->map_ref = 0;
+       spin_lock_init(&mem->map_lock);
+       init_waitqueue_head(&mem->wait_queue);
 
-               mali_dma_buf_add(&mali_dma_bufs, mem);
-       }
-       else
+       mem->attachment = dma_buf_attach(mem->buf, &mali_platform_device->dev);
+       if (NULL == mem->attachment)
        {
-               /* dma-buf is already attached to Mali */
-               /* Give back the reference we just took, mali_dma_buf_lookup grabbed a new reference for us. */
-               dma_buf_put(buf);
+               MALI_DEBUG_PRINT_ERROR(("Failed to attach to dma-buf %d\n", fd));
+               dma_buf_put(mem->buf);
+               _mali_osk_free(mem);
+               return -EFAULT;
        }
 
        /* Map dma-buf into this session's page tables */
@@ -261,7 +358,7 @@ int mali_attach_dma_buf(struct mali_session_data *session, _mali_uk_attach_dma_b
        descriptor = _mali_osk_calloc(1, sizeof(mali_memory_allocation));
        if (NULL == descriptor)
        {
-               MALI_PRINT_ERROR(("Failed to allocate descriptor dma-buf %d\n", fd));
+               MALI_DEBUG_PRINT_ERROR(("Failed to allocate descriptor dma-buf %d\n", fd));
                mali_dma_buf_release(NULL, mem);
                return -ENOMEM;
        }
@@ -282,12 +379,14 @@ int mali_attach_dma_buf(struct mali_session_data *session, _mali_uk_attach_dma_b
        /* Get descriptor mapping for memory. */
        if (_MALI_OSK_ERR_OK != mali_descriptor_mapping_allocate_mapping(session->descriptor_mapping, descriptor, &md))
        {
-               MALI_PRINT_ERROR(("Failed to create descriptor mapping for dma-buf %d\n", fd));
+               MALI_DEBUG_PRINT_ERROR(("Failed to create descriptor mapping for dma-buf %d\n", fd));
                _mali_osk_free(descriptor);
                mali_dma_buf_release(NULL, mem);
                return -EFAULT;
        }
 
+       MALI_DEBUG_ASSERT(0 < md);
+
        external_memory_allocator.allocate = mali_dma_buf_commit;
        external_memory_allocator.allocate_page_table_block = NULL;
        external_memory_allocator.ctx = mem;
@@ -300,7 +399,7 @@ int mali_attach_dma_buf(struct mali_session_data *session, _mali_uk_attach_dma_b
        {
                _mali_osk_lock_signal(session->memory_lock, _MALI_OSK_LOCKMODE_RW);
 
-               MALI_PRINT_ERROR(("Failed to map dma-buf %d into Mali address space\n", fd));
+               MALI_DEBUG_PRINT_ERROR(("Failed to map dma-buf %d into Mali address space\n", fd));
                mali_descriptor_mapping_free(session->descriptor_mapping, md);
                mali_dma_buf_release(NULL, mem);
                return -ENOMEM;
@@ -311,7 +410,7 @@ int mali_attach_dma_buf(struct mali_session_data *session, _mali_uk_attach_dma_b
        if (0 != put_user(md, &user_arg->cookie))
        {
                /* Roll back */
-               MALI_PRINT_ERROR(("Failed to return descriptor to user space for dma-buf %d\n", fd));
+               MALI_DEBUG_PRINT_ERROR(("Failed to return descriptor to user space for dma-buf %d\n", fd));
                mali_descriptor_mapping_free(session->descriptor_mapping, md);
                mali_dma_buf_release(NULL, mem);
                return -EFAULT;
@@ -322,6 +421,7 @@ int mali_attach_dma_buf(struct mali_session_data *session, _mali_uk_attach_dma_b
 
 int mali_release_dma_buf(struct mali_session_data *session, _mali_uk_release_dma_buf_s __user *user_arg)
 {
+       int ret = 0;
        _mali_uk_release_dma_buf_s args;
        mali_memory_allocation *descriptor;
 
@@ -331,28 +431,31 @@ int mali_release_dma_buf(struct mali_session_data *session, _mali_uk_release_dma
                return -EFAULT;
        }
 
-       if (_MALI_OSK_ERR_OK != mali_descriptor_mapping_get(session->descriptor_mapping, args.cookie, (void**)&descriptor))
-       {
-               MALI_DEBUG_PRINT(1, ("Invalid memory descriptor %d used to release dma-buf\n", args.cookie));
-               return -EINVAL;
-       }
+       MALI_DEBUG_PRINT(3, ("Mali DMA-buf: release descriptor cookie %d\n", args.cookie));
+
+       _mali_osk_lock_wait( session->memory_lock, _MALI_OSK_LOCKMODE_RW );
 
        descriptor = mali_descriptor_mapping_free(session->descriptor_mapping, args.cookie);
 
        if (NULL != descriptor)
        {
-               _mali_osk_lock_wait( session->memory_lock, _MALI_OSK_LOCKMODE_RW );
+               MALI_DEBUG_PRINT(3, ("Mali DMA-buf: Releasing dma-buf at mali address %x\n", descriptor->mali_address));
 
                /* Will call back to mali_dma_buf_release() which will release the dma-buf attachment. */
                mali_allocation_engine_release_memory(mali_mem_get_memory_engine(), descriptor);
 
-               _mali_osk_lock_signal( session->memory_lock, _MALI_OSK_LOCKMODE_RW );
-
                _mali_osk_free(descriptor);
        }
+       else
+       {
+               MALI_DEBUG_PRINT_ERROR(("Invalid memory descriptor %d used to release dma-buf\n", args.cookie));
+               ret = -EINVAL;
+       }
+
+       _mali_osk_lock_signal( session->memory_lock, _MALI_OSK_LOCKMODE_RW );
 
        /* Return the error that _mali_ukk_map_external_ump_mem produced */
-       return 0;
+       return ret;
 }
 
 int mali_dma_buf_get_size(struct mali_session_data *session, _mali_uk_dma_buf_get_size_s __user *user_arg)
@@ -373,7 +476,7 @@ int mali_dma_buf_get_size(struct mali_session_data *session, _mali_uk_dma_buf_ge
        buf = dma_buf_get(fd);
        if (IS_ERR_OR_NULL(buf))
        {
-               MALI_DEBUG_PRINT(2, ("Failed to get dma-buf from fd: %d\n", fd));
+               MALI_DEBUG_PRINT_ERROR(("Failed to get dma-buf from fd: %d\n", fd));
                return PTR_RET(buf);
        }
 
index ee9a0edd6d8ae435a29c394f0e12a23f3cc49a90..6f44d31bbe92becd0572880afde39c5c94c52cd6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -17,10 +17,21 @@ extern "C"
 #endif
 
 #include "mali_osk.h"
+#include "common/mali_pp_job.h"
+
+struct mali_dma_buf_attachment;
 
 int mali_attach_dma_buf(struct mali_session_data *session, _mali_uk_attach_dma_buf_s __user *arg);
 int mali_release_dma_buf(struct mali_session_data *session, _mali_uk_release_dma_buf_s __user *arg);
 int mali_dma_buf_get_size(struct mali_session_data *session, _mali_uk_dma_buf_get_size_s __user *arg);
+int mali_dma_buf_map(struct mali_dma_buf_attachment *mem, struct mali_session_data *session, u32 virt, u32 *offset, u32 flags);
+void mali_dma_buf_unmap(struct mali_dma_buf_attachment *mem);
+void mali_dma_buf_release(void *ctx, void *handle);
+
+#if !defined(CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH)
+int mali_dma_buf_map_job(struct mali_pp_job *job);
+void mali_dma_buf_unmap_job(struct mali_pp_job *job);
+#endif
 
 #ifdef __cplusplus
 }
index 8362ed1fecd1eec0269733fa10089f8d82d29d40..da71d63d3a4dc69bea30f5f4b23369ee8fe450d8 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -21,9 +21,7 @@
 #include <linux/device.h>
 #include "mali_kernel_license.h"
 #include <linux/platform_device.h>
-#if MALI_LICENSE_IS_GPL
 #include <linux/miscdevice.h>
-#endif
 #include <linux/mali/mali_utgard.h>
 #include "mali_kernel_common.h"
 #include "mali_session.h"
@@ -62,16 +60,16 @@ extern int mali_l2_max_reads;
 module_param(mali_l2_max_reads, int, S_IRUSR | S_IRGRP | S_IROTH);
 MODULE_PARM_DESC(mali_l2_max_reads, "Maximum reads for Mali L2 cache");
 
-extern int mali_dedicated_mem_start;
-module_param(mali_dedicated_mem_start, int, S_IRUSR | S_IRGRP | S_IROTH);
+extern unsigned int mali_dedicated_mem_start;
+module_param(mali_dedicated_mem_start, uint, S_IRUSR | S_IRGRP | S_IROTH);
 MODULE_PARM_DESC(mali_dedicated_mem_start, "Physical start address of dedicated Mali GPU memory.");
 
-extern int mali_dedicated_mem_size;
-module_param(mali_dedicated_mem_size, int, S_IRUSR | S_IRGRP | S_IROTH);
+extern unsigned int mali_dedicated_mem_size;
+module_param(mali_dedicated_mem_size, uint, S_IRUSR | S_IRGRP | S_IROTH);
 MODULE_PARM_DESC(mali_dedicated_mem_size, "Size of dedicated Mali GPU memory.");
 
-extern int mali_shared_mem_size;
-module_param(mali_shared_mem_size, int, S_IRUSR | S_IRGRP | S_IROTH);
+extern unsigned int mali_shared_mem_size;
+module_param(mali_shared_mem_size, uint, S_IRUSR | S_IRGRP | S_IROTH);
 MODULE_PARM_DESC(mali_shared_mem_size, "Size of shared Mali GPU memory.");
 
 #if defined(CONFIG_MALI400_PROFILING)
@@ -583,6 +581,10 @@ static int mali_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
                        err = mem_term_wrapper(session_data, (_mali_uk_term_mem_s __user *)arg);
                        break;
 
+               case MALI_IOC_MEM_WRITE_SAFE:
+                       err = mem_write_safe_wrapper(session_data, (_mali_uk_mem_write_safe_s __user *)arg);
+                       break;
+
                case MALI_IOC_MEM_MAP_EXT:
                        err = mem_map_ext_wrapper(session_data, (_mali_uk_map_external_mem_s __user *)arg);
                        break;
@@ -680,6 +682,11 @@ static int mali_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
 #if defined(CONFIG_SYNC)
                        err = stream_create_wrapper(session_data, (_mali_uk_stream_create_s __user *)arg);
                        break;
+#endif
+               case MALI_IOC_FENCE_CREATE_EMPTY:
+#if defined(CONFIG_SYNC)
+                       err = sync_fence_create_empty_wrapper(session_data, (_mali_uk_fence_create_empty_s __user *)arg);
+                       break;
 #endif
                case MALI_IOC_FENCE_VALIDATE:
 #if defined(CONFIG_SYNC)
index 8bc4c390dba17f6f8043c93f4698603cd3e58f86..9650103283fa93d07b73e2ebbbfc829e5945fccc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index b909d3900af89aab795ee40dc9d56b1b7136a0ea..152ff360eaaf374b5701a46811fdd760ac006d35 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index f970f0f4ede83b8cb9683372ae0bfbab4b34b45b..26ee7e4cd772a3f73464a90734e35408d340a68d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
diff --git a/mali/linux/mali_linux_pm_testsuite.h b/mali/linux/mali_linux_pm_testsuite.h
deleted file mode 100644 (file)
index 7d811bd..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
- * 
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-#ifndef __MALI_LINUX_PM_TESTSUITE_H__
-#define __MALI_LINUX_PM_TESTSUITE_H__
-
-#if MALI_POWER_MGMT_TEST_SUITE && defined(CONFIG_PM)
-
-typedef enum
-{
-        _MALI_DEVICE_PMM_TIMEOUT_EVENT,
-        _MALI_DEVICE_PMM_JOB_SCHEDULING_EVENTS,
-       _MALI_DEVICE_PMM_REGISTERED_CORES,
-        _MALI_DEVICE_MAX_PMM_EVENTS
-
-} _mali_device_pmm_recording_events;
-
-extern unsigned int mali_timeout_event_recording_on;
-extern unsigned int mali_job_scheduling_events_recording_on;
-extern unsigned int pwr_mgmt_status_reg;
-extern unsigned int is_mali_pmm_testsuite_enabled;
-extern unsigned int is_mali_pmu_present;
-
-#endif /* MALI_POWER_MGMT_TEST_SUITE && defined(CONFIG_PM) */
-
-#endif /* __MALI_LINUX_PM_TESTSUITE_H__ */
index 5329ba360704e7d0fc878441e60a941afde5e008..1547547e2023d38d6d47c0ffe32e06e386507fe1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 05831c54272382b83229c73a25e942a3dddd79ba..14f8e16908d30f7c274d9f7c6c3e9141970268ec 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 40a428ecb856785fe736f385bd9b0736b53845b0..244ffe7c96ccf9e2de801a92976de1835293195c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -32,6 +32,11 @@ static irqreturn_t irq_handler_upper_half (int port_name, void* dev_id ); /* , s
 _mali_osk_irq_t *_mali_osk_irq_init( u32 irqnum, _mali_osk_irq_uhandler_t uhandler, void *int_data, _mali_osk_irq_trigger_t trigger_func, _mali_osk_irq_ack_t ack_func, void *probe_data, const char *description )
 {
        mali_osk_irq_object_t *irq_object;
+       unsigned long irq_flags = 0;
+
+#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
+       irq_flags |= IRQF_SHARED;
+#endif /* defined(CONFIG_MALI_SHARED_INTERRUPTS) */
 
        irq_object = kmalloc(sizeof(mali_osk_irq_object_t), GFP_KERNEL);
        if (NULL == irq_object)
@@ -91,7 +96,7 @@ _mali_osk_irq_t *_mali_osk_irq_init( u32 irqnum, _mali_osk_irq_uhandler_t uhandl
                return NULL;
        }
 
-       if (0 != request_irq(irqnum, irq_handler_upper_half, IRQF_SHARED, description, irq_object))
+       if (0 != request_irq(irqnum, irq_handler_upper_half, irq_flags, description, irq_object))
        {
                MALI_DEBUG_PRINT(2, ("Unable to install IRQ handler for core '%s'\n", description));
                kfree(irq_object);
@@ -122,12 +127,23 @@ void _mali_osk_irq_term( _mali_osk_irq_t *irq )
  */
 static irqreturn_t irq_handler_upper_half (int port_name, void* dev_id ) /* , struct pt_regs *regs*/
 {
+       irqreturn_t ret = IRQ_NONE;
        mali_osk_irq_object_t *irq_object = (mali_osk_irq_object_t *)dev_id;
 
-       if (irq_object->uhandler(irq_object->data) == _MALI_OSK_ERR_OK)
+#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
+       if (MALI_TRUE == _mali_osk_pm_dev_ref_add_no_power_on())
+#endif /* defined(CONFIG_MALI_SHARED_INTERRUPTS) */
        {
-               return IRQ_HANDLED;
+
+               if (_MALI_OSK_ERR_OK == irq_object->uhandler(irq_object->data))
+               {
+                       ret = IRQ_HANDLED;
+               }
+
        }
-       return IRQ_NONE;
-}
+#if defined(CONFIG_MALI_SHARED_INTERRUPTS)
+       _mali_osk_pm_dev_ref_dec_no_power_on();
+#endif /* defined(CONFIG_MALI_SHARED_INTERRUPTS) */
 
+       return ret;
+}
index d007d937f432067167b07e3c2209a7efb5091e3b..b03f9ef1568a40f8ae07bda4ce7839d9f073ca81 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -58,9 +58,6 @@ struct _mali_osk_lock_t_struct
                                  /* id of the thread currently holding this lock, 0 if no
                                   * threads hold it. */
                                  u32 owner;
-                                 /* number of owners this lock currently has (can be > 1 if
-                                  * taken in R/O mode. */
-                                 u32 nOwners;
                                  /* what mode the lock was taken in */
                                  _mali_osk_lock_mode_t mode;
        ); /* MALI_DEBUG_CODE */
@@ -134,7 +131,6 @@ _mali_osk_lock_t *_mali_osk_lock_init( _mali_osk_lock_flags_t flags, u32 initial
 
        /* Debug tracking of lock owner */
        lock->owner = 0;
-       lock->nOwners = 0;
 #endif /* DEBUG */
 
     return lock;
@@ -146,11 +142,6 @@ u32 _mali_osk_lock_get_owner( _mali_osk_lock_t *lock )
        return lock->owner;
 }
 
-u32 _mali_osk_lock_get_number_owners( _mali_osk_lock_t *lock )
-{
-       return lock->nOwners;
-}
-
 u32 _mali_osk_lock_get_mode( _mali_osk_lock_t *lock )
 {
        return lock->mode;
@@ -222,7 +213,6 @@ _mali_osk_errcode_t _mali_osk_lock_wait( _mali_osk_lock_t *lock, _mali_osk_lock_
        {
                if (mode == _MALI_OSK_LOCKMODE_RW)
                {
-                       /*MALI_DEBUG_ASSERT(0 == lock->owner);*/
                        if (0 != lock->owner)
                        {
                                printk(KERN_ERR "%d: ERROR: Lock %p already has owner %d\n", _mali_osk_get_tid(), lock, lock->owner);
@@ -230,13 +220,10 @@ _mali_osk_errcode_t _mali_osk_lock_wait( _mali_osk_lock_t *lock, _mali_osk_lock_
                        }
                        lock->owner = _mali_osk_get_tid();
                        lock->mode = mode;
-                       ++lock->nOwners;
                }
                else /* mode == _MALI_OSK_LOCKMODE_RO */
                {
-                       lock->owner |= _mali_osk_get_tid();
                        lock->mode = mode;
-                       ++lock->nOwners;
                }
        }
 #endif
@@ -262,7 +249,6 @@ void _mali_osk_lock_signal( _mali_osk_lock_t *lock, _mali_osk_lock_mode_t mode )
        /* make sure the thread releasing the lock actually was the owner */
        if (mode == _MALI_OSK_LOCKMODE_RW)
        {
-               /*MALI_DEBUG_ASSERT(_mali_osk_get_tid() == lock->owner);*/
                if (_mali_osk_get_tid() != lock->owner)
                {
                        printk(KERN_ERR "%d: ERROR: Lock %p owner was %d\n", _mali_osk_get_tid(), lock, lock->owner);
@@ -270,23 +256,7 @@ void _mali_osk_lock_signal( _mali_osk_lock_t *lock, _mali_osk_lock_mode_t mode )
                }
                /* This lock now has no owner */
                lock->owner = 0;
-               --lock->nOwners;
-       }
-       else /* mode == _MALI_OSK_LOCKMODE_RO */
-       {
-               if ((_mali_osk_get_tid() & lock->owner) != _mali_osk_get_tid())
-               {
-                       printk(KERN_ERR "%d: ERROR: Not an owner of %p lock.\n", _mali_osk_get_tid(), lock);
-                       dump_stack();
-               }
-
-               /* if this is the last thread holding this lock in R/O mode, set owner
-                * back to 0 */
-               if (0 == --lock->nOwners)
-               {
-                       lock->owner = 0;
-               }
-       }
+       } /* else if (mode == _MALI_OSK_LOCKMODE_RO) Nothing to check */
 #endif /* DEBUG */
 
        switch ( lock->type )
index 1fa8effbdf2f7bdf95e76fb1432e0514ca4a5ec7..7b89c2b9ecc08007a4a85712fbbadee6e8979a33 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -25,6 +25,9 @@
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,1,0)
 #include <linux/shrinker.h>
 #endif
+#include <linux/sched.h>
+#include <linux/mm_types.h>
+#include <linux/rwsem.h>
 
 #include "mali_osk.h"
 #include "mali_ukk.h" /* required to hook in _mali_ukk_mem_mmap handling */
@@ -280,6 +283,8 @@ static unsigned long mali_kernel_memory_cpu_page_fault_handler(struct vm_area_st
        MALI_DEBUG_PRINT(1, ("Page-fault in Mali memory region caused by the CPU.\n"));
        MALI_DEBUG_PRINT(1, ("Tried to access %p (process local virtual address) which is not currently mapped to any Mali memory.\n", (void*)address));
 
+       MALI_IGNORE(address);
+
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
        return VM_FAULT_SIGBUS;
 #else
@@ -363,7 +368,7 @@ mali_io_address _mali_osk_mem_allocioregion( u32 *phys, u32 size )
        /* dma_alloc_* uses a limited region of address space. On most arch/marchs
         * 2 to 14 MiB is available. This should be enough for the page tables, which
         * currently is the only user of this function. */
-       virt = dma_alloc_coherent(NULL, size, phys, GFP_KERNEL | GFP_DMA );
+       virt = dma_alloc_writecombine(NULL, size, phys, GFP_KERNEL | GFP_DMA | __GFP_ZERO);
 
        MALI_DEBUG_PRINT(3, ("Page table virt: 0x%x = dma_alloc_coherent(size:%d, phys:0x%x, )\n", virt, size, phys));
 
@@ -384,7 +389,7 @@ void _mali_osk_mem_freeioregion( u32 phys, u32 size, mali_io_address virt )
        MALI_DEBUG_ASSERT( 0 != size );
        MALI_DEBUG_ASSERT( 0 == (phys & ( (1 << PAGE_SHIFT) - 1 )) );
 
-       dma_free_coherent(NULL, size, virt, phys);
+       dma_free_writecombine(NULL, size, virt, phys);
 }
 
 _mali_osk_errcode_t inline _mali_osk_mem_reqregion( u32 phys, u32 size, const char *description )
@@ -469,8 +474,14 @@ _mali_osk_errcode_t _mali_osk_mem_mapregion_init( mali_memory_allocation * descr
          The memory is reserved, meaning that it's present and can never be paged out (see also previous entry)
        */
        vma->vm_flags |= VM_IO;
-       vma->vm_flags |= VM_RESERVED;
        vma->vm_flags |= VM_DONTCOPY;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)
+       vma->vm_flags |= VM_RESERVED;
+#else
+       vma->vm_flags |= VM_DONTDUMP;
+       vma->vm_flags |= VM_DONTEXPAND;
+       vma->vm_flags |= VM_PFNMAP;
+#endif
 
        vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
        vma->vm_ops = &mali_kernel_vm_ops; /* Operations used on any memory system */
@@ -663,3 +674,50 @@ void _mali_osk_mem_mapregion_unmap( mali_memory_allocation * descriptor, u32 off
 
        return;
 }
+
+u32 _mali_osk_mem_write_safe(void *dest, const void *src, u32 size)
+{
+#define MALI_MEM_SAFE_COPY_BLOCK_SIZE 4096
+       u32 retval = 0;
+       void *temp_buf;
+
+       temp_buf = kmalloc(MALI_MEM_SAFE_COPY_BLOCK_SIZE, GFP_KERNEL);
+       if (NULL != temp_buf)
+       {
+               u32 bytes_left_to_copy = size;
+               u32 i;
+               for (i = 0; i < size; i += MALI_MEM_SAFE_COPY_BLOCK_SIZE)
+               {
+                       u32 size_to_copy;
+                       u32 size_copied;
+                       u32 bytes_left;
+
+                       if (bytes_left_to_copy > MALI_MEM_SAFE_COPY_BLOCK_SIZE)
+                       {
+                               size_to_copy = MALI_MEM_SAFE_COPY_BLOCK_SIZE;
+                       }
+                       else
+                       {
+                               size_to_copy = bytes_left_to_copy;
+                       }
+
+                       bytes_left = copy_from_user(temp_buf, ((char*)src) + i, size_to_copy);
+                       size_copied = size_to_copy - bytes_left;
+
+                       bytes_left = copy_to_user(((char*)dest) + i, temp_buf, size_copied);
+                       size_copied -= bytes_left;
+
+                       bytes_left_to_copy -= size_copied;
+                       retval += size_copied;
+
+                       if (size_copied != size_to_copy)
+                       {
+                               break; /* Early out, we was not able to copy this entire block */
+                       }
+               }
+
+               kfree(temp_buf);
+       }
+
+       return retval;
+}
index 1c00c49cc2c007c469e5ef805a593e57746b11c6..20881e4cdb37ec894da9368ed58f8ea900035ef8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -108,3 +108,32 @@ _mali_osk_errcode_t _mali_osk_device_data_get(struct _mali_osk_device_data *data
 
        return _MALI_OSK_ERR_ITEM_NOT_FOUND;
 }
+
+mali_bool _mali_osk_shared_interrupts(void)
+{
+       u32 irqs[128];
+       u32 i, j, irq, num_irqs_found = 0;
+
+       MALI_DEBUG_ASSERT_POINTER(mali_platform_device);
+       MALI_DEBUG_ASSERT(128 >= mali_platform_device->num_resources);
+
+       for (i = 0; i < mali_platform_device->num_resources; i++)
+       {
+               if (IORESOURCE_IRQ & mali_platform_device->resource[i].flags)
+               {
+                       irq = mali_platform_device->resource[i].start;
+
+                       for (j = 0; j < num_irqs_found; ++j)
+                       {
+                               if (irq == irqs[j])
+                               {
+                                       return MALI_TRUE;
+                               }
+                       }
+
+                       irqs[num_irqs_found++] = irq;
+               }
+       }
+
+       return MALI_FALSE;
+}
index 3e62e519cbac375eeb20d6928336229a0f91dce9..869ddcb30efed7099ba2ce37fb4bb1ba1ead7b0b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 7bb470f8828d66f60beb8692fedd13a980b55fc1..f236fc31547864049df7df425377547362823d90 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2011, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index ad486db6f5e44bf925c0755ec3f4bad6e480ae26..dbc01bc2569d118387c8054ddbd115068aaaded5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index c04b0a7bcf3dd217fc0a00e065531591205d1c4d..1bf3629e3a2413219d2ba7837834c2d371d600fb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 72ec61c39e732f4864d4b0d197a6015c71790839..274a425d39f3d7edb609cb0d03db4de3ee055836 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
 
 static _mali_osk_atomic_t mali_pm_ref_count;
 
-void _mali_osk_pm_dev_enable(void) /* @@@@ todo: change to init of some kind.. or change the way or where atomics are initialized? */
+void _mali_osk_pm_dev_enable(void)
 {
        _mali_osk_atomic_init(&mali_pm_ref_count, 0);
 }
 
-void _mali_osk_pm_dev_disable(void) /* @@@@ todo: change to term of some kind */
+void _mali_osk_pm_dev_disable(void)
 {
        _mali_osk_atomic_term(&mali_pm_ref_count);
 }
index f50c99ba5efcbf8a79ccae580dae44bf55de9679..ecf0ed630465a5baf11084f815648747493701f7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index f3d3ecc385f9df294ecd216329b3e007fd825925..1bd4d22f0403a232f365c6ff9d660f2602fd2f5c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index da9b8656b703e67a2fd0110dffc73684678c2265..4bf2ce153530b56731ed29e321cf7a55e7b698ca 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 0e28b320fbabf437b1d58a82b4839df1dce32775..69e0c022889e59bcd5ae374b04e47c33f7d9ec9d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index ce0561d51832ba4c2eda84c63feee9e3805244ef..e81df2c8e5f4a0ea3701564722c96b5aecace4e3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 6afacf9218e54996d21979cf5b1754778ad786fc..33d5df1b5a299c7c44fd615d729566277d7f3952 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -98,6 +98,12 @@ void _mali_osk_wq_delete_work( _mali_osk_wq_work_t *work )
        kfree(work_object);
 }
 
+void _mali_osk_wq_delete_work_nonflush( _mali_osk_wq_work_t *work )
+{
+       mali_osk_wq_work_object_t *work_object = (mali_osk_wq_work_object_t *)work;
+       kfree(work_object);
+}
+
 void _mali_osk_wq_schedule_work( _mali_osk_wq_work_t *work )
 {
        mali_osk_wq_work_object_t *work_object = (mali_osk_wq_work_object_t *)work;
index f3b0a2c95a0139d45aa1005d7bc6b62dd9632d24..80e41814c59daa556154f5189518f8032a1a5977 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (C) 2010, 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -28,6 +28,7 @@ int mali_pmu_powerup(void)
 
        MALI_DEBUG_PRINT(5, ("Mali PMU: Power up\n"));
 
+       MALI_DEBUG_ASSERT_POINTER(pmu);
        if (NULL == pmu)
        {
                return -ENXIO;
@@ -49,6 +50,7 @@ int mali_pmu_powerdown(void)
 
        MALI_DEBUG_PRINT(5, ("Mali PMU: Power down\n"));
 
+       MALI_DEBUG_ASSERT_POINTER(pmu);
        if (NULL == pmu)
        {
                return -ENXIO;
index 2639a404d47578c7f477f2c9261a88e951227701..10da081af48ad34a7d25a35bf1abece7178c7873 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index e40a8000bbae0a1c95a20fe95993a9b7b913cc1e..b2558008f0a0faa51eb96ebc15158033aa63b2a9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 092b9b05369f36ec548d4930d8fa5e60a24dd5da..43357a4a73ca90732f098303aff3603933447633 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index db9d686572c2c64c8ac7eb736ca54e7104fe8f7c..c44d380d1ef17a776ab9c5de0a754aa54fe3c0a0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -15,6 +15,7 @@
 
 #include <linux/seq_file.h>
 #include <linux/sync.h>
+#include <linux/timer.h>
 
 #include "mali_osk.h"
 #include "mali_kernel_common.h"
@@ -31,8 +32,11 @@ struct mali_sync_pt
        struct sync_pt pt;
        u32 order;
        s32 error;
+       struct timer_list timer;
 };
 
+static void mali_sync_timed_pt_timeout(unsigned long data);
+
 static inline struct mali_sync_timeline *to_mali_sync_timeline(struct sync_timeline *timeline)
 {
        return container_of(timeline, struct mali_sync_timeline, timeline);
@@ -98,6 +102,16 @@ static int timeline_compare(struct sync_pt *a, struct sync_pt *b)
        }
 }
 
+static void timeline_free_pt(struct sync_pt *pt)
+{
+       struct mali_sync_pt *mpt = to_mali_sync_pt(pt);
+
+       if (mpt->timer.function == mali_sync_timed_pt_timeout)
+       {
+               del_timer_sync(&mpt->timer);
+       }
+}
+
 static void timeline_print_tl(struct seq_file *s, struct sync_timeline *sync_timeline)
 {
        struct mali_sync_timeline *mtl = to_mali_sync_timeline(sync_timeline);
@@ -118,6 +132,7 @@ static struct sync_timeline_ops mali_timeline_ops = {
        .dup            = timeline_dup,
        .has_signaled   = timeline_has_signaled,
        .compare        = timeline_compare,
+       .free_pt        = timeline_free_pt,
        .print_obj      = timeline_print_tl,
        .print_pt       = timeline_print_pt
 };
@@ -165,6 +180,65 @@ struct sync_pt *mali_sync_pt_alloc(struct sync_timeline *parent)
        return pt;
 }
 
+static void mali_sync_timed_pt_timeout(unsigned long data)
+{
+       struct sync_pt *pt = (struct sync_pt *)data;
+
+       MALI_DEBUG_ASSERT_POINTER(pt);
+
+       mali_sync_signal_pt(pt, -ETIME);
+}
+
+struct sync_pt *mali_sync_timed_pt_alloc(struct sync_timeline *parent)
+{
+       struct sync_pt *pt;
+       struct mali_sync_pt *mpt;
+       const u32 timeout = msecs_to_jiffies(MALI_SYNC_TIMED_FENCE_TIMEOUT);
+
+       pt = mali_sync_pt_alloc(parent);
+       if (NULL == pt) return NULL;
+       mpt = to_mali_sync_pt(pt);
+
+       init_timer(&mpt->timer);
+
+       mpt->timer.function = mali_sync_timed_pt_timeout;
+       mpt->timer.data = (unsigned long)pt;
+       mpt->timer.expires = jiffies + timeout;
+
+       add_timer(&mpt->timer);
+
+       return pt;
+}
+
+/*
+ * Returns 0 if sync_pt has been committed and are ready for use, -ETIME if
+ * timeout already happened and the fence has been signalled.
+ *
+ * If an error occurs the sync point can not be used.
+ */
+int mali_sync_timed_commit(struct sync_pt *pt)
+{
+       struct mali_sync_pt *mpt = to_mali_sync_pt(pt);
+       int ret;
+
+       if (!mali_sync_timeline_is_ours(pt->parent))
+       {
+               return -EINVAL;
+       }
+
+       /* Stop timer */
+       ret = del_timer_sync(&mpt->timer);
+
+       if (0 == ret)
+       {
+               return -ETIME;
+       }
+
+       MALI_DEBUG_ASSERT(0 == timeline_has_signaled(pt));
+
+       return 0;
+}
+
 void mali_sync_signal_pt(struct sync_pt *pt, int error)
 {
        struct mali_sync_pt *mpt = to_mali_sync_pt(pt);
index a22672c756fff0d21d0f17abfee6e6b93c498cef..599f55b8a6fef0ccbda1986192da3ca918dc010e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -21,6 +21,8 @@
 #include <linux/seq_file.h>
 #include <linux/sync.h>
 
+#define MALI_SYNC_TIMED_FENCE_TIMEOUT 4000 /* 4s */
+
 /*
  * Create a stream object.
  * Built on top of timeline object.
@@ -36,6 +38,18 @@ _mali_osk_errcode_t mali_stream_create(const char * name, int * out_fd);
  */
 struct sync_pt *mali_stream_create_point(int tl_fd);
 int mali_stream_create_fence(struct sync_pt *pt);
+int mali_stream_create_empty_fence(int tl_fd);
+
+/**
+ * Commit an empty timed fence
+ *
+ * This stops the timer of the empty fence and returns wether or not the fence
+ * is still suitable for use.
+ *
+ * Returns -ETIME if fence is already signalled, in which case it can not be
+ * used, or 0 when the timer was stopped and the fence is OK to use.
+ */
+int mali_sync_timed_commit(struct sync_pt *pt);
 
 /*
  * Validate a fd to be a valid fence
@@ -64,6 +78,17 @@ struct sync_timeline *mali_sync_timeline_alloc(const char *name);
  */
 struct sync_pt *mali_sync_pt_alloc(struct sync_timeline *parent);
 
+/* Allocates a timed sync point within the timeline.
+ *
+ * The timeline must be the one allocated by mali_sync_timeline_alloc
+ *
+ * Sync points must be triggered in *exactly* the same order as they are allocated.
+ *
+ * Timed sync points should be backed by a proper event before reaching the
+ * timeout. If timeout is reached the fence will be signalled with an error (-ETIME).
+ */
+struct sync_pt *mali_sync_timed_pt_alloc(struct sync_timeline *parent);
+
 /* Signals a particular sync point
  *
  * Sync points must be triggered in *exactly* the same order as they are allocated.
index d9bde4eaf4f47f92669a50660cc532f29516d8f8..b47d6626fcb1fe0a0eae005bd937c3005b694033 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -67,7 +67,7 @@ _mali_osk_errcode_t mali_stream_create(const char * name, int *out_fd)
        }
 }
 
-mali_sync_pt *mali_stream_create_point(int tl_fd)
+static mali_sync_pt *mali_stream_create_point_internal(int tl_fd, mali_bool timed)
 {
        struct sync_timeline *tl;
        struct sync_pt * pt;
@@ -85,7 +85,15 @@ mali_sync_pt *mali_stream_create_point(int tl_fd)
 
        tl = tl_file->private_data;
 
-       pt = mali_sync_pt_alloc(tl);
+       if (unlikely(timed))
+       {
+               pt = mali_sync_timed_pt_alloc(tl);
+       }
+       else
+       {
+               pt = mali_sync_pt_alloc(tl);
+       }
+
        if (!pt)
        {
                pt = NULL;
@@ -98,6 +106,11 @@ out:
        return pt;
 }
 
+mali_sync_pt *mali_stream_create_point(int tl_fd)
+{
+       return mali_stream_create_point_internal(tl_fd, MALI_FALSE);
+}
+
 int mali_stream_create_fence(mali_sync_pt *pt)
 {
        struct sync_fence *fence;
@@ -138,6 +151,20 @@ out:
        return fd;
 }
 
+int mali_stream_create_empty_fence(int tl_fd)
+{
+       int fd;
+       mali_sync_pt *pt;
+
+       pt = mali_stream_create_point_internal(tl_fd, MALI_TRUE);
+
+       if (NULL == pt) return -ENOMEM;
+
+       fd = mali_stream_create_fence(pt);
+
+       return fd;
+}
+
 _mali_osk_errcode_t mali_fence_validate(int fd)
 {
        struct sync_fence * fence;
index fbe902a02d43296a603cf17c36fe13ea39c95c27..4a8f34bcc75979ed9788338be4a75181ef56fd43 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index e3d358bed33feedf541223c6afca32c7bb776d2a..fc8b7ab56c6e2d07234cc2f22d75b7346a01e0ac 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -95,7 +95,6 @@ int get_user_settings_wrapper(struct mali_session_data *session_data, _mali_uk_g
        err = _mali_ukk_get_user_settings(&kargs);
        if (_MALI_OSK_ERR_OK != err)
        {
-               printk("fuckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk..\n");
                return map_errcode(err);
        }
 
@@ -129,6 +128,26 @@ int stream_create_wrapper(struct mali_session_data *session_data, _mali_uk_strea
        return 0;
 }
 
+int sync_fence_create_empty_wrapper(struct mali_session_data *session_data, _mali_uk_fence_create_empty_s __user *uargs)
+{
+       _mali_uk_fence_create_empty_s kargs;
+
+       MALI_CHECK_NON_NULL(uargs, -EINVAL);
+
+       if (0 != get_user(kargs.stream, &uargs->stream)) return -EFAULT;
+
+       kargs.fence = mali_stream_create_empty_fence(kargs.stream);
+       if (0 > kargs.fence)
+       {
+               return kargs.fence;
+       }
+
+       kargs.ctx = NULL; /* prevent kernel address to be returned to user space */
+       if (0 != copy_to_user(uargs, &kargs, sizeof(_mali_uk_fence_create_empty_s))) return -EFAULT;
+
+       return 0;
+}
+
 int sync_fence_validate_wrapper(struct mali_session_data *session, _mali_uk_fence_validate_s __user *uargs)
 {
        int fd;
index 4ee4a81b2a7a84deebf5178d3d6c503e24b2d316..c6339dddc556673885fe941e3d5fac7c8eb121ae 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 0afe956e5fc80e6d0ac4ca28ba6a4c2d48f68185..011ee159efdeb9bda5b97af89f40efcb27ffceef 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -65,6 +65,49 @@ int mem_term_wrapper(struct mali_session_data *session_data, _mali_uk_term_mem_s
     return 0;
 }
 
+int mem_write_safe_wrapper(struct mali_session_data *session_data, _mali_uk_mem_write_safe_s __user * uargs)
+{
+       _mali_uk_mem_write_safe_s kargs;
+       _mali_osk_errcode_t err;
+
+       MALI_CHECK_NON_NULL(uargs, -EINVAL);
+       MALI_CHECK_NON_NULL(session_data, -EINVAL);
+
+       if (0 != copy_from_user(&kargs, uargs, sizeof(_mali_uk_mem_write_safe_s)))
+       {
+               return -EFAULT;
+       }
+
+       kargs.ctx = session_data;
+
+       /* Check if we can access the buffers */
+       if (!access_ok(VERIFY_WRITE, kargs.dest, kargs.size)
+           || !access_ok(VERIFY_READ, kargs.src, kargs.size))
+       {
+               return -EINVAL;
+       }
+
+       /* Check if size wraps */
+       if ((kargs.size + kargs.dest) <= kargs.dest
+           || (kargs.size + kargs.src) <= kargs.src)
+       {
+               return -EINVAL;
+       }
+
+       err = _mali_ukk_mem_write_safe(&kargs);
+       if (_MALI_OSK_ERR_OK != err)
+       {
+               return map_errcode(err);
+       }
+
+       if (0 != put_user(kargs.size, &uargs->size))
+       {
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
 int mem_map_ext_wrapper(struct mali_session_data *session_data, _mali_uk_map_external_mem_s __user * argument)
 {
        _mali_uk_map_external_mem_s uk_args;
@@ -230,6 +273,7 @@ int mem_dump_mmu_page_table_wrapper(struct mali_session_data *session_data, _mal
     if (!access_ok(VERIFY_WRITE, buffer, kargs.size)) goto err_exit;
 
     /* allocate temporary buffer (kernel side) to store mmu page table info */
+    MALI_CHECK(kargs.size > 0, -ENOMEM);
     kargs.buffer = _mali_osk_valloc(kargs.size);
     if (NULL == kargs.buffer)
     {
index 37f75c51cb271a6e18edffb228128d530871de47..a642a05f5cb2695a447c273bcc39373880a0ecce 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -27,10 +27,12 @@ int pp_start_job_wrapper(struct mali_session_data *session_data, _mali_uk_pp_sta
        err = _mali_ukk_pp_start_job(session_data, uargs, &fence);
        if (_MALI_OSK_ERR_OK != err) return map_errcode(err);
 
-       if (-1 != fence)
+#if defined(CONFIG_SYNC)
+       if (0 != put_user(fence, &uargs->fence))
        {
-               if (0 != put_user(fence, &uargs->fence)) return -EFAULT;
+               /* Since the job has started we can't return an error. */
        }
+#endif /* CONFIG_SYNC */
 
        return 0;
 }
index f4e31c92723e9d2ec0a9dc0f1a619e56666db0c9..1a51cc587927386a507daf2d83e1e921478e885f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index f9b5a3e3851876f0c950e598417e23d6ea190978..b0c4729707f4081cfbd4456a0b2b634ec1dca011 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2011-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 628998ddcfeeb879e473ff90a586b41c0e1f8897..2d6a6f9efaee13985add7066f5cb396727804a9d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -29,11 +29,13 @@ int get_api_version_wrapper(struct mali_session_data *session_data, _mali_uk_get
 int get_user_settings_wrapper(struct mali_session_data *session_data, _mali_uk_get_user_settings_s __user *uargs);
 #if defined(CONFIG_SYNC)
 int stream_create_wrapper(struct mali_session_data *session_data, _mali_uk_stream_create_s __user *uargs);
+int sync_fence_create_empty_wrapper(struct mali_session_data *session_data, _mali_uk_fence_create_empty_s __user *uargs);
 int sync_fence_validate_wrapper(struct mali_session_data *session, _mali_uk_fence_validate_s __user *uargs);
 #endif
 int post_notification_wrapper(struct mali_session_data *session_data, _mali_uk_post_notification_s __user *uargs);
 int mem_init_wrapper(struct mali_session_data *session_data, _mali_uk_init_mem_s __user *uargs);
 int mem_term_wrapper(struct mali_session_data *session_data, _mali_uk_term_mem_s __user *uargs);
+int mem_write_safe_wrapper(struct mali_session_data *session_data, _mali_uk_mem_write_safe_s __user * uargs);
 int mem_map_ext_wrapper(struct mali_session_data *session_data, _mali_uk_map_external_mem_s __user * argument);
 int mem_unmap_ext_wrapper(struct mali_session_data *session_data, _mali_uk_unmap_external_mem_s __user * argument);
 int mem_query_mmu_page_table_dump_size_wrapper(struct mali_session_data *session_data, _mali_uk_query_mmu_page_table_dump_size_s __user * uargs);
index 3db3f8acf49fa1a113325d7643d62589192738c6..84bd98e93d3ffc48dca337c19ac7ecb47ae3b9cb 100755 (executable)
@@ -139,7 +139,7 @@ static struct platform_device mali_gpu_device =
 
 static struct mali_gpu_device_data mali_gpu_data =
 {
-       .shared_mem_size =384 * 1024 * 1024, /* 256MB */
+       .shared_mem_size =CONFIG_MALI400_OS_MEMORY_SIZE * 1024 * 1024,
        .fb_start = 0x84000000,
        .fb_size = 0x06000000,
 };
@@ -152,6 +152,11 @@ int mali_platform_device_register(void)
        static_pp_mmu_cnt = 1;
 #      endif
 
+       if (mali_gpu_data.shared_mem_size < 10) {
+               MALI_DEBUG_PRINT(2, ("mali os memory didn't configered, set to default(512M)\n"));
+               mali_gpu_data.shared_mem_size = 512 * 1024 *1024;
+       }
+
        MALI_DEBUG_PRINT(4, ("mali_platform_device_register() called\n"));
 
        /* Detect present Mali GPU and connect the correct resources to the device */
index dd751496df5bc6e96b2e9df8645e03dc21ffb881..230b3e0e7fea44cc93757c338edeae14ea8dc8c9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index c2049012bfc772296ba3cff79b6918d5cc69555b..7079d5cbb2a2a987a99b8e6fa9a6cce9757d46bc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index a6b1d76d567fc73752783f5c879992bba5835150..86c8e31fe485f7ee58732b0eaf440a9a562ef4b3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2011, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 3279daede459994020cca41f4b8c8eccacab170b..79d2d5f968f248dd364f16b61ee4926292955f14 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2011, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index a6b1d76d567fc73752783f5c879992bba5835150..86c8e31fe485f7ee58732b0eaf440a9a562ef4b3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2011, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 94b842a10088bc0e2418441ed1cb50a668f051eb..c3a3e1c975a7a87219448e50d2d799ebba030d38 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2011, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index c6aa6337f8034eeff904514fc19c8ab7843cff37..e750ed7d5e3aaf8249cd4c327e86f3b9b9d7c6fd 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2010-2011 ARM Limited. All rights reserved.
+# Copyright (C) 2010-2011, 2013 ARM Limited. All rights reserved.
 # 
 # This program is free software and is provided to you under the terms of the GNU General Public License version 2
 # as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 6569b02a37ce20d9b34da8d2f32564d21e216f29..c662566d9b3ac72f74934a9a9cc9559ab1330f7d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -503,8 +503,6 @@ void _ump_ukk_lock(_ump_uk_lock_s *args )
 
        mem->lock_usage = (ump_lock_usage) args->lock_usage;
 
-       /** TODO: TAKE LOCK HERE */
-
        ump_dd_reference_release(mem);
 }
 
@@ -528,7 +526,5 @@ void _ump_ukk_unlock(_ump_uk_unlock_s *args )
 
        mem->lock_usage = (ump_lock_usage) UMP_NOT_LOCKED;
 
-       /** TODO: RELEASE LOCK HERE */
-
        ump_dd_reference_release(mem);
 }
index b1545e86132576d05452df5333bd44762e2d4b01..0f5afc30c3f40bd3eaf206b97c068c2d4ca9418d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 6e3a2e9e8b6fc4d73125747a8c25c7ccd0b9741c..7c9d27868a821bea4cd173ec51d5a2b65875795e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index d6b59b74e3518fba7f4765c685f4bed87dae2c49..f34a1242598cba2f0b09362b9a71ac54d8719e57 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2011, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 05b39827ce3317244e640ca32a35725fe4fa2675..e9c4b26b2668a4e08dab0d594d9cff477c214aa9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2011, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index a91ae28672a77e08fdf3130dc72bdb0432ca4572..b613153aa421932eb1cef85363accc21aef6c9e6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2011, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index cd5825e836a379ea6a63a6c71804cb08350511d2..857b6764d9fcc7f8b22ed34b41fe98e494ab7c95 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 19a9755b7866587afb751717a353778b50a91018..ffa3727616eb8ceed04cf0366f2cc41298db07f7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index cae04333925627899180a4fbe23243e54cc5dea6..99363a890bae48aae04c8fe1e14f603959ec69a4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index bd90d65d04c89ed96bedad5c647f132d397b6a41..3d65d17f6bcf15d1c395d913dde32791d55d942e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 56e4be3563d7fadeb2316b46c439e48bebc4f0e8..b285cf9d80a436ff401457814acf6e4265f6ac73 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index ba81a07fee09d93bb2c2160af8f71d73e0130b7d..067b30bf1a428889f9592294a948fa55ba29cc36 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index eb57fd88f3f229aa37dd6e35afb3bac682ed8bb6..0225130638567ec499c4d5eabd288604d0d075f1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 1b5af40e963748df0243e8e4e67251e9888fb7e6..5322aa278051b602de30c9ecdb484a690fc5583a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 17b930d2c572e7d2eb0d2ac077791faba78c8196..0eb758d8d374f253fa72a4a83e7ae977e274ec6d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index f5e48ef1fc5122d09b28801fd5e08e8a5744a832..b88a341c42cdbd23e06aca53cac1b1404d270ca9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index e82d7e8da5ea5ef90c91498964dde2ce87ec9b7b..7e017aff2ab592119c8b0176b3297e2d6ed8b253 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 4985bb77d411b9e223b90ae86191f1d32e5f8d95..7c0a17c55c87e48262d36c64202ae7d848b682c5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index cdcf19bc13d5f096c7caced2c7f84b45a74ff431..7ca406ea625bfd2c20c36db7c35d0054cef98f07 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2011, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index fa4bdccfe32cd2af8c8653250120f112040a6b1a..84948877532e9114bbcec02625b8c4aa410e3f4d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index cb557cfebc19d011b839049d2ea9ec0294a2145e..e362facc0533db9144c7fb66f6492c63c9c6f6c4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2011, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index f924705cf742fd1152f5578fae92978f58be28d9..5bb3f1049462b66db83d43af4fd512880e1a67ba 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 37a0fccd7d03af6dc6b614a2344f18f7cbaa0d9b..d138f119130f2721f6a3784c913a90cd5ac39e51 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index ef1902e5391b2b6abd1b8d631e16de40c881fc60..1e048b1baceb0c4f841ba6745de0f00eb5c6dcc6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 0073c4d551dce51fe42c7ccf35a5d01ed727cef4..ff83376f948c878c4d28fd66de177e91abc7b643 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -148,7 +148,14 @@ _mali_osk_errcode_t _ump_osk_mem_mapregion_init( ump_memory_allocation * descrip
 
        vma->vm_private_data = vma_usage_tracker;
        vma->vm_flags |= VM_IO;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)
        vma->vm_flags |= VM_RESERVED;
+#else
+       vma->vm_flags |= VM_DONTDUMP;
+       vma->vm_flags |= VM_DONTEXPAND;
+       vma->vm_flags |= VM_PFNMAP;
+#endif
+
 
        if (0==descriptor->is_cached)
        {
index 12066eb76307e1f585c958d21b04240ae1372c2b..775c648ee431f460decc49aded332e8ac6ead156 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index e701f1bc9eed0d9d16b572c81e5b3391f7da107d..aaf112cce0776ae4a78dd48d9c77771c1455283b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 9ebc35533970193e9b69e1ae3a1323f9d09a03d4..878359a131e6479168bee1b170788615814dcb2c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index 780f311d2e8a4cfd19ce3434fdea6a98d3132d3b..aec6dd70adc3ada271f459e4b8ffcdba278fa8f2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
index e87a903023b5ce06daacd78e79efcf8ac3b84085..6465b710d6dac56478f566c6ef9d7d2f0a8bd608 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010, 2012 ARM Limited. All rights reserved.
+ * Copyright (C) 2010, 2012-2013 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
diff --git a/umplock/Makefile b/umplock/Makefile
new file mode 100644 (file)
index 0000000..d129804
--- /dev/null
@@ -0,0 +1,69 @@
+#
+# Copyright (C) 2012-2013 ARM Limited. All rights reserved.
+# 
+# This program is free software and is provided to you under the terms of the GNU General Public License version 2
+# as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
+# 
+# A copy of the licence is included with the program, and can also be obtained from Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+
+# default to building for the host
+ARCH ?= $(shell uname -m)
+
+# linux build system integration
+
+ifneq ($(KERNELRELEASE),)
+# Inside the kernel build system
+
+EXTRA_CFLAGS += -I$(KBUILD_EXTMOD)
+
+SRC =  umplock_driver.c
+
+MODULE:=umplock.ko
+
+obj-m := $(MODULE:.ko=.o)
+$(MODULE:.ko=-y) := $(SRC:.c=.o)
+
+$(MODULE:.ko=-objs) := $(SRC:.c=.o) 
+
+else
+# Outside the kernel build system
+#
+#
+
+# Get any user defined KDIR-<names> or maybe even a hardcoded KDIR
+-include KDIR_CONFIGURATION
+
+# Define host system directory
+KDIR-$(shell uname -m):=/lib/modules/$(shell uname -r)/build
+
+ifeq ($(ARCH), arm)
+       # when compiling for ARM we're cross compiling
+       export CROSS_COMPILE ?= arm-none-linux-gnueabi-
+       CONFIG ?= arm
+else
+       # Compiling for the host
+       CONFIG ?= $(shell uname -m)
+endif
+
+# default cpu to select
+CPU ?= $(shell uname -m)
+
+# look up KDIR based om CPU selection
+KDIR ?= $(KDIR-$(CPU))
+
+ifeq ($(KDIR),)
+$(error No KDIR found for platform $(CPU))
+endif
+
+all:
+       $(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR)
+
+kernelrelease:
+       $(MAKE) -C $(KDIR) kernelrelease
+
+clean:
+       $(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
+
+endif
diff --git a/umplock/umplock_driver.c b/umplock/umplock_driver.c
new file mode 100644 (file)
index 0000000..7cd72c5
--- /dev/null
@@ -0,0 +1,651 @@
+/*
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
+ * 
+ * This program is free software and is provided to you under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
+ * 
+ * A copy of the licence is included with the program, and can also be obtained from Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/slab.h>
+#include <linux/cdev.h>
+#include <linux/device.h>
+#include <asm/uaccess.h>
+#include "umplock_ioctl.h"
+#include <linux/sched.h>
+
+#define MAX_ITEMS 1024
+#define MAX_PIDS 128    
+
+typedef struct lock_cmd_priv
+{
+       uint32_t msg[128];    /*ioctl args*/     
+       u32 pid;                          /*process id*/
+}_lock_cmd_priv;
+
+typedef struct lock_ref
+{
+       int ref_count;
+       u32 pid;
+}_lock_ref;
+
+typedef struct umplock_item
+{
+       u32 secure_id;
+       /*u32 references;*/
+       _lock_access_usage usage;
+       _lock_ref references[MAX_PIDS]; 
+       struct semaphore item_lock;
+} umplock_item;
+
+typedef struct umplock_device_private
+{
+       struct mutex item_list_lock;
+       atomic_t sessions;
+       umplock_item items[MAX_ITEMS];
+       u32 pids[MAX_PIDS];
+} umplock_device_private;
+
+struct umplock_device
+{
+       struct cdev cdev;
+       struct class *umplock_class;
+};
+
+static char umplock_dev_name[] = "umplock";
+
+int umplock_major = 0;
+module_param(umplock_major, int, S_IRUGO); /* r--r--r-- */
+MODULE_PARM_DESC(umplock_major, "Device major number");
+
+static int  umplock_driver_open( struct inode *inode, struct file *filp );
+static int  umplock_driver_release( struct inode *inode, struct file *filp );
+static long umplock_driver_ioctl( struct file *f, unsigned int cmd, unsigned long arg );
+
+static struct file_operations umplock_fops =  
+{  
+       .owner   = THIS_MODULE,
+       .open    = umplock_driver_open,
+       .release = umplock_driver_release,
+       .unlocked_ioctl = umplock_driver_ioctl,
+};
+
+static struct umplock_device umplock_device;
+static umplock_device_private device;
+
+void umplock_init_locklist( void )
+{
+       memset(&device.items, 0, sizeof(umplock_item)*MAX_ITEMS);
+       atomic_set(&device.sessions, 0);
+}
+
+void umplock_deinit_locklist( void )
+{
+       memset(&device.items, 0, sizeof(umplock_item)*MAX_ITEMS);
+}
+
+int umplock_device_initialize( void )
+{
+       int err;
+       dev_t dev = 0;
+
+       if ( 0 == umplock_major )
+       {
+               err = alloc_chrdev_region(&dev, 0, 1, umplock_dev_name);
+               umplock_major = MAJOR(dev);
+       }
+       else
+       {
+               dev = MKDEV(umplock_major, 0);
+               err = register_chrdev_region(dev, 1, umplock_dev_name);
+       }
+
+       if ( 0 == err )
+       {
+               memset(&umplock_device, 0, sizeof(umplock_device));
+               cdev_init(&umplock_device.cdev, &umplock_fops);
+               umplock_device.cdev.owner = THIS_MODULE;
+               umplock_device.cdev.ops = &umplock_fops;
+
+               err = cdev_add(&umplock_device.cdev, dev, 1);
+               if ( 0 == err )
+               {
+                       umplock_device.umplock_class = class_create(THIS_MODULE, umplock_dev_name);
+                       if ( IS_ERR(umplock_device.umplock_class ) )
+                       {
+                               err = PTR_ERR(umplock_device.umplock_class);
+                       }
+                       else
+                       {
+                               struct device *mdev;
+                               mdev = device_create(umplock_device.umplock_class, NULL, dev, NULL, umplock_dev_name);
+                               if ( !IS_ERR(mdev) ) 
+                               {
+                                       return 0; /* all ok */
+                               }
+       
+                               err = PTR_ERR(mdev);
+                               class_destroy(umplock_device.umplock_class);
+                       }
+                       cdev_del(&umplock_device.cdev);
+               }
+
+               unregister_chrdev_region(dev, 1);
+       }
+
+       return 1;
+}
+
+void umplock_device_terminate(void)
+{
+       dev_t dev = MKDEV(umplock_major, 0);
+
+       device_destroy(umplock_device.umplock_class, dev);
+       class_destroy(umplock_device.umplock_class);
+
+       cdev_del(&umplock_device.cdev);
+       unregister_chrdev_region(dev, 1);
+}
+
+int umplock_constructor(void)
+{
+       mutex_init(&device.item_list_lock);
+       if ( !umplock_device_initialize() ) return 1;
+       umplock_init_locklist();
+
+       return 0;
+}
+
+void umplock_destructor(void)
+{
+       umplock_deinit_locklist();
+       umplock_device_terminate();
+       mutex_destroy(&device.item_list_lock);
+}
+
+int umplock_find_item( u32 secure_id )
+{
+       int i;
+       for ( i=0; i<MAX_ITEMS; i++ )
+       {
+               if ( device.items[i].secure_id == secure_id ) return i;
+       }
+       
+       return -1;
+}
+
+int umplock_find_slot( void )
+{
+       int i;
+       for ( i=0; i<MAX_ITEMS; i++ )
+       {
+               if ( device.items[i].secure_id == 0 ) return i;
+       }
+
+       return -1;
+}
+
+static int umplock_find_item_by_pid( _lock_cmd_priv *lock_cmd, int *item_slot, int *ref_slot)
+{
+       _lock_item_s *lock_item;
+       int i,j;
+       
+       lock_item = (_lock_item_s *)&lock_cmd->msg;
+
+       i = umplock_find_item(lock_item->secure_id);
+
+       if ( i < 0)
+               return -1;
+       
+       for(j=0; j<MAX_PIDS; j++)
+       {
+               if(device.items[i].references[j].pid == lock_cmd->pid)
+               {
+                       *item_slot = i;
+                       *ref_slot = j;
+                       return 0;
+               }
+       }
+       return -1 ;
+}
+
+static int umplock_find_client_valid(u32 pid)
+{
+       int i;
+
+       if(pid == 0)
+               return -1;
+       
+       for(i=0; i<MAX_PIDS; i++)
+       {
+               if(device.pids[i] == pid) return i;
+       }
+
+       return -1;
+}
+/** IOCTLs **/
+static int do_umplock_create( _lock_cmd_priv *lock_cmd)
+{
+       int i_index,ref_index;
+       int ret;
+       _lock_item_s *lock_item = (_lock_item_s *)&lock_cmd->msg;
+
+       i_index = ref_index = -1;
+
+       #if 0
+       if ( lock_item->usage == 1 ) printk( KERN_DEBUG "UMPLOCK: C 0x%x GPU SURFACE\n", lock_item->secure_id );
+       else if ( lock_item->usage == 2 ) printk( KERN_DEBUG "UMPLOCK: C 0x%x GPU TEXTURE\n", lock_item->secure_id );
+       else printk( KERN_DEBUG "UMPLOCK: C 0x%x CPU\n", lock_item->secure_id );
+       #endif
+
+       mutex_lock(&device.item_list_lock);
+       ret = umplock_find_client_valid( lock_cmd->pid );       
+       mutex_unlock(&device.item_list_lock);
+       if( ret < 0 )
+       {
+               /*lock request from an invalid client pid, do nothing*/
+               return 0;
+       }
+
+       mutex_lock(&device.item_list_lock);
+
+       ret = umplock_find_item_by_pid( lock_cmd, &i_index, &ref_index );
+       if ( ret >= 0 )
+       {
+               if (device.items[i_index].references[ref_index].ref_count == 0)
+                       device.items[i_index].references[ref_index].ref_count = 1;
+       }
+       else if ( (i_index = umplock_find_item( lock_item->secure_id)) >= 0 )
+       {
+               for ( ref_index = 0; ref_index < MAX_PIDS; ref_index++)
+               {
+                       if (device.items[i_index].references[ref_index].pid == 0) break;
+               }
+               if ( ref_index < MAX_PIDS )
+               {
+                       device.items[i_index].references[ref_index].pid = lock_cmd->pid;
+                       device.items[i_index].references[ref_index].ref_count = 1;
+               }
+               else
+               {
+                       printk( KERN_ERR "UMPLOCK: whoops, item ran out of available reference slot\n" );
+               }
+       }
+       else
+       {
+               i_index = umplock_find_slot();
+
+               if ( i_index >= 0 )
+               {
+                       device.items[i_index].secure_id = lock_item->secure_id;
+                       device.items[i_index].usage = lock_item->usage;
+                       device.items[i_index].references[0].pid = lock_cmd->pid;
+                       device.items[i_index].references[0].ref_count = 1;
+                       sema_init(&device.items[i_index].item_lock, 1);
+               }
+               else
+               {
+                       printk( KERN_ERR "UMPLOCK: whoops, ran out of available slots\n" );
+               }
+       }
+       
+       mutex_unlock(&device.item_list_lock);
+       return 0;
+}
+
+static int do_umplock_process( _lock_cmd_priv *lock_cmd )
+{
+       int ret, i_index, ref_index, ref_count;
+       _lock_item_s *lock_item = (_lock_item_s *)&lock_cmd->msg;
+
+       mutex_lock(&device.item_list_lock);
+       ret = umplock_find_client_valid( lock_cmd->pid );       
+       mutex_unlock(&device.item_list_lock);
+       if( ret < 0 )
+       {
+               /*lock request from an invalid client pid, do nothing*/
+               return 0;
+       }
+       
+       mutex_lock(&device.item_list_lock);
+       ret = umplock_find_item_by_pid( lock_cmd, &i_index, &ref_index );
+       ref_count = device.items[i_index].references[ref_index].ref_count;
+       mutex_unlock(&device.item_list_lock);
+       if ( ret >= 0 )
+       {
+               if (ref_count == 1)
+               {
+                       if ( down_interruptible(&device.items[i_index].item_lock) )
+                       {
+                               return -ERESTARTSYS;
+                       }
+               }
+
+               mutex_lock(&device.item_list_lock);
+               device.items[i_index].references[ref_index].ref_count++;
+               mutex_unlock(&device.item_list_lock);
+
+               #if 0
+               if ( lock_item->usage == 1 ) printk( KERN_DEBUG "UMPLOCK:  P 0x%x GPU SURFACE\n", lock_item->secure_id );
+               else if ( lock_item->usage == 2 ) printk( KERN_DEBUG "UMPLOCK:  P 0x%x GPU TEXTURE\n", lock_item->secure_id );
+               else printk( KERN_DEBUG "UMPLOCK:  P 0x%x CPU\n", lock_item->secure_id );
+               #endif
+       }
+
+       return 0;
+}
+
+static int do_umplock_release( _lock_cmd_priv *lock_cmd )
+{
+       int i_index,ref_index, ref_count;
+       int ret;
+       _lock_item_s *lock_item = (_lock_item_s *)&lock_cmd->msg;
+
+       mutex_lock(&device.item_list_lock);
+       ret = umplock_find_client_valid( lock_cmd->pid );       
+       mutex_unlock(&device.item_list_lock);
+       if( ret < 0 )
+       {
+               /*lock request from an invalid client pid, do nothing*/
+               return 0;
+       }
+       
+       i_index = ref_index = -1;
+
+       mutex_lock(&device.item_list_lock);
+       ret = umplock_find_item_by_pid( lock_cmd, &i_index, &ref_index );
+       mutex_unlock(&device.item_list_lock);
+
+       if ( ret >= 0 )
+       {
+               mutex_lock(&device.item_list_lock);
+               device.items[i_index].references[ref_index].ref_count--;
+               ref_count = device.items[i_index].references[ref_index].ref_count;
+               mutex_unlock(&device.item_list_lock);
+
+               #if 0
+               if ( lock_item->usage == 1 ) printk( KERN_DEBUG "UMPLOCK:   R 0x%x GPU SURFACE\n", lock_item->secure_id );
+               else if ( lock_item->usage == 2 ) printk( KERN_DEBUG "UMPLOCK:   R 0x%x GPU TEXTURE\n", lock_item->secure_id );
+               else printk( KERN_DEBUG "UMPLOCK:   R 0x%x CPU\n", lock_item->secure_id );
+               #endif
+        if ( ref_count == 1 )
+               {
+                       if ( 0 == down_trylock(&device.items[i_index].item_lock) )
+                       {
+                               //printk( KERN_ERR "UMPLOCK: semaphore for secure id 0x%x was not taken\n", lock_item->secure_id );
+                       }
+                       up( &device.items[i_index].item_lock );
+
+                       mutex_lock(&device.item_list_lock);
+                       device.items[i_index].references[ref_index].ref_count = 0;
+                       device.items[i_index].references[ref_index].pid = 0;
+                       mutex_unlock(&device.item_list_lock);
+               }
+       }
+       return 0;
+}
+
+static int do_umplock_zap( void )
+{
+       int i;
+
+       printk( KERN_DEBUG "UMPLOCK: ZAP ALL ENTRIES!\n" );
+
+       mutex_lock(&device.item_list_lock);
+       
+       for ( i=0; i<MAX_ITEMS; i++ )
+       {
+               device.items[i].secure_id = 0;
+               memset(&device.items[i].references, 0, sizeof(_lock_ref)*MAX_PIDS);
+               sema_init(&device.items[i].item_lock, 1);
+       }
+       mutex_unlock(&device.item_list_lock);
+
+       for ( i=0; i<MAX_PIDS; i++)
+       {
+               device.pids[i] = 0;
+       }
+       return 0;
+}
+
+static int do_umplock_dump( void )
+{
+       int i, j;
+
+       printk("dump all the items\n");
+
+       mutex_lock(&device.item_list_lock);
+       for (i = 0; i < MAX_ITEMS; i++)
+       {
+               for (j = 0; j < MAX_PIDS; j++)
+               {
+                       if (device.items[i].secure_id != 0 && device.items[i].references[j].pid != 0)
+                       {
+                               printk("item[%d]->secure_id=%d\t reference[%d].ref_count=%d.pid=%d\n",
+                                       i,
+                                       device.items[i].secure_id,
+                                       j,
+                                       device.items[i].references[j].ref_count,
+                                       device.items[i].references[j].pid);
+                       }
+               }
+       }
+       mutex_unlock(&device.item_list_lock);
+
+       return 0;
+}
+
+int do_umplock_client_add (_lock_cmd_priv *lock_cmd )
+{
+       int i;
+
+       for ( i= 0; i<MAX_PIDS; i++)
+       {
+               if(device.pids[i] == lock_cmd->pid)
+               {
+                       return 0;
+               }
+       }
+       for ( i=0; i<MAX_PIDS; i++)
+       {
+               if(device.pids[i]==0)
+               {
+                       mutex_lock(&device.item_list_lock);
+                       device.pids[i] = lock_cmd->pid;
+                       mutex_unlock(&device.item_list_lock);
+                       break;
+               }
+       }
+       if( i==MAX_PIDS)
+       {
+               printk(KERN_ERR "Oops, Run out of cient slots\n ");
+       }
+       return 0;
+}
+
+int do_umplock_client_delete (_lock_cmd_priv *lock_cmd )
+{
+       int p_index=-1, i_index=-1,ref_index=-1;
+       int ret;
+       _lock_item_s *lock_item;
+       lock_item = (_lock_item_s *)&lock_cmd->msg;
+       
+       mutex_lock(&device.item_list_lock);
+       p_index = umplock_find_client_valid( lock_cmd->pid );
+       mutex_unlock(&device.item_list_lock);
+       /*lock item pid is not valid.*/
+       if ( p_index<0 )
+               return 0;
+
+
+       /*walk through umplock item list and release reference attached to this client*/
+       for(i_index = 0; i_index< MAX_ITEMS; i_index++ )
+       {
+               lock_item->secure_id = device.items[i_index].secure_id;
+               mutex_lock(&device.item_list_lock);
+               /*find the item index and reference slot for the lock_item*/
+               ret = umplock_find_item_by_pid(lock_cmd, &i_index, &ref_index);
+               mutex_unlock(&device.item_list_lock);
+               
+               if(ret < 0)
+               {
+                       /*client has no reference on this umplock item, skip*/
+                       continue;
+               }
+               while(device.items[i_index].references[ref_index].ref_count)
+               {
+                       /*release references on this client*/
+                       do_umplock_release(lock_cmd);
+               }
+       }
+       
+       mutex_lock(&device.item_list_lock);
+       /*remove the pid from umplock valid pid list*/
+       device.pids[p_index] = 0;
+       mutex_unlock(&device.item_list_lock);
+
+       return 0;
+}
+
+static long umplock_driver_ioctl( struct file *f, unsigned int cmd, unsigned long arg )
+{
+       int ret;
+       uint32_t size = _IOC_SIZE(cmd);
+       _lock_cmd_priv lock_cmd ;
+
+       if (_IOC_TYPE(cmd) != LOCK_IOCTL_GROUP )
+       {
+               return -ENOTTY;
+       }
+
+       if (_IOC_NR(cmd) >= LOCK_IOCTL_MAX_CMDS )
+       {
+               return -ENOTTY;
+       }
+
+       switch ( cmd )
+       {
+               case LOCK_IOCTL_CREATE:
+                       if (size != sizeof(_lock_item_s)) 
+                       {
+                               return -ENOTTY;
+                       }
+
+                       if (copy_from_user(&lock_cmd.msg, (void __user *)arg, size))
+                       {
+                               return -EFAULT;
+                       }
+                       lock_cmd.pid = (u32)current->tgid;              
+                       ret = do_umplock_create(&lock_cmd);
+                       if (ret)
+                       {
+                               return ret;
+                       }
+                       return 0;
+
+               case LOCK_IOCTL_PROCESS:
+                       if (size != sizeof(_lock_item_s)) 
+                       {
+                               return -ENOTTY;
+                       }
+
+                       if (copy_from_user(&lock_cmd.msg, (void __user *)arg, size))
+                       {
+                               return -EFAULT;
+                       }
+                       lock_cmd.pid = (u32)current->tgid;
+                       return do_umplock_process(&lock_cmd);
+
+               case LOCK_IOCTL_RELEASE:
+                       if (size != sizeof(_lock_item_s)) 
+                       {
+                               return -ENOTTY;
+                       }
+
+                       if (copy_from_user(&lock_cmd.msg, (void __user *)arg, size))
+                       {
+                               return -EFAULT;
+                       }
+                       lock_cmd.pid = (u32)current->tgid;
+                       ret = do_umplock_release( &lock_cmd );
+                       if (ret)
+                       {
+                               return ret;
+                       }
+                       return 0;
+
+               case LOCK_IOCTL_ZAP:
+                       do_umplock_zap();
+                       return 0;
+
+               case LOCK_IOCTL_DUMP:
+                       do_umplock_dump();
+                       return 0;
+       }
+
+       return -ENOIOCTLCMD;
+}
+
+static int umplock_driver_open( struct inode *inode, struct file *filp )
+{
+       _lock_cmd_priv lock_cmd;
+       
+       atomic_inc(&device.sessions); 
+       printk( KERN_DEBUG "UMPLOCK: OPEN SESSION (%i references)\n", atomic_read(&device.sessions) );
+       
+       lock_cmd.pid = (u32)current->tgid;
+       do_umplock_client_add(&lock_cmd);
+       
+       return 0;
+}
+
+static int umplock_driver_release( struct inode *inode, struct file *filp )
+{
+       _lock_cmd_priv lock_cmd;
+       
+       lock_cmd.pid = (u32)current->tgid;
+       do_umplock_client_delete(&lock_cmd);
+       
+       atomic_dec(&device.sessions); 
+       printk( KERN_DEBUG "UMPLOCK: CLOSE SESSION (%i references)\n", atomic_read(&device.sessions) );
+       if ( atomic_read(&device.sessions) == 0 )
+       {
+               do_umplock_zap();
+       }
+
+       return 0;
+}
+
+static int __init umplock_initialize_module( void )
+{
+       printk( KERN_DEBUG "Inserting UMP lock device driver. Compiled: %s, time: %s\n", __DATE__, __TIME__ );
+
+       if ( !umplock_constructor() )
+       {
+               printk( KERN_ERR "UMP lock device driver init failed\n");
+               return -ENOTTY;
+       }
+
+       printk( KERN_DEBUG "UMP lock device driver loaded\n" );
+
+       return 0;
+}
+
+static void __exit umplock_cleanup_module( void )
+{
+       printk( KERN_DEBUG "unloading UMP lock module\n" );
+       umplock_destructor();
+       printk( KERN_DEBUG "UMP lock module unloaded\n" );
+}
+
+module_init(umplock_initialize_module);
+module_exit(umplock_cleanup_module);
+
+
+MODULE_LICENSE("GPL");  
+MODULE_AUTHOR("ARM Ltd.");  
+MODULE_DESCRIPTION("ARM UMP locker"); 
diff --git a/umplock/umplock_ioctl.h b/umplock/umplock_ioctl.h
new file mode 100644 (file)
index 0000000..3d3882b
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2012-2013 ARM Limited. All rights reserved.
+ * 
+ * This program is free software and is provided to you under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
+ * 
+ * A copy of the licence is included with the program, and can also be obtained from Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __UMPLOCK_IOCTL_H__
+#define __UMPLOCK_IOCTL_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <linux/types.h>
+#include <linux/ioctl.h>
+
+#ifndef __user
+#define __user
+#endif
+
+
+/**
+ * @file umplock_ioctl.h
+ * This file describes the interface needed to use the Linux device driver.
+ * The interface is used by the userpace Mali DDK.
+ */
+
+typedef enum
+{
+       _LOCK_ACCESS_RENDERABLE = 1,
+       _LOCK_ACCESS_TEXTURE,
+       _LOCK_ACCESS_CPU_WRITE,
+       _LOCK_ACCESS_CPU_READ,
+} _lock_access_usage;
+
+typedef struct _lock_item_s
+{
+       unsigned int secure_id;
+       _lock_access_usage usage;
+} _lock_item_s;
+
+
+#define LOCK_IOCTL_GROUP 0x91
+
+#define _LOCK_IOCTL_CREATE_CMD  0   /* create kernel lock item        */
+#define _LOCK_IOCTL_PROCESS_CMD 1   /* process kernel lock item       */
+#define _LOCK_IOCTL_RELEASE_CMD 2   /* release kernel lock item       */
+#define _LOCK_IOCTL_ZAP_CMD     3   /* clean up all kernel lock items */
+#define _LOCK_IOCTL_DUMP_CMD    4   /* dump all the items */
+
+#define LOCK_IOCTL_MAX_CMDS     5
+
+#define LOCK_IOCTL_CREATE  _IOW( LOCK_IOCTL_GROUP, _LOCK_IOCTL_CREATE_CMD,  _lock_item_s )
+#define LOCK_IOCTL_PROCESS _IOW( LOCK_IOCTL_GROUP, _LOCK_IOCTL_PROCESS_CMD, _lock_item_s )
+#define LOCK_IOCTL_RELEASE _IOW( LOCK_IOCTL_GROUP, _LOCK_IOCTL_RELEASE_CMD, _lock_item_s )
+#define LOCK_IOCTL_ZAP     _IO ( LOCK_IOCTL_GROUP, _LOCK_IOCTL_ZAP_CMD )
+#define LOCK_IOCTL_DUMP    _IO ( LOCK_IOCTL_GROUP, _LOCK_IOCTL_DUMP_CMD )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __UMPLOCK_IOCTL_H__ */
+