Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

remoteproc: mediatek: Support setting DRAM and IPI shared buffer sizes

The SCP on different chips will require different DRAM sizes and IPI
shared buffer sizes based on varying requirements.

Signed-off-by: Olivia Wen <olivia.wen@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://lore.kernel.org/r/20240430011534.9587-4-olivia.wen@mediatek.com
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>

authored by

Olivia Wen and committed by
Mathieu Poirier
c08a8249 928a55ab

+79 -23
+8 -3
drivers/remoteproc/mtk_common.h
··· 78 78 #define MT8195_L2TCM_OFFSET 0x850d0 79 79 80 80 #define SCP_FW_VER_LEN 32 81 - #define SCP_SHARE_BUFFER_SIZE 288 82 81 83 82 struct scp_run { 84 83 u32 signaled; ··· 96 97 97 98 struct mtk_scp; 98 99 100 + struct mtk_scp_sizes_data { 101 + size_t max_dram_size; 102 + size_t ipi_share_buffer_size; 103 + }; 104 + 99 105 struct mtk_scp_of_data { 100 106 int (*scp_clk_get)(struct mtk_scp *scp); 101 107 int (*scp_before_load)(struct mtk_scp *scp); ··· 114 110 u32 host_to_scp_int_bit; 115 111 116 112 size_t ipi_buf_offset; 113 + const struct mtk_scp_sizes_data *scp_sizes; 117 114 }; 118 115 119 116 struct mtk_scp_of_cluster { ··· 146 141 struct scp_ipi_desc ipi_desc[SCP_IPI_MAX]; 147 142 bool ipi_id_ack[SCP_IPI_MAX]; 148 143 wait_queue_head_t ack_wq; 144 + u8 *share_buf; 149 145 150 146 void *cpu_addr; 151 147 dma_addr_t dma_addr; 152 - size_t dram_size; 153 148 154 149 struct rproc_subdev *rpmsg_subdev; 155 150 ··· 167 162 struct mtk_share_obj { 168 163 u32 id; 169 164 u32 len; 170 - u8 share_buf[SCP_SHARE_BUFFER_SIZE]; 165 + u8 *share_buf; 171 166 }; 172 167 173 168 void scp_memcpy_aligned(void __iomem *dst, const void *src, unsigned int len);
+66 -18
drivers/remoteproc/mtk_scp.c
··· 20 20 #include "mtk_common.h" 21 21 #include "remoteproc_internal.h" 22 22 23 - #define MAX_CODE_SIZE 0x500000 24 23 #define SECTION_NAME_IPI_BUFFER ".ipi_buffer" 25 24 26 25 /** ··· 93 94 { 94 95 struct mtk_share_obj __iomem *rcv_obj = scp->recv_buf; 95 96 struct scp_ipi_desc *ipi_desc = scp->ipi_desc; 96 - u8 tmp_data[SCP_SHARE_BUFFER_SIZE]; 97 97 scp_ipi_handler_t handler; 98 98 u32 id = readl(&rcv_obj->id); 99 99 u32 len = readl(&rcv_obj->len); 100 + const struct mtk_scp_sizes_data *scp_sizes; 100 101 101 - if (len > SCP_SHARE_BUFFER_SIZE) { 102 - dev_err(scp->dev, "ipi message too long (len %d, max %d)", len, 103 - SCP_SHARE_BUFFER_SIZE); 102 + scp_sizes = scp->data->scp_sizes; 103 + if (len > scp_sizes->ipi_share_buffer_size) { 104 + dev_err(scp->dev, "ipi message too long (len %d, max %zd)", len, 105 + scp_sizes->ipi_share_buffer_size); 104 106 return; 105 107 } 106 108 if (id >= SCP_IPI_MAX) { ··· 117 117 return; 118 118 } 119 119 120 - memcpy_fromio(tmp_data, &rcv_obj->share_buf, len); 121 - handler(tmp_data, len, ipi_desc[id].priv); 120 + memset(scp->share_buf, 0, scp_sizes->ipi_share_buffer_size); 121 + memcpy_fromio(scp->share_buf, &rcv_obj->share_buf, len); 122 + handler(scp->share_buf, len, ipi_desc[id].priv); 122 123 scp_ipi_unlock(scp, id); 123 124 124 125 scp->ipi_id_ack[id] = true; ··· 134 133 { 135 134 int ret; 136 135 size_t buf_sz, offset; 136 + size_t share_buf_offset; 137 + const struct mtk_scp_sizes_data *scp_sizes; 137 138 138 139 /* read the ipi buf addr from FW itself first */ 139 140 ret = scp_elf_read_ipi_buf_addr(scp, fw, &offset); ··· 155 152 return -EOVERFLOW; 156 153 } 157 154 155 + scp_sizes = scp->data->scp_sizes; 158 156 scp->recv_buf = (struct mtk_share_obj __iomem *) 159 157 (scp->sram_base + offset); 158 + share_buf_offset = sizeof(scp->recv_buf->id) 159 + + sizeof(scp->recv_buf->len) + scp_sizes->ipi_share_buffer_size; 160 160 scp->send_buf = (struct mtk_share_obj __iomem *) 161 - (scp->sram_base + offset + sizeof(*scp->recv_buf)); 162 - memset_io(scp->recv_buf, 0, sizeof(*scp->recv_buf)); 163 - memset_io(scp->send_buf, 0, sizeof(*scp->send_buf)); 161 + (scp->sram_base + offset + share_buf_offset); 162 + memset_io(scp->recv_buf, 0, share_buf_offset); 163 + memset_io(scp->send_buf, 0, share_buf_offset); 164 164 165 165 return 0; 166 166 } ··· 747 741 static void *mt8183_scp_da_to_va(struct mtk_scp *scp, u64 da, size_t len) 748 742 { 749 743 int offset; 744 + const struct mtk_scp_sizes_data *scp_sizes; 750 745 746 + scp_sizes = scp->data->scp_sizes; 751 747 if (da < scp->sram_size) { 752 748 offset = da; 753 749 if (offset >= 0 && (offset + len) <= scp->sram_size) 754 750 return (void __force *)scp->sram_base + offset; 755 - } else if (scp->dram_size) { 751 + } else if (scp_sizes->max_dram_size) { 756 752 offset = da - scp->dma_addr; 757 - if (offset >= 0 && (offset + len) <= scp->dram_size) 753 + if (offset >= 0 && (offset + len) <= scp_sizes->max_dram_size) 758 754 return scp->cpu_addr + offset; 759 755 } 760 756 ··· 766 758 static void *mt8192_scp_da_to_va(struct mtk_scp *scp, u64 da, size_t len) 767 759 { 768 760 int offset; 761 + const struct mtk_scp_sizes_data *scp_sizes; 769 762 763 + scp_sizes = scp->data->scp_sizes; 770 764 if (da >= scp->sram_phys && 771 765 (da + len) <= scp->sram_phys + scp->sram_size) { 772 766 offset = da - scp->sram_phys; ··· 784 774 } 785 775 786 776 /* optional memory region */ 787 - if (scp->dram_size && 777 + if (scp_sizes->max_dram_size && 788 778 da >= scp->dma_addr && 789 - (da + len) <= scp->dma_addr + scp->dram_size) { 779 + (da + len) <= scp->dma_addr + scp_sizes->max_dram_size) { 790 780 offset = da - scp->dma_addr; 791 781 return scp->cpu_addr + offset; 792 782 } ··· 1007 997 static int scp_map_memory_region(struct mtk_scp *scp) 1008 998 { 1009 999 int ret; 1000 + const struct mtk_scp_sizes_data *scp_sizes; 1010 1001 1011 1002 ret = of_reserved_mem_device_init(scp->dev); 1012 1003 ··· 1023 1012 } 1024 1013 1025 1014 /* Reserved SCP code size */ 1026 - scp->dram_size = MAX_CODE_SIZE; 1027 - scp->cpu_addr = dma_alloc_coherent(scp->dev, scp->dram_size, 1015 + scp_sizes = scp->data->scp_sizes; 1016 + scp->cpu_addr = dma_alloc_coherent(scp->dev, scp_sizes->max_dram_size, 1028 1017 &scp->dma_addr, GFP_KERNEL); 1029 1018 if (!scp->cpu_addr) 1030 1019 return -ENOMEM; ··· 1034 1023 1035 1024 static void scp_unmap_memory_region(struct mtk_scp *scp) 1036 1025 { 1037 - if (scp->dram_size == 0) 1026 + const struct mtk_scp_sizes_data *scp_sizes; 1027 + 1028 + scp_sizes = scp->data->scp_sizes; 1029 + if (scp_sizes->max_dram_size == 0) 1038 1030 return; 1039 1031 1040 - dma_free_coherent(scp->dev, scp->dram_size, scp->cpu_addr, 1032 + dma_free_coherent(scp->dev, scp_sizes->max_dram_size, scp->cpu_addr, 1041 1033 scp->dma_addr); 1042 1034 of_reserved_mem_device_release(scp->dev); 1043 1035 } ··· 1104 1090 struct resource *res; 1105 1091 const char *fw_name = "scp.img"; 1106 1092 int ret, i; 1093 + const struct mtk_scp_sizes_data *scp_sizes; 1107 1094 1108 1095 ret = rproc_of_parse_firmware(dev, 0, &fw_name); 1109 1096 if (ret < 0 && ret != -EINVAL) ··· 1152 1137 goto release_dev_mem; 1153 1138 } 1154 1139 1140 + scp_sizes = scp->data->scp_sizes; 1141 + scp->share_buf = kzalloc(scp_sizes->ipi_share_buffer_size, GFP_KERNEL); 1142 + if (!scp->share_buf) { 1143 + dev_err(dev, "Failed to allocate IPI share buffer\n"); 1144 + goto release_dev_mem; 1145 + } 1146 + 1155 1147 init_waitqueue_head(&scp->run.wq); 1156 1148 init_waitqueue_head(&scp->ack_wq); 1157 1149 ··· 1178 1156 remove_subdev: 1179 1157 scp_remove_rpmsg_subdev(scp); 1180 1158 scp_ipi_unregister(scp, SCP_IPI_INIT); 1159 + kfree(scp->share_buf); 1160 + scp->share_buf = NULL; 1181 1161 release_dev_mem: 1182 1162 scp_unmap_memory_region(scp); 1183 1163 for (i = 0; i < SCP_IPI_MAX; i++) ··· 1195 1171 1196 1172 scp_remove_rpmsg_subdev(scp); 1197 1173 scp_ipi_unregister(scp, SCP_IPI_INIT); 1174 + kfree(scp->share_buf); 1175 + scp->share_buf = NULL; 1198 1176 scp_unmap_memory_region(scp); 1199 1177 for (i = 0; i < SCP_IPI_MAX; i++) 1200 1178 mutex_destroy(&scp->ipi_desc[i].lock); ··· 1383 1357 mutex_destroy(&scp_cluster->cluster_lock); 1384 1358 } 1385 1359 1360 + static const struct mtk_scp_sizes_data default_scp_sizes = { 1361 + .max_dram_size = 0x500000, 1362 + .ipi_share_buffer_size = 288, 1363 + }; 1364 + 1365 + static const struct mtk_scp_sizes_data mt8188_scp_sizes = { 1366 + .max_dram_size = 0x500000, 1367 + .ipi_share_buffer_size = 600, 1368 + }; 1369 + 1370 + static const struct mtk_scp_sizes_data mt8188_scp_c1_sizes = { 1371 + .max_dram_size = 0xA00000, 1372 + .ipi_share_buffer_size = 600, 1373 + }; 1374 + 1386 1375 static const struct mtk_scp_of_data mt8183_of_data = { 1387 1376 .scp_clk_get = mt8183_scp_clk_get, 1388 1377 .scp_before_load = mt8183_scp_before_load, ··· 1409 1368 .host_to_scp_reg = MT8183_HOST_TO_SCP, 1410 1369 .host_to_scp_int_bit = MT8183_HOST_IPC_INT_BIT, 1411 1370 .ipi_buf_offset = 0x7bdb0, 1371 + .scp_sizes = &default_scp_sizes, 1412 1372 }; 1413 1373 1414 1374 static const struct mtk_scp_of_data mt8186_of_data = { ··· 1423 1381 .host_to_scp_reg = MT8183_HOST_TO_SCP, 1424 1382 .host_to_scp_int_bit = MT8183_HOST_IPC_INT_BIT, 1425 1383 .ipi_buf_offset = 0x3bdb0, 1384 + .scp_sizes = &default_scp_sizes, 1426 1385 }; 1427 1386 1428 1387 static const struct mtk_scp_of_data mt8188_of_data = { ··· 1436 1393 .scp_da_to_va = mt8192_scp_da_to_va, 1437 1394 .host_to_scp_reg = MT8192_GIPC_IN_SET, 1438 1395 .host_to_scp_int_bit = MT8192_HOST_IPC_INT_BIT, 1396 + .scp_sizes = &mt8188_scp_sizes, 1439 1397 }; 1440 1398 1441 1399 static const struct mtk_scp_of_data mt8188_of_data_c1 = { ··· 1449 1405 .scp_da_to_va = mt8192_scp_da_to_va, 1450 1406 .host_to_scp_reg = MT8192_GIPC_IN_SET, 1451 1407 .host_to_scp_int_bit = MT8195_CORE1_HOST_IPC_INT_BIT, 1408 + .scp_sizes = &mt8188_scp_c1_sizes, 1452 1409 }; 1453 1410 1454 1411 static const struct mtk_scp_of_data mt8192_of_data = { ··· 1462 1417 .scp_da_to_va = mt8192_scp_da_to_va, 1463 1418 .host_to_scp_reg = MT8192_GIPC_IN_SET, 1464 1419 .host_to_scp_int_bit = MT8192_HOST_IPC_INT_BIT, 1420 + .scp_sizes = &default_scp_sizes, 1465 1421 }; 1466 1422 1467 1423 static const struct mtk_scp_of_data mt8195_of_data = { ··· 1475 1429 .scp_da_to_va = mt8192_scp_da_to_va, 1476 1430 .host_to_scp_reg = MT8192_GIPC_IN_SET, 1477 1431 .host_to_scp_int_bit = MT8192_HOST_IPC_INT_BIT, 1432 + .scp_sizes = &default_scp_sizes, 1478 1433 }; 1479 1434 1480 1435 static const struct mtk_scp_of_data mt8195_of_data_c1 = { ··· 1488 1441 .scp_da_to_va = mt8192_scp_da_to_va, 1489 1442 .host_to_scp_reg = MT8192_GIPC_IN_SET, 1490 1443 .host_to_scp_int_bit = MT8195_CORE1_HOST_IPC_INT_BIT, 1444 + .scp_sizes = &default_scp_sizes, 1491 1445 }; 1492 1446 1493 1447 static const struct mtk_scp_of_data *mt8188_of_data_cores[] = {
+5 -2
drivers/remoteproc/mtk_scp_ipi.c
··· 162 162 struct mtk_share_obj __iomem *send_obj = scp->send_buf; 163 163 u32 val; 164 164 int ret; 165 + const struct mtk_scp_sizes_data *scp_sizes; 166 + 167 + scp_sizes = scp->data->scp_sizes; 165 168 166 169 if (WARN_ON(id <= SCP_IPI_INIT) || WARN_ON(id >= SCP_IPI_MAX) || 167 170 WARN_ON(id == SCP_IPI_NS_SERVICE) || 168 - WARN_ON(len > sizeof(send_obj->share_buf)) || WARN_ON(!buf)) 171 + WARN_ON(len > scp_sizes->ipi_share_buffer_size) || WARN_ON(!buf)) 169 172 return -EINVAL; 170 173 171 174 ret = clk_prepare_enable(scp->clk); ··· 187 184 goto unlock_mutex; 188 185 } 189 186 190 - scp_memcpy_aligned(send_obj->share_buf, buf, len); 187 + scp_memcpy_aligned(&send_obj->share_buf, buf, len); 191 188 192 189 writel(len, &send_obj->len); 193 190 writel(id, &send_obj->id);