[9610] wlbt: Shared DRAM memory partitioning
authorRoman Geller <r.geller@samsung.com>
Tue, 17 Jul 2018 12:18:29 +0000 (13:18 +0100)
committerhskang <hs1218.kang@samsung.com>
Fri, 17 Aug 2018 00:32:58 +0000 (20:32 -0400)
Added a second dram partition section for the new debug mechanism
which will store debug info in DRAM buffers

Change-Id: I6a3dad523bff21ec1c242bc8c66a3d775cd66c8f
SCSC-Bug-Id: SSB-41224
Signed-off-by: Roman Geller <r.geller@samsung.com>
drivers/misc/samsung/scsc/mxman.c
drivers/misc/samsung/scsc/scsc_mx_impl.c
drivers/misc/samsung/scsc/scsc_mx_impl.h
drivers/misc/samsung/scsc/scsc_service.c
include/scsc/scsc_mx.h

index 8a25d6b16bc503a7c11f4693e6e1a8ffb2f6eaf9..79fedb07afee0c41fa0a7a54d5e92e65f009d812 100755 (executable)
@@ -51,6 +51,8 @@ static struct work_struct     wlbtd_work;
 #define STRING_BUFFER_MAX_LENGTH 512
 #define NUMBER_OF_STRING_ARGS  5
 #define MX_DRAM_SIZE (4 * 1024 * 1024)
+#define MX_DRAM_SIZE_SECTION_1 (8 * 1024 * 1024)
+#define MX_DRAM_SIZE_SECTION_2 (8 * 1024 * 1024)
 #define MX_FW_RUNTIME_LENGTH (1024 * 1024)
 #define WAIT_FOR_FW_TO_START_DELAY_MS 1000
 #define MBOX2_MAGIC_NUMBER 0xbcdeedcb
@@ -801,6 +803,8 @@ static int mxman_start(struct mxman *mxman)
        bool                fwhdr_parsed_ok;
        void                *start_mifram_heap;
        u32                 length_mifram_heap;
+       void                *start_mifram_heap2;
+       u32                 length_mifram_heap2;
        int                 r;
 
        if (reset_failed) {
@@ -826,7 +830,7 @@ static int mxman_start(struct mxman *mxman)
                return -ENOMEM;
        }
 
-       SCSC_TAG_DEBUG(MXMAN, "Allocated %zu bytes\n", size_dram);
+       SCSC_TAG_INFO(MXMAN, "Allocated %zu bytes\n", size_dram);
 
 #ifdef CONFIG_SCSC_CHV_SUPPORT
        if (chv_run)
@@ -848,9 +852,13 @@ static int mxman_start(struct mxman *mxman)
         * rounding up the size if required
         */
        start_mifram_heap = (char *)start_dram + fwhdr->fw_runtime_length;
-       length_mifram_heap = size_dram - fwhdr->fw_runtime_length;
+       length_mifram_heap = MX_DRAM_SIZE_SECTION_1 - fwhdr->fw_runtime_length;
+
+       start_mifram_heap2 = (char *)start_dram + MX_DRAM_SIZE_SECTION_2;
+       length_mifram_heap2 = MX_DRAM_SIZE_SECTION_2;
 
        miframman_init(scsc_mx_get_ramman(mxman->mx), start_mifram_heap, length_mifram_heap);
+       miframman_init(scsc_mx_get_ramman2(mxman->mx), start_mifram_heap2, length_mifram_heap2);
        mifmboxman_init(scsc_mx_get_mboxman(mxman->mx));
        mifintrbit_init(scsc_mx_get_intrbit(mxman->mx), mif);
 
@@ -861,6 +869,7 @@ static int mxman_start(struct mxman *mxman)
                fw_crc_wq_stop(mxman);
                mifintrbit_deinit(scsc_mx_get_intrbit(mxman->mx));
                miframman_deinit(scsc_mx_get_ramman(mxman->mx));
+               miframman_deinit(scsc_mx_get_ramman2(mxman->mx));
                mifmboxman_deinit(scsc_mx_get_mboxman(mxman->mx));
 #ifdef CONFIG_SCSC_SMAPPER
                mifsmapper_deinit(scsc_mx_get_smapper(mxman->mx));
@@ -1586,6 +1595,7 @@ static void mxman_stop(struct mxman *mxman)
        /* Unitialise components (they may perform some checks - e.g. all memory freed) */
        mifintrbit_deinit(scsc_mx_get_intrbit(mxman->mx));
        miframman_deinit(scsc_mx_get_ramman(mxman->mx));
