Loading Documentation/devicetree/bindings/arm/msm/msm_watchdog.txt +4 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,9 @@ Optional properties: - qcom,ipi-ping : (boolean) send keep alive ping to other cpus if present - qcom,wakeup-enable : (boolean) enable non secure watchdog to freeze / unfreeze automatically across suspend / resume path. - qcom,scandump-sizes : an array of 32-bit values that contains the size of the scandump memory region for each CPU, such that the nth 32 bit value maps to the scandump size for CPU n. Example: Loading @@ -45,4 +48,5 @@ Example: qcom,pet-time = <10000>; qcom,ipi-ping; qcom,wakeup-enable; qcom,scandump-size = <0x10100 0x10100 0x10100 0x10100>; }; arch/arm64/boot/dts/qcom/sm8150.dtsi +2 −0 Original line number Diff line number Diff line Loading @@ -1757,6 +1757,8 @@ qcom,pet-time = <9360>; qcom,ipi-ping; qcom,wakeup-enable; qcom,scandump-sizes = <0x10100 0x10100 0x10100 0x10100 0x18100 0x18100 0x18100 0x18100>; }; qcom,npu@0x9800000 { Loading drivers/soc/qcom/watchdog_v2.c +19 −6 Original line number Diff line number Diff line Loading @@ -54,7 +54,6 @@ #define SCM_SET_REGSAVE_CMD 0x2 #define SCM_SVC_SEC_WDOG_DIS 0x7 #define MAX_CPU_CTX_SIZE 2048 #define MAX_CPU_SCANDUMP_SIZE 0x10100 static struct msm_watchdog_data *wdog_data; Loading Loading @@ -100,6 +99,7 @@ struct msm_watchdog_data { unsigned long long thread_start; unsigned long long ping_start[NR_CPUS]; unsigned long long ping_end[NR_CPUS]; unsigned int cpu_scandump_sizes[NR_CPUS]; }; /* Loading Loading @@ -598,8 +598,10 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd) int cpu; static dma_addr_t dump_addr; static void *dump_vaddr; unsigned int scandump_size; for_each_cpu(cpu, cpu_present_mask) { scandump_size = wdog_dd->cpu_scandump_sizes[cpu]; cpu_data = devm_kzalloc(wdog_dd->dev, sizeof(struct msm_dump_data), GFP_KERNEL); Loading @@ -607,17 +609,17 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd) continue; dump_vaddr = (void *) dma_alloc_coherent(wdog_dd->dev, MAX_CPU_SCANDUMP_SIZE, scandump_size, &dump_addr, GFP_KERNEL); if (!dump_vaddr) { dev_err(wdog_dd->dev, "Couldn't get memory for dump\n"); continue; } memset(dump_vaddr, 0x0, MAX_CPU_SCANDUMP_SIZE); memset(dump_vaddr, 0x0, scandump_size); cpu_data->addr = dump_addr; cpu_data->len = MAX_CPU_SCANDUMP_SIZE; cpu_data->len = scandump_size; snprintf(cpu_data->name, sizeof(cpu_data->name), "KSCANDUMP%d", cpu); dump_entry.id = MSM_DUMP_DATA_SCANDUMP_PER_CPU + cpu; Loading @@ -627,7 +629,7 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd) if (ret) { dev_err(wdog_dd->dev, "Dump setup failed, id = %d\n", MSM_DUMP_DATA_SCANDUMP_PER_CPU + cpu); dma_free_coherent(wdog_dd->dev, MAX_CPU_SCANDUMP_SIZE, dma_free_coherent(wdog_dd->dev, scandump_size, dump_vaddr, dump_addr); devm_kfree(wdog_dd->dev, cpu_data); Loading Loading @@ -752,7 +754,7 @@ static int msm_wdog_dt_to_pdata(struct platform_device *pdev, { struct device_node *node = pdev->dev.of_node; struct resource *res; int ret; int ret, cpu, num_scandump_sizes; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "wdt-base"); if (!res) Loading Loading @@ -814,6 +816,17 @@ static int msm_wdog_dt_to_pdata(struct platform_device *pdev, pdata->wakeup_irq_enable = of_property_read_bool(node, "qcom,wakeup-enable"); num_scandump_sizes = of_property_count_elems_of_size(node, "qcom,scandump-sizes", sizeof(u32)); if (num_scandump_sizes < 0 || num_scandump_sizes != NR_CPUS) dev_info(&pdev->dev, "%s scandump sizes property not correct\n", __func__); else for_each_cpu(cpu, cpu_present_mask) of_property_read_u32_index(node, "qcom,scandump-sizes", cpu, &pdata->cpu_scandump_sizes[cpu]); pdata->irq_ppi = irq_is_percpu(pdata->bark_irq); dump_pdata(pdata); return 0; Loading Loading
Documentation/devicetree/bindings/arm/msm/msm_watchdog.txt +4 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,9 @@ Optional properties: - qcom,ipi-ping : (boolean) send keep alive ping to other cpus if present - qcom,wakeup-enable : (boolean) enable non secure watchdog to freeze / unfreeze automatically across suspend / resume path. - qcom,scandump-sizes : an array of 32-bit values that contains the size of the scandump memory region for each CPU, such that the nth 32 bit value maps to the scandump size for CPU n. Example: Loading @@ -45,4 +48,5 @@ Example: qcom,pet-time = <10000>; qcom,ipi-ping; qcom,wakeup-enable; qcom,scandump-size = <0x10100 0x10100 0x10100 0x10100>; };
arch/arm64/boot/dts/qcom/sm8150.dtsi +2 −0 Original line number Diff line number Diff line Loading @@ -1757,6 +1757,8 @@ qcom,pet-time = <9360>; qcom,ipi-ping; qcom,wakeup-enable; qcom,scandump-sizes = <0x10100 0x10100 0x10100 0x10100 0x18100 0x18100 0x18100 0x18100>; }; qcom,npu@0x9800000 { Loading
drivers/soc/qcom/watchdog_v2.c +19 −6 Original line number Diff line number Diff line Loading @@ -54,7 +54,6 @@ #define SCM_SET_REGSAVE_CMD 0x2 #define SCM_SVC_SEC_WDOG_DIS 0x7 #define MAX_CPU_CTX_SIZE 2048 #define MAX_CPU_SCANDUMP_SIZE 0x10100 static struct msm_watchdog_data *wdog_data; Loading Loading @@ -100,6 +99,7 @@ struct msm_watchdog_data { unsigned long long thread_start; unsigned long long ping_start[NR_CPUS]; unsigned long long ping_end[NR_CPUS]; unsigned int cpu_scandump_sizes[NR_CPUS]; }; /* Loading Loading @@ -598,8 +598,10 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd) int cpu; static dma_addr_t dump_addr; static void *dump_vaddr; unsigned int scandump_size; for_each_cpu(cpu, cpu_present_mask) { scandump_size = wdog_dd->cpu_scandump_sizes[cpu]; cpu_data = devm_kzalloc(wdog_dd->dev, sizeof(struct msm_dump_data), GFP_KERNEL); Loading @@ -607,17 +609,17 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd) continue; dump_vaddr = (void *) dma_alloc_coherent(wdog_dd->dev, MAX_CPU_SCANDUMP_SIZE, scandump_size, &dump_addr, GFP_KERNEL); if (!dump_vaddr) { dev_err(wdog_dd->dev, "Couldn't get memory for dump\n"); continue; } memset(dump_vaddr, 0x0, MAX_CPU_SCANDUMP_SIZE); memset(dump_vaddr, 0x0, scandump_size); cpu_data->addr = dump_addr; cpu_data->len = MAX_CPU_SCANDUMP_SIZE; cpu_data->len = scandump_size; snprintf(cpu_data->name, sizeof(cpu_data->name), "KSCANDUMP%d", cpu); dump_entry.id = MSM_DUMP_DATA_SCANDUMP_PER_CPU + cpu; Loading @@ -627,7 +629,7 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd) if (ret) { dev_err(wdog_dd->dev, "Dump setup failed, id = %d\n", MSM_DUMP_DATA_SCANDUMP_PER_CPU + cpu); dma_free_coherent(wdog_dd->dev, MAX_CPU_SCANDUMP_SIZE, dma_free_coherent(wdog_dd->dev, scandump_size, dump_vaddr, dump_addr); devm_kfree(wdog_dd->dev, cpu_data); Loading Loading @@ -752,7 +754,7 @@ static int msm_wdog_dt_to_pdata(struct platform_device *pdev, { struct device_node *node = pdev->dev.of_node; struct resource *res; int ret; int ret, cpu, num_scandump_sizes; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "wdt-base"); if (!res) Loading Loading @@ -814,6 +816,17 @@ static int msm_wdog_dt_to_pdata(struct platform_device *pdev, pdata->wakeup_irq_enable = of_property_read_bool(node, "qcom,wakeup-enable"); num_scandump_sizes = of_property_count_elems_of_size(node, "qcom,scandump-sizes", sizeof(u32)); if (num_scandump_sizes < 0 || num_scandump_sizes != NR_CPUS) dev_info(&pdev->dev, "%s scandump sizes property not correct\n", __func__); else for_each_cpu(cpu, cpu_present_mask) of_property_read_u32_index(node, "qcom,scandump-sizes", cpu, &pdata->cpu_scandump_sizes[cpu]); pdata->irq_ppi = irq_is_percpu(pdata->bark_irq); dump_pdata(pdata); return 0; Loading