1818#include <linux/platform_device.h>
1919#include <linux/firmware/qcom/qcom_tzmem.h>
2020#include <linux/firmware/qcom/memory_dump.h>
21+ #include <linux/cma.h>
22+ #include <linux/vmalloc.h>
23+ #include <linux/mm.h>
24+ #include <linux/dma-map-ops.h>
2125
2226#define MSM_DUMP_TABLE_VERSION MSM_DUMP_MAKE_VERSION(2, 0)
2327
@@ -913,30 +917,6 @@ static int init_memory_dump(void *dump_vaddr, phys_addr_t phys_addr)
913917 return 0 ;
914918}
915919
916- static int mem_dump_reserve_mem (struct device * dev )
917- {
918- struct device_node * mem_node ;
919- struct reserved_mem * rmem ;
920- int ret ;
921-
922- mem_node = of_find_node_by_path ("/reserved-memory/mem-dump-region" );
923- if (mem_node ) {
924- rmem = of_reserved_mem_lookup (mem_node );
925- of_node_put (mem_node );
926- if (!rmem || !rmem -> ops || !rmem -> ops -> device_init )
927- return - EINVAL ;
928-
929- ret = rmem -> ops -> device_init (rmem , dev );
930- if (ret ) {
931- dev_err (dev ,
932- "Failed to initialize reserved mem, ret %d\n" ,
933- ret );
934- return ret ;
935- }
936- }
937- return 0 ;
938- }
939-
940920static int cpuss_regdump_init (struct device * dev ,
941921 void * dump_vaddr , u32 size )
942922{
@@ -998,6 +978,18 @@ static int cpuss_dump_init(struct platform_device *pdev,
998978 return initialized ;
999979}
1000980
981+ struct cma * memdump_cma ;
982+ void __init reserve_memdump_cma (void )
983+ {
984+ unsigned long long cma_size = 0x3000000 ;
985+ unsigned long long request_size = roundup (cma_size , PAGE_SIZE );
986+
987+ if (cma_declare_contiguous (0 , request_size , 0 , 0 , 0 , false,
988+ "memdump" , & memdump_cma )) {
989+ pr_warn ("memdump CMA reservation failed\n" );
990+ }
991+ }
992+
1001993#define MSM_DUMP_DATA_SIZE sizeof(struct msm_dump_data)
1002994static int mem_dump_alloc (struct platform_device * pdev )
1003995{
@@ -1006,16 +998,13 @@ static int mem_dump_alloc(struct platform_device *pdev)
1006998 size_t total_size ;
1007999 u32 size , id ;
10081000 int i , ret , no_of_nodes ;
1009- dma_addr_t dma_handle ;
10101001 phys_addr_t phys_addr ;
1011- struct sg_table mem_dump_sgt ;
10121002 void * dump_vaddr ;
10131003 u64 shm_bridge_handle ;
10141004 int initialized = 0 ;
10151005 const struct dump_table * table = dev_get_platdata (& pdev -> dev );
1006+ struct page * reserved_page ;
10161007
1017- if (mem_dump_reserve_mem (& pdev -> dev ) != 0 )
1018- return - ENOMEM ;
10191008 total_size = size = ret = no_of_nodes = 0 ;
10201009 /* For dump table registration with IMEM */
10211010 total_size = sizeof (struct msm_dump_table ) * 2 ;
@@ -1026,15 +1015,12 @@ static int mem_dump_alloc(struct platform_device *pdev)
10261015
10271016 total_size += (MSM_DUMP_DATA_SIZE * no_of_nodes );
10281017 total_size = ALIGN (total_size , SZ_4K );
1029- dump_vaddr = dmam_alloc_coherent ( & pdev -> dev , total_size ,
1030- & dma_handle , GFP_KERNEL );
1031- if (!dump_vaddr )
1018+ reserved_page = cma_alloc ( memdump_cma , total_size >> PAGE_SHIFT ,
1019+ 0 , false );
1020+ if (!reserved_page )
10321021 return - ENOMEM ;
1033-
1034- dma_get_sgtable (& pdev -> dev , & mem_dump_sgt , dump_vaddr ,
1035- dma_handle , total_size );
1036- phys_addr = page_to_phys (sg_page (mem_dump_sgt .sgl ));
1037- sg_free_table (& mem_dump_sgt );
1022+ phys_addr = page_to_phys (reserved_page );
1023+ dump_vaddr = page_to_virt (reserved_page );
10381024
10391025 memset (dump_vaddr , 0x0 , total_size );
10401026 ret = qcom_tzmem_shm_bridge_create (phys_addr , total_size , & shm_bridge_handle );
0 commit comments