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

Merge tag 'arm-soc-fixes-5.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc

Pull ARM SoC fixes from Arnd Bergmann:
"Only a small number of fixes so far, including some that I had applied
during the merge window, so this is based on the original merge of the
other branches.

- The largest change is a fix for a reference counting bug in the AMD
TEE driver.

- Neil Armstrong now co-maintains Amlogic SoC support

- Two build warning fixes for renesas device tree files

- A sign expansion bug for optee

- A DT binding fix for a mismerge"

* tag 'arm-soc-fixes-5.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc:
ARM: npcm: wpcm450: select interrupt controller driver
MAINTAINERS: ARM/Amlogic SoCs: add Neil as primary maintainer
tee: amdtee: unload TA only when its refcount becomes 0
dt-bindings: nvmem: mediatek: remove duplicate mt8192 line
firmware: arm_scmi: Remove duplicate declaration of struct scmi_protocol_handle
firmware: arm_scpi: Prevent the ternary sign expansion bug
arm64: dts: renesas: Add port@0 node for all CSI-2 nodes to dtsi
arm64: dts: renesas: aistarvision-mipi-adapter-2.1: Fix CSI40 ports

+196 -29
-1
Documentation/devicetree/bindings/nvmem/mtk-efuse.txt
··· 9 9 "mediatek,mt8173-efuse" or "mediatek,efuse": for MT8173 10 10 "mediatek,mt8192-efuse", "mediatek,efuse": for MT8192 11 11 "mediatek,mt8516-efuse", "mediatek,efuse": for MT8516 12 - "mediatek,mt8192-efuse", "mediatek,efuse": for MT8192 13 12 - reg: Should contain registers location and length 14 13 15 14 = Data cells =
+1 -1
MAINTAINERS
··· 1618 1618 F: sound/soc/meson/ 1619 1619 1620 1620 ARM/Amlogic Meson SoC support 1621 + M: Neil Armstrong <narmstrong@baylibre.com> 1621 1622 M: Kevin Hilman <khilman@baylibre.com> 1622 - R: Neil Armstrong <narmstrong@baylibre.com> 1623 1623 R: Jerome Brunet <jbrunet@baylibre.com> 1624 1624 R: Martin Blumenstingl <martin.blumenstingl@googlemail.com> 1625 1625 L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+1
arch/arm/mach-npcm/Kconfig
··· 10 10 bool "Support for WPCM450 BMC (Hermon)" 11 11 depends on ARCH_MULTI_V5 12 12 select CPU_ARM926T 13 + select WPCM450_AIC 13 14 select NPCM7XX_TIMER 14 15 help 15 16 General support for WPCM450 BMC (Hermon).
-2
arch/arm64/boot/dts/renesas/hihope-rzg2-ex-aistarvision-mipi-adapter-2.1.dtsi
··· 14 14 15 15 ports { 16 16 port@0 { 17 - reg = <0>; 18 17 csi20_in: endpoint { 19 18 clock-lanes = <0>; 20 19 data-lanes = <1 2>; ··· 28 29 29 30 ports { 30 31 port@0 { 31 - reg = <0>; 32 32 csi40_in: endpoint { 33 33 clock-lanes = <0>; 34 34 data-lanes = <1 2>;
+8
arch/arm64/boot/dts/renesas/r8a774a1.dtsi
··· 2573 2573 #address-cells = <1>; 2574 2574 #size-cells = <0>; 2575 2575 2576 + port@0 { 2577 + reg = <0>; 2578 + }; 2579 + 2576 2580 port@1 { 2577 2581 #address-cells = <1>; 2578 2582 #size-cells = <0>; ··· 2631 2627 ports { 2632 2628 #address-cells = <1>; 2633 2629 #size-cells = <0>; 2630 + 2631 + port@0 { 2632 + reg = <0>; 2633 + }; 2634 2634 2635 2635 port@1 { 2636 2636 #address-cells = <1>;
+8
arch/arm64/boot/dts/renesas/r8a774b1.dtsi
··· 2419 2419 #address-cells = <1>; 2420 2420 #size-cells = <0>; 2421 2421 2422 + port@0 { 2423 + reg = <0>; 2424 + }; 2425 + 2422 2426 port@1 { 2423 2427 #address-cells = <1>; 2424 2428 #size-cells = <0>; ··· 2477 2473 ports { 2478 2474 #address-cells = <1>; 2479 2475 #size-cells = <0>; 2476 + 2477 + port@0 { 2478 + reg = <0>; 2479 + }; 2480 2480 2481 2481 port@1 { 2482 2482 #address-cells = <1>;
+1 -1
arch/arm64/boot/dts/renesas/r8a774c0-ek874-mipi-2.1.dts
··· 33 33 status = "okay"; 34 34 35 35 ports { 36 - port { 36 + port@0 { 37 37 csi40_in: endpoint { 38 38 clock-lanes = <0>; 39 39 data-lanes = <1 2>;
+4
arch/arm64/boot/dts/renesas/r8a774c0.dtsi
··· 1823 1823 #address-cells = <1>; 1824 1824 #size-cells = <0>; 1825 1825 1826 + port@0 { 1827 + reg = <0>; 1828 + }; 1829 + 1826 1830 port@1 { 1827 1831 #address-cells = <1>; 1828 1832 #size-cells = <0>;
+8
arch/arm64/boot/dts/renesas/r8a774e1.dtsi
··· 2709 2709 #address-cells = <1>; 2710 2710 #size-cells = <0>; 2711 2711 2712 + port@0 { 2713 + reg = <0>; 2714 + }; 2715 + 2712 2716 port@1 { 2713 2717 #address-cells = <1>; 2714 2718 #size-cells = <0>; ··· 2767 2763 ports { 2768 2764 #address-cells = <1>; 2769 2765 #size-cells = <0>; 2766 + 2767 + port@0 { 2768 + reg = <0>; 2769 + }; 2770 2770 2771 2771 port@1 { 2772 2772 #address-cells = <1>;
+4
arch/arm64/boot/dts/renesas/r8a77950.dtsi
··· 192 192 #address-cells = <1>; 193 193 #size-cells = <0>; 194 194 195 + port@0 { 196 + reg = <0>; 197 + }; 198 + 195 199 port@1 { 196 200 #address-cells = <1>; 197 201 #size-cells = <0>;
+12
arch/arm64/boot/dts/renesas/r8a77951.dtsi
··· 3097 3097 #address-cells = <1>; 3098 3098 #size-cells = <0>; 3099 3099 3100 + port@0 { 3101 + reg = <0>; 3102 + }; 3103 + 3100 3104 port@1 { 3101 3105 #address-cells = <1>; 3102 3106 #size-cells = <0>; ··· 3156 3152 #address-cells = <1>; 3157 3153 #size-cells = <0>; 3158 3154 3155 + port@0 { 3156 + reg = <0>; 3157 + }; 3158 + 3159 3159 port@1 { 3160 3160 #address-cells = <1>; 3161 3161 #size-cells = <0>; ··· 3198 3190 ports { 3199 3191 #address-cells = <1>; 3200 3192 #size-cells = <0>; 3193 + 3194 + port@0 { 3195 + reg = <0>; 3196 + }; 3201 3197 3202 3198 port@1 { 3203 3199 #address-cells = <1>;
+8
arch/arm64/boot/dts/renesas/r8a77960.dtsi
··· 2761 2761 #address-cells = <1>; 2762 2762 #size-cells = <0>; 2763 2763 2764 + port@0 { 2765 + reg = <0>; 2766 + }; 2767 + 2764 2768 port@1 { 2765 2769 #address-cells = <1>; 2766 2770 #size-cells = <0>; ··· 2819 2815 ports { 2820 2816 #address-cells = <1>; 2821 2817 #size-cells = <0>; 2818 + 2819 + port@0 { 2820 + reg = <0>; 2821 + }; 2822 2822 2823 2823 port@1 { 2824 2824 #address-cells = <1>;
+8
arch/arm64/boot/dts/renesas/r8a77961.dtsi
··· 2499 2499 #address-cells = <1>; 2500 2500 #size-cells = <0>; 2501 2501 2502 + port@0 { 2503 + reg = <0>; 2504 + }; 2505 + 2502 2506 port@1 { 2503 2507 #address-cells = <1>; 2504 2508 #size-cells = <0>; ··· 2557 2553 ports { 2558 2554 #address-cells = <1>; 2559 2555 #size-cells = <0>; 2556 + 2557 + port@0 { 2558 + reg = <0>; 2559 + }; 2560 2560 2561 2561 port@1 { 2562 2562 #address-cells = <1>;
+8
arch/arm64/boot/dts/renesas/r8a77965.dtsi
··· 2575 2575 #address-cells = <1>; 2576 2576 #size-cells = <0>; 2577 2577 2578 + port@0 { 2579 + reg = <0>; 2580 + }; 2581 + 2578 2582 port@1 { 2579 2583 #address-cells = <1>; 2580 2584 #size-cells = <0>; ··· 2633 2629 ports { 2634 2630 #address-cells = <1>; 2635 2631 #size-cells = <0>; 2632 + 2633 + port@0 { 2634 + reg = <0>; 2635 + }; 2636 2636 2637 2637 port@1 { 2638 2638 #address-cells = <1>;
+4
arch/arm64/boot/dts/renesas/r8a77970.dtsi
··· 1106 1106 #address-cells = <1>; 1107 1107 #size-cells = <0>; 1108 1108 1109 + port@0 { 1110 + reg = <0>; 1111 + }; 1112 + 1109 1113 port@1 { 1110 1114 #address-cells = <1>; 1111 1115 #size-cells = <0>;
+8
arch/arm64/boot/dts/renesas/r8a77980.dtsi
··· 1439 1439 #address-cells = <1>; 1440 1440 #size-cells = <0>; 1441 1441 1442 + port@0 { 1443 + reg = <0>; 1444 + }; 1445 + 1442 1446 port@1 { 1443 1447 #address-cells = <1>; 1444 1448 #size-cells = <0>; ··· 1481 1477 ports { 1482 1478 #address-cells = <1>; 1483 1479 #size-cells = <0>; 1480 + 1481 + port@0 { 1482 + reg = <0>; 1483 + }; 1484 1484 1485 1485 port@1 { 1486 1486 #address-cells = <1>;
-2
arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts
··· 298 298 299 299 ports { 300 300 port@0 { 301 - reg = <0>; 302 - 303 301 csi40_in: endpoint { 304 302 clock-lanes = <0>; 305 303 data-lanes = <1 2>;
+4
arch/arm64/boot/dts/renesas/r8a77990.dtsi
··· 1970 1970 #address-cells = <1>; 1971 1971 #size-cells = <0>; 1972 1972 1973 + port@0 { 1974 + reg = <0>; 1975 + }; 1976 + 1973 1977 port@1 { 1974 1978 #address-cells = <1>; 1975 1979 #size-cells = <0>;
-3
arch/arm64/boot/dts/renesas/salvator-common.dtsi
··· 349 349 350 350 ports { 351 351 port@0 { 352 - reg = <0>; 353 352 csi20_in: endpoint { 354 353 clock-lanes = <0>; 355 354 data-lanes = <1>; ··· 363 364 364 365 ports { 365 366 port@0 { 366 - reg = <0>; 367 - 368 367 csi40_in: endpoint { 369 368 clock-lanes = <0>; 370 369 data-lanes = <1 2 3 4>;
-2
drivers/firmware/arm_scmi/notify.h
··· 79 79 80 80 int scmi_notification_init(struct scmi_handle *handle); 81 81 void scmi_notification_exit(struct scmi_handle *handle); 82 - 83 - struct scmi_protocol_handle; 84 82 int scmi_register_protocol_events(const struct scmi_handle *handle, u8 proto_id, 85 83 const struct scmi_protocol_handle *ph, 86 84 const struct scmi_protocol_events *ee);
+3 -1
drivers/firmware/arm_scpi.c
··· 552 552 553 553 ret = scpi_send_message(CMD_GET_CLOCK_VALUE, &le_clk_id, 554 554 sizeof(le_clk_id), &rate, sizeof(rate)); 555 + if (ret) 556 + return 0; 555 557 556 - return ret ? ret : le32_to_cpu(rate); 558 + return le32_to_cpu(rate); 557 559 } 558 560 559 561 static int scpi_clk_set_val(u16 clk_id, unsigned long rate)
+13
drivers/tee/amdtee/amdtee_private.h
··· 21 21 #define TEEC_SUCCESS 0x00000000 22 22 #define TEEC_ERROR_GENERIC 0xFFFF0000 23 23 #define TEEC_ERROR_BAD_PARAMETERS 0xFFFF0006 24 + #define TEEC_ERROR_OUT_OF_MEMORY 0xFFFF000C 24 25 #define TEEC_ERROR_COMMUNICATION 0xFFFF000E 25 26 26 27 #define TEEC_ORIGIN_COMMS 0x00000002 ··· 92 91 struct list_head shm_node; 93 92 void *kaddr; 94 93 u32 buf_id; 94 + }; 95 + 96 + /** 97 + * struct amdtee_ta_data - Keeps track of all TAs loaded in AMD Secure 98 + * Processor 99 + * @ta_handle: Handle to TA loaded in TEE 100 + * @refcount: Reference count for the loaded TA 101 + */ 102 + struct amdtee_ta_data { 103 + struct list_head list_node; 104 + u32 ta_handle; 105 + u32 refcount; 95 106 }; 96 107 97 108 #define LOWER_TWO_BYTE_MASK 0x0000FFFF
+84 -10
drivers/tee/amdtee/call.c
··· 121 121 return ret; 122 122 } 123 123 124 + static DEFINE_MUTEX(ta_refcount_mutex); 125 + static struct list_head ta_list = LIST_HEAD_INIT(ta_list); 126 + 127 + static u32 get_ta_refcount(u32 ta_handle) 128 + { 129 + struct amdtee_ta_data *ta_data; 130 + u32 count = 0; 131 + 132 + /* Caller must hold a mutex */ 133 + list_for_each_entry(ta_data, &ta_list, list_node) 134 + if (ta_data->ta_handle == ta_handle) 135 + return ++ta_data->refcount; 136 + 137 + ta_data = kzalloc(sizeof(*ta_data), GFP_KERNEL); 138 + if (ta_data) { 139 + ta_data->ta_handle = ta_handle; 140 + ta_data->refcount = 1; 141 + count = ta_data->refcount; 142 + list_add(&ta_data->list_node, &ta_list); 143 + } 144 + 145 + return count; 146 + } 147 + 148 + static u32 put_ta_refcount(u32 ta_handle) 149 + { 150 + struct amdtee_ta_data *ta_data; 151 + u32 count = 0; 152 + 153 + /* Caller must hold a mutex */ 154 + list_for_each_entry(ta_data, &ta_list, list_node) 155 + if (ta_data->ta_handle == ta_handle) { 156 + count = --ta_data->refcount; 157 + if (count == 0) { 158 + list_del(&ta_data->list_node); 159 + kfree(ta_data); 160 + break; 161 + } 162 + } 163 + 164 + return count; 165 + } 166 + 124 167 int handle_unload_ta(u32 ta_handle) 125 168 { 126 169 struct tee_cmd_unload_ta cmd = {0}; 127 - u32 status; 170 + u32 status, count; 128 171 int ret; 129 172 130 173 if (!ta_handle) 131 174 return -EINVAL; 175 + 176 + mutex_lock(&ta_refcount_mutex); 177 + 178 + count = put_ta_refcount(ta_handle); 179 + 180 + if (count) { 181 + pr_debug("unload ta: not unloading %u count %u\n", 182 + ta_handle, count); 183 + ret = -EBUSY; 184 + goto unlock; 185 + } 132 186 133 187 cmd.ta_handle = ta_handle; 134 188 ··· 191 137 if (!ret && status != 0) { 192 138 pr_err("unload ta: status = 0x%x\n", status); 193 139 ret = -EBUSY; 140 + } else { 141 + pr_debug("unloaded ta handle %u\n", ta_handle); 194 142 } 195 143 144 + unlock: 145 + mutex_unlock(&ta_refcount_mutex); 196 146 return ret; 197 147 } 198 148 ··· 398 340 399 341 int handle_load_ta(void *data, u32 size, struct tee_ioctl_open_session_arg *arg) 400 342 { 401 - struct tee_cmd_load_ta cmd = {0}; 343 + struct tee_cmd_unload_ta unload_cmd = {}; 344 + struct tee_cmd_load_ta load_cmd = {}; 402 345 phys_addr_t blob; 403 346 int ret; 404 347 ··· 412 353 return -EINVAL; 413 354 } 414 355 415 - cmd.hi_addr = upper_32_bits(blob); 416 - cmd.low_addr = lower_32_bits(blob); 417 - cmd.size = size; 356 + load_cmd.hi_addr = upper_32_bits(blob); 357 + load_cmd.low_addr = lower_32_bits(blob); 358 + load_cmd.size = size; 418 359 419 - ret = psp_tee_process_cmd(TEE_CMD_ID_LOAD_TA, (void *)&cmd, 420 - sizeof(cmd), &arg->ret); 360 + mutex_lock(&ta_refcount_mutex); 361 + 362 + ret = psp_tee_process_cmd(TEE_CMD_ID_LOAD_TA, (void *)&load_cmd, 363 + sizeof(load_cmd), &arg->ret); 421 364 if (ret) { 422 365 arg->ret_origin = TEEC_ORIGIN_COMMS; 423 366 arg->ret = TEEC_ERROR_COMMUNICATION; 424 - } else { 425 - set_session_id(cmd.ta_handle, 0, &arg->session); 367 + } else if (arg->ret == TEEC_SUCCESS) { 368 + ret = get_ta_refcount(load_cmd.ta_handle); 369 + if (!ret) { 370 + arg->ret_origin = TEEC_ORIGIN_COMMS; 371 + arg->ret = TEEC_ERROR_OUT_OF_MEMORY; 372 + 373 + /* Unload the TA on error */ 374 + unload_cmd.ta_handle = load_cmd.ta_handle; 375 + psp_tee_process_cmd(TEE_CMD_ID_UNLOAD_TA, 376 + (void *)&unload_cmd, 377 + sizeof(unload_cmd), &ret); 378 + } else { 379 + set_session_id(load_cmd.ta_handle, 0, &arg->session); 380 + } 426 381 } 382 + mutex_unlock(&ta_refcount_mutex); 427 383 428 384 pr_debug("load TA: TA handle = 0x%x, RO = 0x%x, ret = 0x%x\n", 429 - cmd.ta_handle, arg->ret_origin, arg->ret); 385 + load_cmd.ta_handle, arg->ret_origin, arg->ret); 430 386 431 387 return 0; 432 388 }
+9 -6
drivers/tee/amdtee/core.c
··· 59 59 continue; 60 60 61 61 handle_close_session(sess->ta_handle, sess->session_info[i]); 62 + handle_unload_ta(sess->ta_handle); 62 63 } 63 64 64 - /* Unload Trusted Application once all sessions are closed */ 65 - handle_unload_ta(sess->ta_handle); 66 65 kfree(sess); 67 66 } 68 67 ··· 223 224 struct amdtee_session *sess = container_of(ref, struct amdtee_session, 224 225 refcount); 225 226 226 - /* Unload the TA from TEE */ 227 - handle_unload_ta(sess->ta_handle); 228 227 mutex_lock(&session_list_mutex); 229 228 list_del(&sess->list_node); 230 229 mutex_unlock(&session_list_mutex); ··· 235 238 { 236 239 struct amdtee_context_data *ctxdata = ctx->data; 237 240 struct amdtee_session *sess = NULL; 238 - u32 session_info; 241 + u32 session_info, ta_handle; 239 242 size_t ta_size; 240 243 int rc, i; 241 244 void *ta; ··· 256 259 if (arg->ret != TEEC_SUCCESS) 257 260 goto out; 258 261 262 + ta_handle = get_ta_handle(arg->session); 263 + 259 264 mutex_lock(&session_list_mutex); 260 265 sess = alloc_session(ctxdata, arg->session); 261 266 mutex_unlock(&session_list_mutex); 262 267 263 268 if (!sess) { 269 + handle_unload_ta(ta_handle); 264 270 rc = -ENOMEM; 265 271 goto out; 266 272 } ··· 277 277 278 278 if (i >= TEE_NUM_SESSIONS) { 279 279 pr_err("reached maximum session count %d\n", TEE_NUM_SESSIONS); 280 + handle_unload_ta(ta_handle); 280 281 kref_put(&sess->refcount, destroy_session); 281 282 rc = -ENOMEM; 282 283 goto out; ··· 290 289 spin_lock(&sess->lock); 291 290 clear_bit(i, sess->sess_mask); 292 291 spin_unlock(&sess->lock); 292 + handle_unload_ta(ta_handle); 293 293 kref_put(&sess->refcount, destroy_session); 294 294 goto out; 295 295 } 296 296 297 297 sess->session_info[i] = session_info; 298 - set_session_id(sess->ta_handle, i, &arg->session); 298 + set_session_id(ta_handle, i, &arg->session); 299 299 out: 300 300 free_pages((u64)ta, get_order(ta_size)); 301 301 return rc; ··· 331 329 332 330 /* Close the session */ 333 331 handle_close_session(ta_handle, session_info); 332 + handle_unload_ta(ta_handle); 334 333 335 334 kref_put(&sess->refcount, destroy_session); 336 335