#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
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) {
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)
* 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);
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));
/* 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));
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;
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;
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);
* 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;
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);
#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;
#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. */