From 19b9c3dad90198cfbbf6b5158a38889dd5732856 Mon Sep 17 00:00:00 2001 From: ArturX Kloniecki Date: Thu, 30 Jan 2020 13:19:03 +0100 Subject: [PATCH 1/2] probes: Add extended boot data regarding probes support. Create compile-time section .fw_ready_metadata and append it to .fw_ready with linker. Signed-off-by: ArturX Kloniecki --- src/include/ipc/info.h | 12 ++++++++++++ src/include/sof/fw-ready-metadata.h | 15 +++++++++++++++ src/ipc/CMakeLists.txt | 5 ++++- src/ipc/probe_support.c | 22 ++++++++++++++++++++++ src/platform/apollolake/apollolake.x.in | 1 + src/platform/baytrail/baytrail.x.in | 1 + src/platform/baytrail/platform.c | 5 +++++ src/platform/cannonlake/cannonlake.x.in | 1 + src/platform/haswell/haswell.x.in | 1 + src/platform/haswell/platform.c | 5 +++++ src/platform/icelake/icelake.x.in | 1 + src/platform/imx8/imx8.x.in | 1 + src/platform/imx8/platform.c | 5 +++++ src/platform/imx8m/imx8m.x.in | 1 + src/platform/imx8m/platform.c | 5 +++++ src/platform/intel/cavs/platform.c | 5 +++++ src/platform/suecreek/suecreek.x.in | 1 + src/platform/tigerlake/tigerlake.x.in | 1 + 18 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 src/include/sof/fw-ready-metadata.h create mode 100644 src/ipc/probe_support.c diff --git a/src/include/ipc/info.h b/src/include/ipc/info.h index 1f1d32a9a5f3..ff1bdf2682f2 100644 --- a/src/include/ipc/info.h +++ b/src/include/ipc/info.h @@ -39,6 +39,7 @@ enum sof_ipc_ext_data { SOF_IPC_EXT_DMA_BUFFER = 0, SOF_IPC_EXT_WINDOW, SOF_IPC_EXT_CC_INFO, + SOF_IPC_EXT_PROBE_INFO, }; /* FW version - SOF_IPC_GLB_VERSION */ @@ -139,6 +140,17 @@ struct sof_ipc_cc_version { char desc[]; /* null terminated compiler description */ } __attribute__((packed)); +/* extended data: Probe setup */ +struct sof_ipc_probe_support { + struct sof_ipc_ext_data_hdr ext_hdr; + + uint32_t probe_points_max; + uint32_t injection_dmas_max; + + /* reserved for future use */ + uint32_t reserved[2]; +} __attribute__((packed)); + extern const struct sof_ipc_cc_version cc_version; #endif /* __IPC_INFO_H__ */ diff --git a/src/include/sof/fw-ready-metadata.h b/src/include/sof/fw-ready-metadata.h new file mode 100644 index 000000000000..e3e88e861a9a --- /dev/null +++ b/src/include/sof/fw-ready-metadata.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * + * Copyright(c) 2020 Intel Corporation. All rights reserved. + * + * Author: Artur Kloniecki + */ + +#ifndef __IPC_FW_READY_METADATA_H__ +#define __IPC_FW_READY_METADATA_H__ + +#include + +extern const struct sof_ipc_probe_support probe_support; + +#endif /* __IPC_FW_READY_METADATA_H__ */ diff --git a/src/ipc/CMakeLists.txt b/src/ipc/CMakeLists.txt index 35687c1877cb..d81aa40bf474 100644 --- a/src/ipc/CMakeLists.txt +++ b/src/ipc/CMakeLists.txt @@ -35,6 +35,9 @@ set_property(TARGET data_structs APPEND PROPERTY COMPILE_DEFINITIONS CC_OPTIMIZE_FLAGS="${optimization_flag}") -add_local_sources(data_structs cc_version.c) +add_local_sources(data_structs + cc_version.c + probe_support.c) + target_link_libraries(data_structs sof_options) target_link_libraries(sof_static_libraries INTERFACE data_structs) diff --git a/src/ipc/probe_support.c b/src/ipc/probe_support.c new file mode 100644 index 000000000000..de06c8d7d132 --- /dev/null +++ b/src/ipc/probe_support.c @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: BSD-3-Clause +// +// Copyright(c) 2020 Intel Corporation. All rights reserved. +// +// Author: Artur Kloniecki + +#include +#include +#include + +const struct sof_ipc_probe_support probe_support + __attribute__((section(".fw_ready_metadata"))) = { + .ext_hdr = { + .hdr.cmd = SOF_IPC_FW_READY, + .hdr.size = sizeof(struct sof_ipc_probe_support), + .type = SOF_IPC_EXT_PROBE_INFO, + }, +#if CONFIG_PROBE + .probe_points_max = CONFIG_PROBE_POINTS_MAX, + .injection_dmas_max = CONFIG_PROBE_DMA_MAX +#endif +}; diff --git a/src/platform/apollolake/apollolake.x.in b/src/platform/apollolake/apollolake.x.in index dc8a6aa067c4..24e24bdbf6b3 100644 --- a/src/platform/apollolake/apollolake.x.in +++ b/src/platform/apollolake/apollolake.x.in @@ -451,6 +451,7 @@ SECTIONS .fw_ready : ALIGN(4) { KEEP (*(.fw_ready)) + KEEP (*(.fw_ready_metadata)) } >sof_fw :sof_fw_phdr .bss (NOLOAD) : ALIGN(4096) diff --git a/src/platform/baytrail/baytrail.x.in b/src/platform/baytrail/baytrail.x.in index 41d2c2e05139..96cf98e6d4db 100644 --- a/src/platform/baytrail/baytrail.x.in +++ b/src/platform/baytrail/baytrail.x.in @@ -537,5 +537,6 @@ SECTIONS .fw_ready : ALIGN(4) { KEEP (*(.fw_ready)) + KEEP (*(.fw_ready_metadata)) } >sof_data :sof_data_phdr } diff --git a/src/platform/baytrail/platform.c b/src/platform/baytrail/platform.c index f3623b00d96c..35268e0c5a4e 100644 --- a/src/platform/baytrail/platform.c +++ b/src/platform/baytrail/platform.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -139,6 +140,10 @@ int platform_boot_complete(uint32_t boot_message) /* variable length compiler description is a last field of cc_version */ mailbox_dspbox_write(mb_offset, &cc_version, cc_version.ext_hdr.hdr.size); + mb_offset = mb_offset + cc_version.ext_hdr.hdr.size; + + mailbox_dspbox_write(mb_offset, &probe_support, + probe_support.ext_hdr.hdr.size); /* now interrupt host to tell it we are done booting */ shim_write(SHIM_IPCDL, SOF_IPC_FW_READY | outbox); diff --git a/src/platform/cannonlake/cannonlake.x.in b/src/platform/cannonlake/cannonlake.x.in index e407f39e9aec..97513677ec33 100644 --- a/src/platform/cannonlake/cannonlake.x.in +++ b/src/platform/cannonlake/cannonlake.x.in @@ -415,6 +415,7 @@ SECTIONS .fw_ready : ALIGN(4) { KEEP (*(.fw_ready)) + KEEP (*(.fw_ready_metadata)) } >sof_fw :sof_fw_phdr .bss (NOLOAD) : ALIGN(4096) diff --git a/src/platform/haswell/haswell.x.in b/src/platform/haswell/haswell.x.in index 8ff8618d5bb2..e500115b68f9 100644 --- a/src/platform/haswell/haswell.x.in +++ b/src/platform/haswell/haswell.x.in @@ -562,5 +562,6 @@ SECTIONS .fw_ready : ALIGN(4) { KEEP (*(.fw_ready)) + KEEP (*(.fw_ready_metadata)) } >sof_data :sof_data_phdr } diff --git a/src/platform/haswell/platform.c b/src/platform/haswell/platform.c index 2831c8018f39..e1057e613458 100644 --- a/src/platform/haswell/platform.c +++ b/src/platform/haswell/platform.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -135,6 +136,10 @@ int platform_boot_complete(uint32_t boot_message) /* variable length compiler description is a last field of cc_version */ mailbox_dspbox_write(mb_offset, &cc_version, cc_version.ext_hdr.hdr.size); + mb_offset = mb_offset + cc_version.ext_hdr.hdr.size; + + mailbox_dspbox_write(mb_offset, &probe_support, + probe_support.ext_hdr.hdr.size); /* now interrupt host to tell it we are done booting */ shim_write(SHIM_IPCD, outbox | SHIM_IPCD_BUSY); diff --git a/src/platform/icelake/icelake.x.in b/src/platform/icelake/icelake.x.in index 5e651e7a3581..c865976ecd2e 100644 --- a/src/platform/icelake/icelake.x.in +++ b/src/platform/icelake/icelake.x.in @@ -418,6 +418,7 @@ SECTIONS .fw_ready : ALIGN(4) { KEEP (*(.fw_ready)) + KEEP (*(.fw_ready_metadata)) } >sof_fw :sof_fw_phdr .bss (NOLOAD) : ALIGN(4096) diff --git a/src/platform/imx8/imx8.x.in b/src/platform/imx8/imx8.x.in index 88be152dd489..bc8d412fac9c 100644 --- a/src/platform/imx8/imx8.x.in +++ b/src/platform/imx8/imx8.x.in @@ -501,5 +501,6 @@ SECTIONS .fw_ready : ALIGN(4) { KEEP (*(.fw_ready)) + KEEP (*(.fw_ready_metadata)) } >sof_sdram0 :sof_sdram0_phdr } diff --git a/src/platform/imx8/platform.c b/src/platform/imx8/platform.c index bbd819e16efb..a07197138eea 100644 --- a/src/platform/imx8/platform.c +++ b/src/platform/imx8/platform.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -133,6 +134,10 @@ int platform_boot_complete(uint32_t boot_message) /* variable length compiler description is a last field of cc_version */ mailbox_dspbox_write(mb_offset, &cc_version, cc_version.ext_hdr.hdr.size); + mb_offset = mb_offset + cc_version.ext_hdr.hdr.size; + + mailbox_dspbox_write(mb_offset, &probe_support, + probe_support.ext_hdr.hdr.size); /* now interrupt host to tell it we are done booting */ imx_mu_xcr_rmw(IMX_MU_xCR_GIRn(1), 0); diff --git a/src/platform/imx8m/imx8m.x.in b/src/platform/imx8m/imx8m.x.in index 1e8d18ab998a..c40e9fbde244 100644 --- a/src/platform/imx8m/imx8m.x.in +++ b/src/platform/imx8m/imx8m.x.in @@ -501,5 +501,6 @@ SECTIONS .fw_ready : ALIGN(4) { KEEP (*(.fw_ready)) + KEEP (*(.fw_ready_metadata)) } >sof_sdram0 :sof_sdram0_phdr } diff --git a/src/platform/imx8m/platform.c b/src/platform/imx8m/platform.c index 87040a18891f..5c20031a8824 100644 --- a/src/platform/imx8m/platform.c +++ b/src/platform/imx8m/platform.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -132,6 +133,10 @@ int platform_boot_complete(uint32_t boot_message) /* variable length compiler description is a last field of cc_version */ mailbox_dspbox_write(mb_offset, &cc_version, cc_version.ext_hdr.hdr.size); + mb_offset = mb_offset + cc_version.ext_hdr.hdr.size; + + mailbox_dspbox_write(mb_offset, &probe_support, + probe_support.ext_hdr.hdr.size); /* now interrupt host to tell it we are done booting */ imx_mu_xcr_rmw(IMX_MU_xCR_GIRn(1), 0); diff --git a/src/platform/intel/cavs/platform.c b/src/platform/intel/cavs/platform.c index f179c529564f..d435a6f3fb47 100644 --- a/src/platform/intel/cavs/platform.c +++ b/src/platform/intel/cavs/platform.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -300,6 +301,10 @@ int platform_boot_complete(uint32_t boot_message) /* variable length compiler description is a last field of cc_version */ mailbox_dspbox_write(mb_offset, &cc_version, cc_version.ext_hdr.hdr.size); + mb_offset = mb_offset + cc_version.ext_hdr.hdr.size; + + mailbox_dspbox_write(mb_offset, &probe_support, + probe_support.ext_hdr.hdr.size); /* tell host we are ready */ #if CAVS_VERSION == CAVS_VERSION_1_5 diff --git a/src/platform/suecreek/suecreek.x.in b/src/platform/suecreek/suecreek.x.in index 06d0d0dd9573..19ae3c7f1e62 100644 --- a/src/platform/suecreek/suecreek.x.in +++ b/src/platform/suecreek/suecreek.x.in @@ -417,6 +417,7 @@ SECTIONS .fw_ready : ALIGN(4) { KEEP (*(.fw_ready)) + KEEP (*(.fw_ready_metadata)) } >sof_fw :sof_fw_phdr .bss (NOLOAD) : ALIGN(4096) diff --git a/src/platform/tigerlake/tigerlake.x.in b/src/platform/tigerlake/tigerlake.x.in index 214d42783628..dc0f31fab9f5 100644 --- a/src/platform/tigerlake/tigerlake.x.in +++ b/src/platform/tigerlake/tigerlake.x.in @@ -430,6 +430,7 @@ SECTIONS .fw_ready : ALIGN(4) { KEEP (*(.fw_ready)) + KEEP (*(.fw_ready_metadata)) } >sof_fw :sof_fw_phdr .bss (NOLOAD) : ALIGN(4096) From db12b2c3f56282cd8d784ce2d6673dc1646225ee Mon Sep 17 00:00:00 2001 From: ArturX Kloniecki Date: Wed, 5 Feb 2020 15:41:59 +0100 Subject: [PATCH 2/2] boot metadata: Move mem window and cc version info to .fw_ready section. Move extended boot metadata structures to compile-time section .fw_ready_metadata which is appended to .fw_ready section of binary. Signed-off-by: ArturX Kloniecki --- src/include/ipc/info.h | 2 -- src/include/sof/fw-ready-metadata.h | 1 + src/ipc/cc_version.c | 4 +++- src/platform/baytrail/platform.c | 3 ++- src/platform/haswell/platform.c | 3 ++- src/platform/imx8/platform.c | 3 ++- src/platform/imx8m/platform.c | 3 ++- src/platform/intel/cavs/platform.c | 3 ++- 8 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/include/ipc/info.h b/src/include/ipc/info.h index ff1bdf2682f2..8cccd3da3695 100644 --- a/src/include/ipc/info.h +++ b/src/include/ipc/info.h @@ -151,6 +151,4 @@ struct sof_ipc_probe_support { uint32_t reserved[2]; } __attribute__((packed)); -extern const struct sof_ipc_cc_version cc_version; - #endif /* __IPC_INFO_H__ */ diff --git a/src/include/sof/fw-ready-metadata.h b/src/include/sof/fw-ready-metadata.h index e3e88e861a9a..1a1591f71dc3 100644 --- a/src/include/sof/fw-ready-metadata.h +++ b/src/include/sof/fw-ready-metadata.h @@ -10,6 +10,7 @@ #include +extern const struct sof_ipc_cc_version cc_version; extern const struct sof_ipc_probe_support probe_support; #endif /* __IPC_FW_READY_METADATA_H__ */ diff --git a/src/ipc/cc_version.c b/src/ipc/cc_version.c index 0a6618296352..882fc6f3fdc1 100644 --- a/src/ipc/cc_version.c +++ b/src/ipc/cc_version.c @@ -5,6 +5,7 @@ // Author: Karol Trzcinski #include +#include #include #include @@ -18,7 +19,8 @@ field = CC_OPTIMIZE_FLAGS, \ field[ARRAY_SIZE(((struct sof_ipc_cc_version *)(0))->optim) - 1] = 0 -const struct sof_ipc_cc_version cc_version = { +const struct sof_ipc_cc_version cc_version + __attribute__((section(".fw_ready_metadata"))) = { .ext_hdr = { .hdr.cmd = SOF_IPC_FW_READY, .hdr.size = sizeof(struct sof_ipc_cc_version) diff --git a/src/platform/baytrail/platform.c b/src/platform/baytrail/platform.c index 35268e0c5a4e..8bcbbd4c825a 100644 --- a/src/platform/baytrail/platform.c +++ b/src/platform/baytrail/platform.c @@ -66,7 +66,8 @@ static const struct sof_ipc_fw_ready ready }; #define NUM_BYT_WINDOWS 6 -static const struct sof_ipc_window sram_window = { +static const struct sof_ipc_window sram_window + __attribute__((section(".fw_ready_metadata"))) = { .ext_hdr = { .hdr.cmd = SOF_IPC_FW_READY, .hdr.size = sizeof(struct sof_ipc_window) + diff --git a/src/platform/haswell/platform.c b/src/platform/haswell/platform.c index e1057e613458..91c6d3988f31 100644 --- a/src/platform/haswell/platform.c +++ b/src/platform/haswell/platform.c @@ -62,7 +62,8 @@ static const struct sof_ipc_fw_ready ready }; #define NUM_HSW_WINDOWS 6 -static const struct sof_ipc_window sram_window = { +static const struct sof_ipc_window sram_window + __attribute__((section(".fw_ready_metadata"))) = { .ext_hdr = { .hdr.cmd = SOF_IPC_FW_READY, .hdr.size = sizeof(struct sof_ipc_window) + diff --git a/src/platform/imx8/platform.c b/src/platform/imx8/platform.c index a07197138eea..9bef7c599d29 100644 --- a/src/platform/imx8/platform.c +++ b/src/platform/imx8/platform.c @@ -61,7 +61,8 @@ static const struct sof_ipc_fw_ready ready #define NUM_IMX_WINDOWS 6 -static const struct sof_ipc_window sram_window = { +static const struct sof_ipc_window sram_window + __attribute__((section(".fw_ready_metadata"))) = { .ext_hdr = { .hdr.cmd = SOF_IPC_FW_READY, .hdr.size = sizeof(struct sof_ipc_window) + diff --git a/src/platform/imx8m/platform.c b/src/platform/imx8m/platform.c index 5c20031a8824..f28bd422d0f5 100644 --- a/src/platform/imx8m/platform.c +++ b/src/platform/imx8m/platform.c @@ -60,7 +60,8 @@ static const struct sof_ipc_fw_ready ready #define NUM_IMX_WINDOWS 6 -static const struct sof_ipc_window sram_window = { +static const struct sof_ipc_window sram_window + __attribute__((section(".fw_ready_metadata"))) = { .ext_hdr = { .hdr.cmd = SOF_IPC_FW_READY, .hdr.size = sizeof(struct sof_ipc_window) + diff --git a/src/platform/intel/cavs/platform.c b/src/platform/intel/cavs/platform.c index d435a6f3fb47..7298110e2af3 100644 --- a/src/platform/intel/cavs/platform.c +++ b/src/platform/intel/cavs/platform.c @@ -76,7 +76,8 @@ static const struct sof_ipc_fw_ready ready #define NUM_WINDOWS 7 -static const struct sof_ipc_window sram_window = { +static const struct sof_ipc_window sram_window + __attribute__((section(".fw_ready_metadata"))) = { .ext_hdr = { .hdr.cmd = SOF_IPC_FW_READY, .hdr.size = sizeof(struct sof_ipc_window) +