]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00142679 SCC2 and SAHARA: changes to support loadable modules
authorAnish Trivedi <anish@freescale.com>
Fri, 29 Apr 2011 18:49:39 +0000 (13:49 -0500)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:32:50 +0000 (08:32 +0200)
To allow SCC2 and SAHARA drivers to work as loadable modules, needed
to add GPL license to SAHARA driver, export a couple of functions
from SCC2 driver, and the following data buffer mapping change in
SAHARA driver:

When compiled as a loadable module, a data buffer to be DMA'ed in the
SAHARA driver may not be in the kernel direct-mapped region but in
the "Kernel module space" between TASK_SIZE and high_memory-1
(see http://www.arm.linux.org.uk/developer/memory.txt). In this
scenario, the driver canno simply use the __pa macro to obtain
the physical address. It must walk the page tables to find the
page and use the page_to_phys function to find the physical
address that corresponds to the data buffer.

Signed-off-by: Anish Trivedi <anish@freescale.com>
drivers/mxc/security/sahara2/sah_driver_interface.c
drivers/mxc/security/sahara2/sah_memory_mapper.c
drivers/mxc/security/scc2_driver.c
drivers/mxc/security/scc2_internals.h

index d810265ead971f97355e3872bd9a218d188c08b4..39a03e465cac262e00c96603328378c2a74ab347 100644 (file)
 #define interruptible_sleep_on(x) sah_Handle_Interrupt()
 #endif
 
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Freescale Semiconductor");
+MODULE_DESCRIPTION("Device Driver for SAHARA2 crypto hw block");
+
 #define TEST_MODE_OFF 1
 #define TEST_MODE_ON 2
 
index 2e3b80b148735e0587a8ffc28f00833e3744b2d0..f863b0300c8fa5d6b3cb5f52802a42fdc2c09b3a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2004-2010 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2004-2011 Freescale Semiconductor, Inc. All Rights Reserved.
  */
 
 /*
@@ -750,6 +750,7 @@ sah_Head_Desc *sah_Copy_Descriptors(fsl_shw_uco_t * user_ctx,
 sah_Link *sah_Physicalise_Links(sah_Link * first_link)
 {
        sah_Link *link = first_link;
+       struct page *pg;
 
        while (link != NULL) {
 #ifdef DO_DBG
@@ -814,8 +815,18 @@ sah_Link *sah_Physicalise_Links(sah_Link * first_link)
                        if (!(link->flags & SAH_PREPHYS_DATA)) {
                                link->original_data = link->data;
 
-                               /* All pointers are virtual right now */
-                               link->data = (void *)os_pa(link->data);
+                               /* if the data buffer is not in kernel direct-
+                                 * mapped region, find the physical addr
+                                 * via other means.
+                                 */
+                               if (!virt_addr_valid(link->data)) {
+                                       pg = vmalloc_to_page(link->data);
+                                       link->data = (uint8_t *) (
+                                               page_to_phys(pg) +
+                                               (((unsigned int) link->data) &
+                                                       ~PAGE_MASK));
+                               } else
+                                       link->data = (void *)os_pa(link->data);
 #ifdef DO_DBG
                                os_printk("%sput: %p (%d)\n",
                                          (link->
index a8bd3b259de0cfab12be944f9400dc7b488db138..a8af43028e15df9cabce320776eeb5288d5c5d3a 100644 (file)
@@ -381,7 +381,7 @@ scc_return_t scc_diminish_permissions(void *part_base, uint32_t permissions)
        return SCC_RET_FAIL;
 }
 
-extern scc_partition_status_t scc_partition_status(void *part_base)
+scc_partition_status_t scc_partition_status(void *part_base)
 {
        uint32_t part_no;
        uint32_t part_owner;
index bd7399b5eb41897cc2a7086bdaab9063b1a811a8..34b2ed0395c162d1e535aa547f8574ef445a4d73 100644 (file)
@@ -489,6 +489,8 @@ EXPORT_SYMBOL(scc_release_partition);
 EXPORT_SYMBOL(scc_diminish_permissions);
 EXPORT_SYMBOL(scc_encrypt_region);
 EXPORT_SYMBOL(scc_decrypt_region);
+EXPORT_SYMBOL(scc_partition_status);
+EXPORT_SYMBOL(scc_virt_to_phys);
 /*EXPORT_SYMBOL(make_vpu_partition);*/