+       miframman_deinit(scsc_mx_get_ramman2(mxman->mx));
        mifmboxman_deinit(scsc_mx_get_mboxman(mxman->mx));
 #ifdef CONFIG_SCSC_SMAPPER
        mifsmapper_deinit(scsc_mx_get_smapper(mxman->mx));
index b83877d2617afd1c1222a5ec805b58eb15c52d7c..2c0323a11b9edc7ff5a3005c8722c041e57347b6 100644 (file)
@@ -31,6 +31,7 @@ struct scsc_mx {
        struct scsc_mif_abs     *mif_abs;
        struct mifintrbit       intr;
        struct miframman        ram;
+       struct miframman        ram2;
        struct mifmboxman       mbox;
 #ifdef CONFIG_SCSC_SMAPPER
        struct mifsmapper       smapper;
@@ -110,6 +111,11 @@ struct miframman *scsc_mx_get_ramman(struct scsc_mx *mx)
        return &mx->ram;
 }
 
+struct miframman *scsc_mx_get_ramman2(struct scsc_mx *mx)
+{
+       return &mx->ram2;
+}
+
 struct mifmboxman *scsc_mx_get_mboxman(struct scsc_mx *mx)
 {
        return &mx->mbox;
index b35c776a973eb4a8423a6f7e84e58c7efff62c41..8446bac75f30fbb7391f954bbf80aab28da8e4dd 100644 (file)
@@ -26,6 +26,7 @@ struct scsc_mif_abs     *scsc_mx_get_mif_abs(struct scsc_mx *mx);
 struct mifintrbit       *scsc_mx_get_intrbit(struct scsc_mx *mx);
 struct mifmuxman        *scsc_mx_get_muxman(struct scsc_mx *mx);
 struct miframman        *scsc_mx_get_ramman(struct scsc_mx *mx);
+struct miframman        *scsc_mx_get_ramman2(struct scsc_mx *mx);
 struct mifmboxman       *scsc_mx_get_mboxman(struct scsc_mx *mx);
 #ifdef CONFIG_SCSC_SMAPPER
 struct mifsmapper       *scsc_mx_get_smapper(struct scsc_mx *mx);
index d47014ea7b9cd2254e78243657d31a41abf9ba7a..642ce8039f62978aa349fc2cdbc986a92fff7b42 100755 (executable)
@@ -642,14 +642,24 @@ EXPORT_SYMBOL(scsc_service_on_halt_ldos_off);
  * is cleared to an INVALID value that can be safely fed to the companion
  * function scsc_mx_service_mifram_free().
  */
-int scsc_mx_service_mifram_alloc(struct scsc_service *service, size_t nbytes, scsc_mifram_ref *ref, u32 align)
+int scsc_mx_service_mifram_alloc_extended(struct scsc_service *service, size_t nbytes, scsc_mifram_ref *ref, u32 align, uint32_t flags)
 {
        struct scsc_mx      *mx = service->mx;
        void                *mem;
        int                 ret;
+       struct miframman    *ramman;
 
-       mem = miframman_alloc(scsc_mx_get_ramman(mx), nbytes, align);
+       if (flags & MIFRAMMAN_MEM_POOL_GENERIC) {
+               ramman = scsc_mx_get_ramman(mx);
+       } else if (flags & MIFRAMMAN_MEM_POOL_LOGGING) {
+               ramman = scsc_mx_get_ramman2(mx);
+       } else {
+               SCSC_TAG_ERR(MXMAN, "Unsupported flags value: %d", flags);
+               *ref = SCSC_MIFRAM_INVALID_REF;
+               return -ENOMEM;
+       }
 
+       mem = miframman_alloc(ramman, nbytes, align);
        if (!mem) {
                SCSC_TAG_ERR(MXMAN, "miframman_alloc() failed\n");
                *ref = SCSC_MIFRAM_INVALID_REF;
@@ -662,26 +672,48 @@ int scsc_mx_service_mifram_alloc(struct scsc_service *service, size_t nbytes, sc
        ret = scsc_mx_service_mif_ptr_to_addr(service, mem, ref);
        if (ret) {
                SCSC_TAG_ERR(MXMAN, "scsc_mx_service_mif_ptr_to_addr() failed: ret=%d", ret);
-               miframman_free(scsc_mx_get_ramman(mx), mem);
+               miframman_free(ramman, mem);
                *ref = SCSC_MIFRAM_INVALID_REF;
        } else {
                SCSC_TAG_DEBUG(MXMAN, "mem %p ref %d\n", mem, *ref);
        }
        return ret;
 }
+EXPORT_SYMBOL(scsc_mx_service_mifram_alloc_extended);
+
+int scsc_mx_service_mifram_alloc(struct scsc_service *service, size_t nbytes, scsc_mifram_ref *ref, u32 align)
+{
+       return scsc_mx_service_mifram_alloc_extended(service, nbytes, ref, align, MIFRAMMAN_MEM_POOL_GENERIC);
+}
 EXPORT_SYMBOL(scsc_mx_service_mifram_alloc);
 
 /** Free a contiguous block of SDRAM */
-void scsc_mx_service_mifram_free(struct scsc_service *service, scsc_mifram_ref ref)
+void scsc_mx_service_mifram_free_extended(struct scsc_service *service, scsc_mifram_ref ref, uint32_t flags)
 {
        struct scsc_mx *mx = service->mx;
        void           *mem;
+       struct miframman    *ramman;
+
+       if (flags & MIFRAMMAN_MEM_POOL_GENERIC) {
+               ramman = scsc_mx_get_ramman(mx);
+       } else if (flags & MIFRAMMAN_MEM_POOL_LOGGING) {
+               ramman = scsc_mx_get_ramman2(mx);
+       } else {
+               SCSC_TAG_ERR(MXMAN, "Unsupported flags value: %d", flags);
+               return;
+       }
 
        mem = scsc_mx_service_mif_addr_to_ptr(service, ref);
 
        SCSC_TAG_DEBUG(MXMAN, "**** Freeing %p\n", mem);
 
-       miframman_free(scsc_mx_get_ramman(mx), mem);
+       miframman_free(ramman, mem);
+}
+EXPORT_SYMBOL(scsc_mx_service_mifram_free_extended);
+
+void scsc_mx_service_mifram_free(struct scsc_service *service, scsc_mifram_ref ref)
+{
+       scsc_mx_service_mifram_free_extended(service, ref, MIFRAMMAN_MEM_POOL_GENERIC);
 }
 EXPORT_SYMBOL(scsc_mx_service_mifram_free);
 
index f18de32079b8fdff6ddde646e2ce801ad6937500..25ac3173f7ef9138b1f8aafc64ce3651c79eaaf7 100755 (executable)
 #define        SCSC_FW_EVENT_FAILURE                   0
 #define        SCSC_FW_EVENT_MOREDUMP_COMPLETE         1
 
+/** The following flags define the pools that can used for memory allocation.
+ * To be used with scsc_mx_service_mifram_alloc_extended **/
+/* Standard memory allocation */
+#define MIFRAMMAN_MEM_POOL_GENERIC 1
+/* Used for buffers containing logs that will not be dumped by moredump */
+#define MIFRAMMAN_MEM_POOL_LOGGING 2
+
 struct device;
 struct firmware;
 struct scsc_mx;
@@ -144,10 +151,15 @@ void scsc_service_on_halt_ldos_off(struct scsc_service *service);
 #endif
 
 /* MEMORY Interface*/
-/** Allocate a contiguous block of SDRAM accessible to Client Driver */
+/** Allocate a contiguous block of SDRAM accessible to Client Driver. The memory will be allocated
+ * from generic pool (MIFRAMMAN_MEM_POOL_GENERIC) */
 int scsc_mx_service_mifram_alloc(struct scsc_service *service, size_t nbytes, scsc_mifram_ref *ref, u32 align);
+/* Same as scsc_mx_service_mifram_alloc but allows to specify flags (MIFRAMMAN_MEM_POOL_XX).
+ * So, for example, to allocate memory from the logging pool use MIFRAMMAN_MEM_POOL_LOGGING. */
+int scsc_mx_service_mifram_alloc_extended(struct scsc_service *service, size_t nbytes, scsc_mifram_ref *ref, u32 align, uint32_t flags);
 /** Free a contiguous block of SDRAM */
 void scsc_mx_service_mifram_free(struct scsc_service *service, scsc_mifram_ref ref);
+void scsc_mx_service_mifram_free_extended(struct scsc_service *service, scsc_mifram_ref ref, uint32_t flags);
 
 /* MBOX Interface */
 /** Allocate n contiguous mailboxes. Outputs index of first mbox, returns FALSE if can’t allocate n contiguous mailboxes. */