diff options
Diffstat (limited to 'meta-agl-bsp')
145 files changed, 581 insertions, 8823 deletions
diff --git a/meta-agl-bsp/README b/meta-agl-bsp/README index 3c3d23af8..69ca72c9d 100644 --- a/meta-agl-bsp/README +++ b/meta-agl-bsp/README @@ -5,3 +5,15 @@ This layer holds the 'impedance-mismatch' between AGL and the BSP's. /dream on In an ideal world, this would be empty! /dream off + +Maintenance +----------- + +All patches must be submitted via the AGL Gerrit instance at +https://gerrit.automotivelinux.org. See this wiki page for +details: + +https://wiki.automotivelinux.org/agl-distro/contributing + +Layer maintainers: + Jan-Simon Möller <jsmoeller@linuxfoundation.org> diff --git a/meta-agl-bsp/conf/include/agl_am62xx-evm.inc b/meta-agl-bsp/conf/include/agl_am62xx-evm.inc new file mode 100644 index 000000000..24fd95141 --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_am62xx-evm.inc @@ -0,0 +1,8 @@ +# am62xx-evm has a k3r5 BBMULTICONFIG to build its bootloader +# firmware, need to use an override to set DEFAULTTUNE back to +# what that machine configuration needs. +DEFAULTTUNE:k3r5:forcedefaulttune = "armv7athf" + +# meta-ti-bsp layer conf does break expectations wrt common folders +# meta-ti-bsp/conf/layer.conf:TI_COMMON_DEPLOY ?= "${TOPDIR}/deploy-ti" +TI_COMMON_DEPLOY := "${TMPDIR}/deploy" diff --git a/meta-agl-bsp/conf/include/agl_bbe.inc b/meta-agl-bsp/conf/include/agl_bbe.inc index 9f9eb5039..5252c558b 100644 --- a/meta-agl-bsp/conf/include/agl_bbe.inc +++ b/meta-agl-bsp/conf/include/agl_bbe.inc @@ -6,26 +6,6 @@ CORE_IMAGE_EXTRA_INSTALL += "packagegroup-machine-base" #------------------------------------------------- -## Graphics section ## -#------------------------------------------------- -PACKAGES_GFX = "ti-sgx-ddk-km" -IMAGE_INSTALL:append = " ${PACKAGES_GFX}" - - -# Enable Gfx Pkgs -MACHINE_FEATURES:append = " sgx" -MULTI_PROVIDER_WHITELIST += "virtual/libgl virtual/egl virtual/libgles1 virtual/libgles2" - -DEPENDS:remove = "virtual/libgl" - -# Preferred providers -PREFERRED_PROVIDER_virtual/libgles1 = "" -PREFERRED_PROVIDER_virtual/libgles2 = "ti-sgx-ddk-um" -PREFERRED_PROVIDER_virtual/egl = "ti-sgx-ddk-um" -PREFERRED_PROVIDER_virtual/libgbm = "ti-sgx-ddk-um" -PREFERRED_PROVIDER_virtual/mesa = "mesa-gl" - -#------------------------------------------------- ## Multimedia section ## #------------------------------------------------- @@ -38,3 +18,7 @@ SECURITY_CFLAGS:pn-gpm = "" SECURITY_LDFLAGS:pn-gpm = "" SECURITY_CFLAGS:pn-libatasmart = "" SECURITY_LDFLAGS:pn-libatasmart = "" + +# meta-ti-bsp layer conf does break expectations wrt common folders +# meta-ti-bsp/conf/layer.conf:TI_COMMON_DEPLOY ?= "${TOPDIR}/deploy-ti" +TI_COMMON_DEPLOY := "${TMPDIR}/deploy"
\ No newline at end of file diff --git a/meta-agl-bsp/conf/include/agl_beaglebone-ai64.inc b/meta-agl-bsp/conf/include/agl_beaglebone-ai64.inc new file mode 100644 index 000000000..1e03b70ff --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_beaglebone-ai64.inc @@ -0,0 +1,6 @@ +# beaglebone-ai64 has a k3r5 BBMULTICONFIG to build its bootloader +# and firmware, need to use an override to set DEFAULTTUNE back to +# what that machine configuration needs. +DEFAULTTUNE:k3r5:forcedefaulttune = "armv7athf" + +TI_COMMON_DEPLOY := "${TMPDIR}/deploy" diff --git a/meta-agl-bsp/conf/include/agl_beaglebone.inc b/meta-agl-bsp/conf/include/agl_beaglebone.inc index 857a801f3..ec3a3a448 100644 --- a/meta-agl-bsp/conf/include/agl_beaglebone.inc +++ b/meta-agl-bsp/conf/include/agl_beaglebone.inc @@ -1,40 +1,10 @@ # This config is for the beaglebone (inspired from the vayu config). -#------------------------------------------------- -## Graphics section ## -#------------------------------------------------- -PACKAGES_GFX = "ti-sgx-ddk-km" -IMAGE_INSTALL:append = " ${PACKAGES_GFX}" - - -# Enable Gfx Pkgs -MACHINE_FEATURES:append = " sgx" -MULTI_PROVIDER_WHITELIST += "virtual/libgl virtual/egl virtual/libgles1 virtual/libgles2" - -DEPENDS:remove = "virtual/libgl" - -# Preferred providers -PREFERRED_PROVIDER_virtual/libgles1 = "" -PREFERRED_PROVIDER_virtual/libgles2 = "ti-sgx-ddk-um" -PREFERRED_PROVIDER_virtual/egl = "ti-sgx-ddk-um" -PREFERRED_PROVIDER_virtual/libgbm = "ti-sgx-ddk-um" -PREFERRED_PROVIDER_virtual/mesa = "mesa-gl" - -#------------------------------------------------- -## Multimedia section ## -#------------------------------------------------- - -PREFERRED_PROVIDER_virtual/kernel = "linux-ti-staging" -PREFERRED_VERSION_virtual/kernel = "4.9" - # DEFAULTTUNE for cortex-a8 DISTRO_FEATURES:append = " agl-medium-arm-compiler" -SECURITY_CFLAGS:pn-mozjs = "" -SECURITY_LDFLAGS:pn-mozjs = "" -SECURITY_CFLAGS:pn-gpm = "" -SECURITY_LDFLAGS:pn-gpm = "" -SECURITY_CFLAGS:pn-libatasmart = "" -SECURITY_LDFLAGS:pn-libatasmart = "" - WKS_FILE = "sdimage-bootpart-uuid.wks" + +# meta-ti-bsp layer conf does break expectations wrt common folders +# meta-ti-bsp/conf/layer.conf:TI_COMMON_DEPLOY ?= "${TOPDIR}/deploy-ti" +TI_COMMON_DEPLOY := "${TMPDIR}/deploy"
\ No newline at end of file diff --git a/meta-agl-bsp/conf/include/agl_beagleplay.inc b/meta-agl-bsp/conf/include/agl_beagleplay.inc new file mode 100644 index 000000000..77b669bb7 --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_beagleplay.inc @@ -0,0 +1,6 @@ +# beagleplay has a k3r5 BBMULTICONFIG to build its bootloader +# and firmware, need to use an override to set DEFAULTTUNE back to +# what that machine configuration needs. +DEFAULTTUNE:k3r5:forcedefaulttune = "armv7athf" + +TI_COMMON_DEPLOY := "${TMPDIR}/deploy" diff --git a/meta-agl-bsp/conf/include/agl_cubox-i.inc b/meta-agl-bsp/conf/include/agl_cubox-i.inc index 4fa4815a4..fc0e14b5f 100644 --- a/meta-agl-bsp/conf/include/agl_cubox-i.inc +++ b/meta-agl-bsp/conf/include/agl_cubox-i.inc @@ -1,11 +1,21 @@ require agl_imx6-common.inc +# Temporary fix for upstream breakage +# Note that the :cubox-i override is needed because we're +# overriding a definition done in the machine .conf. +KERNEL_DEVICETREE:cubox-i = " \ + nxp/imx/imx6dl-cubox-i.dtb \ + nxp/imx/imx6q-cubox-i.dtb \ + nxp/imx/imx6dl-hummingboard.dtb \ + nxp/imx/imx6q-hummingboard.dtb \ +" + # Include devicetrees for SOM 1.5 and Hummingboard 2 hardware KERNEL_DEVICETREE:append = " \ - imx6dl-hummingboard-som-v15.dtb \ - imx6q-hummingboard-som-v15.dtb \ - imx6dl-hummingboard2.dtb \ - imx6q-hummingboard2.dtb \ - imx6dl-hummingboard2-som-v15.dtb \ - imx6q-hummingboard2-som-v15.dtb \ + nxp/imx/imx6dl-hummingboard-som-v15.dtb \ + nxp/imx/imx6q-hummingboard-som-v15.dtb \ + nxp/imx/imx6dl-hummingboard2.dtb \ + nxp/imx/imx6q-hummingboard2.dtb \ + nxp/imx/imx6dl-hummingboard2-som-v15.dtb \ + nxp/imx/imx6q-hummingboard2-som-v15.dtb \ " diff --git a/meta-agl-bsp/conf/include/agl_dragonboard-410c.inc b/meta-agl-bsp/conf/include/agl_dragonboard-410c.inc deleted file mode 100644 index aba92ddf1..000000000 --- a/meta-agl-bsp/conf/include/agl_dragonboard-410c.inc +++ /dev/null @@ -1,3 +0,0 @@ -# Install 96boards-tools for resizing partition -# Add systemd unit file for the qcom_q6v5_pil kernel module -IMAGE_INSTALL:append = " 96boards-tools q6v5-pil" diff --git a/meta-agl-bsp/conf/include/agl_dragonboard-820c.inc b/meta-agl-bsp/conf/include/agl_dragonboard-820c.inc deleted file mode 100644 index 265564c18..000000000 --- a/meta-agl-bsp/conf/include/agl_dragonboard-820c.inc +++ /dev/null @@ -1,2 +0,0 @@ -# Install 96boards-tools for resizing partition -IMAGE_INSTALL:append = " 96boards-tools" diff --git a/meta-agl-bsp/conf/include/agl_ebisu.inc b/meta-agl-bsp/conf/include/agl_ebisu.inc index 0d10b3130..d684f814d 100644 --- a/meta-agl-bsp/conf/include/agl_ebisu.inc +++ b/meta-agl-bsp/conf/include/agl_ebisu.inc @@ -10,4 +10,4 @@ DISTRO_FEATURES:remove = " use_eva_pkg" MACHINE_FEATURES:append = " usb3" IMAGE_INSTALL:append = " gstreamer1.0-omx gstreamer1.0-plugin-vspfilter" -IMAGE_INSTALL:append = " kernel-module-mmngr kernel-module-mmngrbuf kernel-module-uvcs-drv kernel-module-vspmif" +IMAGE_INSTALL:append = " kernel-module-mmngr kernel-module-mmngrbuf kernel-module-uvcs-drv kernel-module-vspm-if" diff --git a/meta-agl-bsp/conf/include/agl_h3-salvator-x-nogfx.inc b/meta-agl-bsp/conf/include/agl_h3-salvator-x-nogfx.inc index 1ee0fe5b5..4ff103df8 100644 --- a/meta-agl-bsp/conf/include/agl_h3-salvator-x-nogfx.inc +++ b/meta-agl-bsp/conf/include/agl_h3-salvator-x-nogfx.inc @@ -1,14 +1,9 @@ -require conf/include/agl_rcar-nogfx.inc +require conf/include/agl_salvator-nogfx.inc SOC_FAMILY = "r8a7795" BOARD_NAME = "h3-salvator-x" DTB_SUFFIX = "r8a77951-salvator-xs" -# Mask graphic Pkgs -BBMASK += "gles-user-module|kernel-module-gles|wayland-kms|libgbm" -# Mask MMP recipes -BBMASK += "kernel-module-uvcs-drv|omx-user-module" - # do use software rendering to display the compositor # used for images w/o binary-only driver WESTON_USE_PIXMAN = "1" diff --git a/meta-agl-bsp/conf/include/agl_h3-salvator-x.inc b/meta-agl-bsp/conf/include/agl_h3-salvator-x.inc index e7a8b463c..134b1dd1f 100644 --- a/meta-agl-bsp/conf/include/agl_h3-salvator-x.inc +++ b/meta-agl-bsp/conf/include/agl_h3-salvator-x.inc @@ -1,9 +1,6 @@ -require conf/include/agl_rcar.inc +require conf/include/agl_salvator.inc SOC_FAMILY = "r8a7795" BOARD_NAME = "h3-salvator-x" DTB_SUFFIX = "r8a77951-salvator-xs" -IMAGE_INSTALL:append:rcar-gen3 = " \ - kernel-module-vspmif \ -" diff --git a/meta-agl-bsp/conf/include/agl_h3ulcb-nogfx.inc b/meta-agl-bsp/conf/include/agl_h3ulcb-nogfx.inc index 07a93df80..5f288fca5 100644 --- a/meta-agl-bsp/conf/include/agl_h3ulcb-nogfx.inc +++ b/meta-agl-bsp/conf/include/agl_h3ulcb-nogfx.inc @@ -9,8 +9,16 @@ BBMASK += "gles-user-module|kernel-module-gles|wayland-kms|libgbm" # Mask MMP recipes BBMASK += "kernel-module-uvcs-drv|omx-user-module" -# Workaround for SPEC-3706 - versioned bbappends and upstream moved on to 1.16.3 -BBMASK += "meta-renesas/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0-.*1.16.2\.bbappend" +# Work around use of obsolete Weston backend-fbdev in meta-rcar-gen3 +# when building without the proprietary driver stack. Masking out the +# weston_%.bbappend seems the simplest approach for now, as forcing +# USE_GLES = "1" to disable the adding of -Dbackend-default="fbdev" to +# EXTRA_OEMESON triggers adding "libgbm" to DEPENDS, which breaks due +# to that being a component specific to the proprietary stack we are +# explicitly disabling. If the "libgbm" usage in the bbappend was +# instead "virtual/libgbm" as is now used in poky, it might be possible +# to just tweak PREFERRED_PROVIDER_virtual/libgbm = "mesa". +BBMASK += "meta-rcar-gen3/recipes-graphics/wayland/weston_%.bbappend" # do use software rendering to display the compositor # used for images w/o binary-only driver diff --git a/meta-agl-bsp/conf/include/agl_hsdk.inc b/meta-agl-bsp/conf/include/agl_hsdk.inc deleted file mode 100644 index b1b0e4a8f..000000000 --- a/meta-agl-bsp/conf/include/agl_hsdk.inc +++ /dev/null @@ -1,9 +0,0 @@ -KERNEL_IMAGETYPE = "uImage" -WKS_FILE = "sdimage-hsdk.wks" -IMAGE_BOOT_FILES = "uImage uboot.env" -IMAGE_INSTALL:append = " kernel-modules" - -# remove incompatible packages from packagegroups -RDEPENDS:packagegroup-agl-core-devel:remove:hsdk = "valgrind gcc-sanitizers" -RDEPENDS:packagegroup-core-tools-profile:remove:hsdk = "systemtap" -RDEPENDS:packagegroup-core-tools-debug:remove:hsdk = "gdbserver" diff --git a/meta-agl-bsp/conf/include/agl_imx8mq-evk-common.inc b/meta-agl-bsp/conf/include/agl_imx8mq-evk-common.inc new file mode 100644 index 000000000..b3faadd0a --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_imx8mq-evk-common.inc @@ -0,0 +1,8 @@ +require agl_imx-common.inc + +# Add helper to drive setting up HCI UART device +# NOTE: Disabled 2023/05 due to kernel oops, further investigation +# required, see SPEC-4807 in JIRA. +#MACHINE_EXTRA_RRECOMMENDS:append = " hci-uart-helper" + +AGL_DEFAULT_INITRAMFS_FSTYPES := "" diff --git a/meta-agl-bsp/conf/include/agl_imx8mq-evk-viv.inc b/meta-agl-bsp/conf/include/agl_imx8mq-evk-viv.inc new file mode 100644 index 000000000..3988fcd6f --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_imx8mq-evk-viv.inc @@ -0,0 +1,8 @@ +require agl_imx8mq-evk-common.inc + +IMX_DEFAULT_BSP = "nxp" + +# NOTE: +# There is some potential benefit to using the community supported +# linux-fslc-imx hybrid kernel here, but keeping the configuration +# close to upstream to ease maintenance seems worthwhile. diff --git a/meta-agl-bsp/conf/include/agl_imx8mq-evk.inc b/meta-agl-bsp/conf/include/agl_imx8mq-evk.inc new file mode 100644 index 000000000..620ee0fdd --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_imx8mq-evk.inc @@ -0,0 +1,23 @@ +require agl_imx8mq-evk-common.inc + +# NOTE: +# Currently using the upstream default of IMX_DEFAULT_BSP = "mainline", +# since we want to use the etnaviv driver and upstream Mesa + weston +# stack. More tweaks are required to accomplish that if the BSP is set +# to "nxp". + +# Force use of the community supported hybrid NXP/LTS kernel instead of +# the default linux-fslc. This is required to get the drivers required +# for HDMI output. +IMX_DEFAULT_KERNEL:imx8mq-evk = "linux-fslc-imx" + +# Tweaks to allow using linux-fslc-imx on its own without the whole +# NXP BSP. Just the DISTROOVERRIDES change on its own is not enough, +# as COMPATIBLE_MACHINE is evaluated early enough that the recipe is +# not seen as compatible without an explicit override. +COMPATIBLE_MACHINE:pn-linux-fslc-imx = "(imx8mq-evk)" +DISTROOVERRIDES:pn-linux-fslc-imx:append = "mx8-nxp-bsp" + +# Add our own over-ride for use in a few recipes where there is +# conflicting Vivante vs etnaviv configuration. +MACHINEOVERRIDES .= ":etnaviv" diff --git a/meta-agl-bsp/conf/include/agl_imx8mqevk-common.inc b/meta-agl-bsp/conf/include/agl_imx8mqevk-common.inc deleted file mode 100644 index f3c4a736e..000000000 --- a/meta-agl-bsp/conf/include/agl_imx8mqevk-common.inc +++ /dev/null @@ -1,13 +0,0 @@ -require agl_imx-common.inc - -# Force use of the community supported LTS kernel instead of the -# default linux-imx -IMX_DEFAULT_KERNEL:imx8mqevk = "linux-fslc-imx" - -# For EVKB wifi support -MACHINE_FEATURES:append = " bcm4356" - -# Add helper to drive setting up HCI UART device -MACHINE_EXTRA_RRECOMMENDS:append = " hci-uart-helper" - -AGL_DEFAULT_INITRAMFS_FSTYPES := "" diff --git a/meta-agl-bsp/conf/include/agl_imx8mqevk-viv.inc b/meta-agl-bsp/conf/include/agl_imx8mqevk-viv.inc deleted file mode 100644 index 8227f5c06..000000000 --- a/meta-agl-bsp/conf/include/agl_imx8mqevk-viv.inc +++ /dev/null @@ -1 +0,0 @@ -include agl_imx8mqevk-common.inc diff --git a/meta-agl-bsp/conf/include/agl_imx8mqevk.inc b/meta-agl-bsp/conf/include/agl_imx8mqevk.inc deleted file mode 100644 index 6801722be..000000000 --- a/meta-agl-bsp/conf/include/agl_imx8mqevk.inc +++ /dev/null @@ -1,23 +0,0 @@ -include agl_imx8mqevk-common.inc - -# NOTE: currently not using IMX_DEFAULT_BSP = "mainline", as it -# requires more changes than this approach of disabling -# Vivante. - -# Add our own over-ride for use in a few recipes where there is -# conflicting Vivante vs etnaviv configuration. -MACHINEOVERRIDES .= ":etnaviv" - -# Knock out Vivante overrides -MACHINEOVERRIDES_EXTENDER:mx8mq:forcevariable = "" -PREFERRED_VERSION_weston_mx8 = "8.0.0" -PREFERRED_VERSION_wayland-protocols_mx8 = "1.20" -PREFERRED_VERSION_libdrm_mx8 = "2.4.101" - -CORE_IMAGE_EXTRA_INSTALL += "libdrm-etnaviv" - -PREFERRED_VERSION_gstreamer1.0_mx8 = "1.16.3" -PREFERRED_VERSION_gstreamer1.0-plugins-base_mx8 = "1.16.3" -PREFERRED_VERSION_gstreamer1.0-plugins-good_mx8 = "1.16.3" -PREFERRED_VERSION_gstreamer1.0-plugins-bad_mx8 = "1.16.3" -PREFERRED_VERSION_gstreamer1.0-plugins-ugly_mx8 = "1.16.3" diff --git a/meta-agl-bsp/conf/include/agl_j7-evm.inc b/meta-agl-bsp/conf/include/agl_j7-evm.inc deleted file mode 100644 index b394aa5ee..000000000 --- a/meta-agl-bsp/conf/include/agl_j7-evm.inc +++ /dev/null @@ -1,15 +0,0 @@ -# j7-evm has a k3r5 BBMULTICONFIG to build its bootloader firmware, -# need to use an override to set DEFAULTTUNE back to what that -# machine configuration needs. -DEFAULTTUNE_k3r5 = "armv7athf" - -# Force using a separate TMPDIR for the multiconfig to avoid -# issues (e.g. using the rm_work class currently fails with the -# single shared TMPDIR). -TMPDIR_k3r5 = "${TOPDIR}/tmp-${BB_CURRENT_MC}" -# But we then also need to redefine DEPLOY_DIR for it to match -# the existing expectations (pointing into the default config) -DEPLOY_DIR_k3r5 = "${TOPDIR}/tmp/deploy" - -# Workaround for recipe assumption of poky location -LIC_FILES_CHKSUM:pn-ti-rtos-firmware = "file://${THISDIR}/../../licenses/TI-TFL;md5=a1b59cb7ba626b9dbbcbf00f3fbc438a" diff --git a/meta-agl-bsp/conf/include/agl_j721e-evm.inc b/meta-agl-bsp/conf/include/agl_j721e-evm.inc new file mode 100644 index 000000000..963b5697d --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_j721e-evm.inc @@ -0,0 +1,11 @@ +# j721e-evm has a k3r5 BBMULTICONFIG to build its bootloader +# firmware, need to use an override to set DEFAULTTUNE back to +# what that machine configuration needs. +DEFAULTTUNE:k3r5:forcedefaulttune = "armv7athf" + +# Workaround for recipe assumption of poky location +LIC_FILES_CHKSUM:pn-ti-rtos-firmware = "file://${THISDIR}/../../licenses/TI-TFL;md5=a1b59cb7ba626b9dbbcbf00f3fbc438a" + +# meta-ti-bsp layer conf does break expectations wrt common folders +# meta-ti-bsp/conf/layer.conf:TI_COMMON_DEPLOY ?= "${TOPDIR}/deploy-ti" +TI_COMMON_DEPLOY := "${TMPDIR}/deploy"
\ No newline at end of file diff --git a/meta-agl-bsp/conf/include/agl_m3-salvator-x-nogfx.inc b/meta-agl-bsp/conf/include/agl_m3-salvator-x-nogfx.inc index 7f1248065..ebbb3006a 100644 --- a/meta-agl-bsp/conf/include/agl_m3-salvator-x-nogfx.inc +++ b/meta-agl-bsp/conf/include/agl_m3-salvator-x-nogfx.inc @@ -1,10 +1,6 @@ -require conf/include/agl_rcar-nogfx.inc +require conf/include/agl_salvator-nogfx.inc SOC_FAMILY = "r8a7796" BOARD_NAME = "m3-salvator-x" DTB_SUFFIX = "r8a7796-salvator-xs" -# Mask graphic Pkgs -BBMASK += "gles-user-module|kernel-module-gles|wayland-kms|libgbm" -# Mask MMP recipes -BBMASK += "kernel-module-uvcs-drv|omx-user-module" diff --git a/meta-agl-bsp/conf/include/agl_m3-salvator-x.inc b/meta-agl-bsp/conf/include/agl_m3-salvator-x.inc index b332c4b81..355040ba9 100644 --- a/meta-agl-bsp/conf/include/agl_m3-salvator-x.inc +++ b/meta-agl-bsp/conf/include/agl_m3-salvator-x.inc @@ -1,9 +1,6 @@ -require conf/include/agl_rcar.inc +require conf/include/agl_salvator.inc SOC_FAMILY = "r8a7796" BOARD_NAME = "m3-salvator-x" DTB_SUFFIX = "r8a7796-salvator-xs" -IMAGE_INSTALL:append:rcar-gen3 = " \ - kernel-module-vspmif \ -" diff --git a/meta-agl-bsp/conf/include/agl_m3ulcb-nogfx.inc b/meta-agl-bsp/conf/include/agl_m3ulcb-nogfx.inc index d2c4c056c..31d99c342 100644 --- a/meta-agl-bsp/conf/include/agl_m3ulcb-nogfx.inc +++ b/meta-agl-bsp/conf/include/agl_m3ulcb-nogfx.inc @@ -9,12 +9,20 @@ BBMASK += "gles-user-module|kernel-module-gles|wayland-kms|libgbm" # Mask MMP recipes BBMASK += "kernel-module-uvcs-drv|omx-user-module" -DISTRO_FEATURES:append = "${@bb.utils.contains('AGL_XEN_WANTED', '1', ' xen', '', d)}" -IMAGE_INSTALL:append = "${@bb.utils.contains('AGL_XEN_WANTED', '1', ' xen-base xen-mkimage', '', d)}" - -# Workaround for SPEC-3706 - versioned bbappends and upstream moved on to 1.16.3 -BBMASK += "meta-renesas/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0-.*1.16.2\.bbappend" +# Work around use of obsolete Weston backend-fbdev in meta-rcar-gen3 +# when building without the proprietary driver stack. Masking out the +# weston_%.bbappend seems the simplest approach for now, as forcing +# USE_GLES = "1" to disable the adding of -Dbackend-default="fbdev" to +# EXTRA_OEMESON triggers adding "libgbm" to DEPENDS, which breaks due +# to that being a component specific to the proprietary stack we are +# explicitly disabling. If the "libgbm" usage in the bbappend was +# instead "virtual/libgbm" as is now used in poky, it might be possible +# to just tweak PREFERRED_PROVIDER_virtual/libgbm = "mesa". +BBMASK += "meta-rcar-gen3/recipes-graphics/wayland/weston_%.bbappend" # do use software rendering to display the compositor # used for images w/o binary-only driver WESTON_USE_PIXMAN = "1" + +DISTRO_FEATURES:append = "${@bb.utils.contains('AGL_XEN_WANTED', '1', ' xen', '', d)}" +IMAGE_INSTALL:append = "${@bb.utils.contains('AGL_XEN_WANTED', '1', ' xen-base xen-mkimage', '', d)}" diff --git a/meta-agl-bsp/conf/include/agl_nitrogen6x.inc b/meta-agl-bsp/conf/include/agl_nitrogen6x.inc deleted file mode 100644 index cb13de713..000000000 --- a/meta-agl-bsp/conf/include/agl_nitrogen6x.inc +++ /dev/null @@ -1 +0,0 @@ -require agl_imx6-common.inc diff --git a/meta-agl-bsp/conf/include/agl_qemuarm.inc b/meta-agl-bsp/conf/include/agl_qemuarm.inc index f45b2d445..2449e1800 100644 --- a/meta-agl-bsp/conf/include/agl_qemuarm.inc +++ b/meta-agl-bsp/conf/include/agl_qemuarm.inc @@ -7,6 +7,9 @@ ROOT_VM = "root=PARTUUID=${DISK_SIGNATURE}-02" # Use our own wks file WKS_FILE="directdisk.wks.in" +# Use pixman as software renderer to avoid high cpu consumption by GL-renderer +WESTON_USE_PIXMAN = "1" + # Over-ride setting in oe-core's qemuboot.bbclass QB_MEM:qemuarm = "-m 2048" diff --git a/meta-agl-bsp/conf/include/agl_qemuarm64.inc b/meta-agl-bsp/conf/include/agl_qemuarm64.inc index 089c4f261..46d3b4c39 100644 --- a/meta-agl-bsp/conf/include/agl_qemuarm64.inc +++ b/meta-agl-bsp/conf/include/agl_qemuarm64.inc @@ -7,6 +7,9 @@ ROOT_VM = "root=PARTUUID=${DISK_SIGNATURE}-02" # Use our own wks file WKS_FILE="directdisk.wks.in" +# Use pixman as software renderer to avoid high cpu consumption by GL-renderer +WESTON_USE_PIXMAN = "1" + # Over-ride setting in oe-core's qemuboot.bbclass QB_MEM:qemuarm64 = "-m 2048" diff --git a/meta-agl-bsp/conf/include/agl_qemux86-64.inc b/meta-agl-bsp/conf/include/agl_qemux86-64.inc index 638778b81..cb40b8b37 100644 --- a/meta-agl-bsp/conf/include/agl_qemux86-64.inc +++ b/meta-agl-bsp/conf/include/agl_qemux86-64.inc @@ -34,7 +34,7 @@ MACHINE_EXTRA_RRECOMMENDS:append = " \ # NOTE: wic.{xz,bmap} are here since qemu targets override # AGL_DEFAULT_IMAGE_FSTYPES to not include them, but for Intel # we actually do want them for use on physical hardware. -AGL_EXTRA_IMAGE_FSTYPES = "wic.xz wic.bmap ${@bb.utils.contains('DISTRO_FEATURES', 'AGLCI', 'wic.vmdk.xz', 'wic.vmdk', d)}" +AGL_EXTRA_IMAGE_FSTYPES = "wic.xz wic.bmap ${@bb.utils.contains('AGL_FEATURES', 'AGLCI', 'wic.vmdk.xz', 'wic.vmdk', d)}" IMAGE_BOOT_FILES:sota = "u-boot-qemux86-64.rom" # Root device diff --git a/meta-agl-bsp/conf/include/agl_raspberrypi4.inc b/meta-agl-bsp/conf/include/agl_raspberrypi4.inc index 5a0e89e66..4ba7ff0f6 100644 --- a/meta-agl-bsp/conf/include/agl_raspberrypi4.inc +++ b/meta-agl-bsp/conf/include/agl_raspberrypi4.inc @@ -11,7 +11,10 @@ RPI_USE_U_BOOT = "1" ENABLE_UART ?= "1" # For libomxil -#LICENSE_FLAGS_WHITELIST = "commercial" +#LICENSE_FLAGS_ACCEPTED += "commercial" + +# For linux-firmware-rpidistro +LICENSE_FLAGS_ACCEPTED += "synaptics-killswitch" IMAGE_INSTALL:append = " kernel-modules linux-firmware-rpidistro-bcm43430 linux-firmware-rpidistro-bcm43455 create-combined-dtb " @@ -30,6 +33,5 @@ IMAGE_INSTALL:append = " ${@bb.utils.contains('AGL_XEN_WANTED', '1', 'xen-tools # Add xen-raspberry binary to boot files IMAGE_BOOT_FILES:append = " ${@bb.utils.contains('AGL_XEN_WANTED','1', 'xen-${MACHINE}', '',d)}" -PREFERRED_VERSION_u-boot = "2021.07" -PREFERRED_VERSION_u-boot-tools = "2021.07" -UBOOT_MACHINE:rpi = "rpi_arm64_config" +#DISPLAY CONFIGURATION +WESTON_DISPLAYS:raspberrypi4 = " hdmi-a-1-90 hdmi-a-2-90" diff --git a/meta-agl-bsp/conf/include/agl_raspberrypi5.inc b/meta-agl-bsp/conf/include/agl_raspberrypi5.inc new file mode 100644 index 000000000..a0e675956 --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_raspberrypi5.inc @@ -0,0 +1,34 @@ +# Maximum memory allowed to be assigned +GPU_MEM = "256" + +# Add CMA to the kernel arguments for SOTA +OSTREE_KERNEL_ARGS:sota:append = " cma=256M" + +# use u-boot always (RPi5 U-boot is not ready yet) +RPI_USE_U_BOOT = "0" + +# Use UART for serial console +ENABLE_UART ?= "1" + +# For libomxil +#LICENSE_FLAGS_ACCEPTED = "commercial" + +IMAGE_INSTALL:append = " kernel-modules linux-firmware-rpidistro-bcm43430 linux-firmware-rpidistro-bcm43455 create-combined-dtb " + +# Psplash causes crash on first boot on RPi +IMAGE_FEATURES:remove = "splash" + +# Build updatable image. Only takes effect when sota.bbclass is inherited +DISTRO_FEATURES:append = " sota" + +# Add xen build, if the xen feature activated +DISTRO_FEATURES:append = " ${@bb.utils.contains('AGL_XEN_WANTED', '1', ' xen', '', d)}" + +# add xen-tools to build +IMAGE_INSTALL:append = " ${@bb.utils.contains('AGL_XEN_WANTED', '1', 'xen-tools xen-mkimage-rpi4', '', d)}" + +# Add xen-raspberry binary to boot files +IMAGE_BOOT_FILES:append = " ${@bb.utils.contains('AGL_XEN_WANTED','1', 'xen-${MACHINE}', '',d)}" + +#DISPLAY CONFIGURATION +WESTON_DISPLAYS:raspberrypi5 = " hdmi-a-1-90 hdmi-a-2-90" diff --git a/meta-agl-bsp/conf/include/agl_rcar-nogfx.inc b/meta-agl-bsp/conf/include/agl_rcar-nogfx.inc index f3548b8ab..64e13642e 100644 --- a/meta-agl-bsp/conf/include/agl_rcar-nogfx.inc +++ b/meta-agl-bsp/conf/include/agl_rcar-nogfx.inc @@ -4,7 +4,7 @@ OSTREE_KERNEL = "Image" IMAGE_BOOT_FILES:sota = "renesas-ota-bootfiles/* ${DTB_SUFFIX}.dtb" OSTREE_BOOTLOADER ?= "u-boot" -WKS_FILE = "singlepart-noloader.wks" +WKS_FILE:rcar-gen3 = "singlepart-noloader.wks" RENESAS_DATADIR = "/usr" @@ -41,3 +41,30 @@ PSEUDO_IGNORE_PATHS:append:pn-kernel-module-qos = ",${KERNELSRC}" PSEUDO_IGNORE_PATHS:append:pn-kernel-module-vsp2driver = ",${KERNELSRC}" PSEUDO_IGNORE_PATHS:append:pn-kernel-module-vspmif = ",${KERNELSRC}" PSEUDO_IGNORE_PATHS:append:pn-kernel-module-vspm = ",${KERNELSRC}" + +# Mask out base-files and systemd bbappends to avoid changing systemd-tmpfiles +# behavior, see SPEC-4256 for a more involved explanation. +BBMASK += "meta-renesas/meta-rcar-gen3/recipes-core/base-files/ meta-renesas/meta-rcar-gen3/recipes-core/systemd/" + +# Mask out cogl bbappend to avoid meta-gnome dependency +BBMASK += "meta-renesas/meta-rcar-gen3/recipes-graphics/cogl/cogl-1.0_1.%.bbappend" + +# Provide default value that avoids errors from a new packaging QA +# check with respect to packagegroups depending on versioned library +# packages needing to be machine-specific. +# +# Note that this needs to be done here in global configuration space as +# opposed to in a bbappend because the value needs to be set before the +# packagegroup bbclass is inherited. This can be removed when upstream +# is fixed to add the required PACKAGE_ARCH = "${MACHINE_ARCH}". +PACKAGE_ARCH:pn-packagegroup-multimedia-libs = "${MACHINE_ARCH}" + +# Mask out BSP layer gstreamer* 1.22.x bbappends for now, as the BSP +# effectively is building 1.20.x plugins and packaging them as 1.22, +# which breaks building various things. The whole directory is not +# commented out because we still want the vspfilter plugin. +# The BBMASKs need to be here instead of agl_rcar.ing since without +# them there are issues with the gstreamer1.0-plugins-bad patches in +# meta-agl-core not applying. +BBMASK += "meta-renesas/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0-omx" +BBMASK += "meta-renesas/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0-plugins-" diff --git a/meta-agl-bsp/conf/include/agl_rcar.inc b/meta-agl-bsp/conf/include/agl_rcar.inc index 6dc40dcb5..ce3b8a8f9 100644 --- a/meta-agl-bsp/conf/include/agl_rcar.inc +++ b/meta-agl-bsp/conf/include/agl_rcar.inc @@ -1,33 +1,36 @@ require conf/include/agl_rcar-nogfx.inc # Enable AGL virtualization features -MACHINE_FEATURES:append = " agl-egvirt" +MACHINE_FEATURES:append:rcar-gen3 = " agl-egvirt" # Enable Gfx Pkgs -MACHINE_FEATURES:append = " gsx" -MULTI_PROVIDER_WHITELIST += "virtual/libgl virtual/egl virtual/libgles1 virtual/libgles2" +MACHINE_FEATURES:append:rcar-gen3 = " gsx" +BB_MULTI_PROVIDER_ALLOWED:append:rcar-gen3 = " virtual/libgl virtual/egl virtual/libgles1 virtual/libgles2" # for Wayland/Weston -PREFERRED_PROVIDER_virtual/libgles1 = "" -PREFERRED_PROVIDER_virtual/libgles2 = "virtual-gles-user-module" -PREFERRED_PROVIDER_virtual/egl = "virtual-gles-user-module" -PREFERRED_PROVIDER_virtual/libgl = "" -PREFERRED_PROVIDER_virtual/mesa = "mesa" -PREFERRED_PROVIDER_libgbm = "libgbm" -PREFERRED_RPROVIDER_libgbm-dev = "libgbm" +PREFERRED_PROVIDER_virtual/libgles1:rcar-gen3 = "" +PREFERRED_PROVIDER_virtual/libgles2:rcar-gen3 = "virtual-gles-user-module" +PREFERRED_PROVIDER_virtual/egl:rcar-gen3 = "virtual-gles-user-module" +PREFERRED_PROVIDER_virtual/libgl:rcar-gen3 = "" +PREFERRED_PROVIDER_virtual/mesa:rcar-gen3 = "mesa" -PREFERRED_RPROVIDER_libomxil = "omx-user-module" -PREFERRED_PROVIDER_virtual/libomxil = "omx-user-module" +PREFERRED_PROVIDER_libgbm:rcar-gen3 = "libgbm" +PREFERRED_PROVIDER_virtual/libgbm:rcar-gen3 = "libgbm" +PREFERRED_RPROVIDER_libgbm-dev:rcar-gen3 = "libgbm" + +PREFERRED_RPROVIDER_libomxil:rcar-gen3 = "omx-user-module" +PREFERRED_PROVIDER_virtual/libomxil:rcar-gen3 = "omx-user-module" +VIRTUAL-RUNTIME_libomxil:rcar-gen3 = "omx-user-module" # Add for gstreamer plugins ugly -LICENSE_FLAGS_WHITELIST = "commercial" +LICENSE_FLAGS_ACCEPTED:rcar-gen3 = "commercial" -MACHINE_FEATURES:append = " multimedia" +MACHINE_FEATURES:append:rcar-gen3 = " multimedia" -DISTRO_FEATURES:append = " use_eva_pkg" +DISTRO_FEATURES:append:rcar-gen3 = " use_eva_pkg" -#DISTRO_FEATURES:append = " h265dec_lib mpeg2dec_lib" -DISTRO_FEATURES:append = " h264dec_lib h264enc_lib aaclcdec_lib aaclcdec_mdw" +#DISTRO_FEATURES:append:rcar-gen3 = " h265dec_lib mpeg2dec_lib" +DISTRO_FEATURES:append:rcar-gen3 = " h264dec_lib h264enc_lib aaclcdec_lib aaclcdec_mdw" # Mask out meta-renesas-rcar-gen3's tweaks to weston-init, as they do # not seem necessary for anything in AGL, and the addition of @@ -38,7 +41,7 @@ DISTRO_FEATURES:append = " h264dec_lib h264enc_lib aaclcdec_lib aaclcdec_mdw" # getting weston started. There is no clear rationale expressed in the # meta-renesas-rcar-gen3 commit history for the extra dependencies, and # testing shows no issues on H3ULCB when not having them. -BBMASK += "meta-rcar-gen3/recipes-graphics/wayland/weston-init.bbappend" +BBMASK += "meta-renesas/meta-rcar-gen3/recipes-graphics/wayland/weston-init.bbappend" # Add graphics and decoder drivers to packagegroup-machine-base # recommendation. diff --git a/meta-agl-bsp/conf/include/agl_refhw-h3.inc b/meta-agl-bsp/conf/include/agl_refhw-h3.inc index 68c0007bd..6eee8149f 100644 --- a/meta-agl-bsp/conf/include/agl_refhw-h3.inc +++ b/meta-agl-bsp/conf/include/agl_refhw-h3.inc @@ -1,11 +1,11 @@ -AGL_FEATURES:append = " agl-refhw-h3" +AGL_FEATURES:append:h3ulcb = " agl-refhw-h3" # Reference hardware has USB3 -MACHINE_FEATURES:append = " usb3" +MACHINE_FEATURES:append:h3ulcb = " usb3" -KERNEL_DEVICETREE:append = " renesas/r8a77951-agl-refhw.dtb" +KERNEL_DEVICETREE:append:h3ulcb = " renesas/r8a77951-agl-refhw.dtb" -UBOOT_CONFIG:append = " agl-refhw" +UBOOT_CONFIG:append:h3ulcb = " agl-refhw" UBOOT_CONFIG[agl-refhw] = "rcar3_salvator-x_defconfig" MACHINE_EXTRA_RRECOMMENDS:append:h3ulcb = " \ diff --git a/meta-agl-bsp/conf/include/agl_s4sk.inc b/meta-agl-bsp/conf/include/agl_s4sk.inc new file mode 100644 index 000000000..8f4a91b44 --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_s4sk.inc @@ -0,0 +1,9 @@ +SOC_FAMILY = "r8a779f0" +BOARD_NAME = "s4sk" + +#ws2.0 +DTB_SUFFIX = "r8a779f0-s4sk" +WKS_FILE = "singlepart-noloader.wks" +IMAGE_INSTALL:append = " \ + kernel-devicetree \ +" diff --git a/meta-agl-bsp/conf/include/agl_salvator-nogfx.inc b/meta-agl-bsp/conf/include/agl_salvator-nogfx.inc new file mode 100644 index 000000000..06e635ca0 --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_salvator-nogfx.inc @@ -0,0 +1,17 @@ +require conf/include/agl_rcar-nogfx.inc + +# Mask graphic Pkgs +BBMASK += "gles-user-module|kernel-module-gles|wayland-kms|libgbm" +# Mask MMP recipes +BBMASK += "kernel-module-uvcs-drv|omx-user-module" +# Work around use of obsolete Weston backend-fbdev in meta-rcar-gen3 +# when building without the proprietary driver stack. Masking out the +# weston_%.bbappend seems the simplest approach for now, as forcing +# USE_GLES = "1" to disable the adding of -Dbackend-default="fbdev" to +# EXTRA_OEMESON triggers adding "libgbm" to DEPENDS, which breaks due +# to that being a component specific to the proprietary stack we are +# explicitly disabling. If the "libgbm" usage in the bbappend was +# instead "virtual/libgbm" as is now used in poky, it might be possible +# to just tweak PREFERRED_PROVIDER_virtual/libgbm = "mesa". +BBMASK += "meta-rcar-gen3/recipes-graphics/wayland/weston_%.bbappend" + diff --git a/meta-agl-bsp/conf/include/agl_salvator.inc b/meta-agl-bsp/conf/include/agl_salvator.inc new file mode 100644 index 000000000..78457868a --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_salvator.inc @@ -0,0 +1,6 @@ +require conf/include/agl_rcar.inc + +IMAGE_INSTALL:append:rcar-gen3 = " \ + kernel-module-vspm-if \ +" + diff --git a/meta-agl-bsp/conf/include/agl_unmatched.inc b/meta-agl-bsp/conf/include/agl_unmatched.inc new file mode 100644 index 000000000..f7c9f75f2 --- /dev/null +++ b/meta-agl-bsp/conf/include/agl_unmatched.inc @@ -0,0 +1,4 @@ +# firmware for graphics +MACHINE_EXTRA_RRECOMMENDS:append = " linux-firmware-radeon linux-firmware-amdgpu " + +# diff --git a/meta-agl-bsp/conf/layer.conf b/meta-agl-bsp/conf/layer.conf index 2a999ddd5..036cde7a7 100644 --- a/meta-agl-bsp/conf/layer.conf +++ b/meta-agl-bsp/conf/layer.conf @@ -23,4 +23,4 @@ BBFILE_COLLECTIONS += "aglbsp" BBFILE_PATTERN_aglbsp = "^${LAYERDIR}/" BBFILE_PRIORITY_aglbsp = "60" -LAYERSERIES_COMPAT_aglbsp = "dunfell" +LAYERSERIES_COMPAT_aglbsp = "scarthgap" diff --git a/meta-agl-bsp/conf/machine/include/virtio.inc b/meta-agl-bsp/conf/machine/include/virtio.inc index 8ee71a80b..6f8a638a0 100644 --- a/meta-agl-bsp/conf/machine/include/virtio.inc +++ b/meta-agl-bsp/conf/machine/include/virtio.inc @@ -16,19 +16,8 @@ RDEPENDS:${KERNEL_PACKAGE_NAME}-base = "" PREFERRED_PROVIDER_virtual/kernel ??= "linux-yocto" # Use newer kernel -PREFERRED_VERSION_linux-yocto = "5.10.%" - -# Clear since it is set to 'sllin' in packagegroup-agl-demo.bb, and sllin is not -# compatible with kernel 5.10 at the moment. -LIN_DRIVERS = "" - -# Clear since it is set to 'lttng-modules' in packagegroup-core-tools-profile.bb, -# and lttng-modules are not compatible with 5.10 kernel used for virtio. -LTTNGMODULES:virtio-all = "" +PREFERRED_VERSION_linux-yocto = "5.15.%" EXTRA_IMAGEDEPENDS += "qemu-native qemu-helper-native" IMAGE_CLASSES += "qemuboot" - -# most driver fails to compile -MOST_DRIVERS ?= "" diff --git a/meta-agl-bsp/meta-agl-refhw-gen3/recipes-navigation/gpsd/gpsd-conf-refhw_1.0.bb b/meta-agl-bsp/meta-agl-refhw-gen3/recipes-navigation/gpsd/gpsd-machine-conf_1.0.bbappend index 25bdb73c8..3cd5aa7de 100644 --- a/meta-agl-bsp/meta-agl-refhw-gen3/recipes-navigation/gpsd/gpsd-conf-refhw_1.0.bb +++ b/meta-agl-bsp/meta-agl-refhw-gen3/recipes-navigation/gpsd/gpsd-machine-conf_1.0.bbappend @@ -1,8 +1,4 @@ -SUMMARY = "AGL Reference Hardware specific gpsd configuration" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" - -PACKAGE_ARCH = "${MACHINE_ARCH}" +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" SRC_URI = "file://gpsd.refhw \ file://refhw-gpsd-helper.sh \ @@ -16,6 +12,7 @@ do_compile[noexec] = "1" do_install() { install -D -m 0644 ${WORKDIR}/gpsd.refhw ${D}/${sysconfdir}/default/gpsd.refhw + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then install -D -m 0755 ${WORKDIR}/refhw-gpsd-helper.sh ${D}/${sbindir}/refhw-gpsd-helper.sh install -d ${D}${sysconfdir}/systemd/system/gpsd.service.d @@ -23,6 +20,10 @@ do_install() { fi } +PACKAGE_ARCH = "${MACHINE_ARCH}" + +CONFFILES:${PN} = "${sysconfdir}/default/gpsd.refhw" + ALTERNATIVE:${PN} = "gpsd-defaults" ALTERNATIVE_LINK_NAME[gpsd-defaults] = "${sysconfdir}/default/gpsd" ALTERNATIVE_TARGET[gpsd-defaults] = "${sysconfdir}/default/gpsd.refhw" @@ -30,9 +31,3 @@ ALTERNATIVE_TARGET[gpsd-defaults] = "${sysconfdir}/default/gpsd.refhw" # default configuration. The script run by the systemd drop-in # will tweak things on boot to handle h3ulcb vs refhw. ALTERNATIVE_PRIORITY[gpsd-defaults] = "5" - -CONFFILES:${PN} = "${sysconfdir}/default/gpsd.refhw" - -# NOTE: Explicitly not defining RPROVIDES of "virtual/gpsd-conf" to -# avoid conflicting with the default configuration and potentially -# changing behavior on m3ulcb/h3ulcb. diff --git a/meta-agl-bsp/meta-core/recipes-graphics/mesa/mesa_%.bbappend b/meta-agl-bsp/meta-core/recipes-graphics/mesa/mesa_%.bbappend index 3d5903d85..fb797a436 100644 --- a/meta-agl-bsp/meta-core/recipes-graphics/mesa/mesa_%.bbappend +++ b/meta-agl-bsp/meta-core/recipes-graphics/mesa/mesa_%.bbappend @@ -1 +1,3 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" + require ${@bb.utils.contains('AGL_FEATURES', 'aglcore', '${BPN}_agl.inc', '', d)} diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-connectivity/hci-uart-helper/hci-uart-helper_1.0.bb b/meta-agl-bsp/meta-freescale-layer/recipes-connectivity/hci-uart-helper/hci-uart-helper_1.0.bb index 1a9c6bb4e..798fcebe6 100644 --- a/meta-agl-bsp/meta-freescale-layer/recipes-connectivity/hci-uart-helper/hci-uart-helper_1.0.bb +++ b/meta-agl-bsp/meta-freescale-layer/recipes-connectivity/hci-uart-helper/hci-uart-helper_1.0.bb @@ -8,7 +8,7 @@ SRC_URI = "file://hci-uart-helper.service \ file://hci-uart-helper.sh \ " -COMPATIBLE_MACHINE = "imx8mqevk" +COMPATIBLE_MACHINE = "imx8mq-evk" do_configure[noexec] = "1" do_compile[noexec] = "1" diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/mesa/files/0001-kmsro-add-imx-dcss.patch b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/mesa/files/0001-kmsro-add-imx-dcss.patch deleted file mode 100644 index 7f7ab9124..000000000 --- a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/mesa/files/0001-kmsro-add-imx-dcss.patch +++ /dev/null @@ -1,34 +0,0 @@ -Add i.MX8MQ DCSS kmsro support - -Add required dummy entry for NXP's i.MX8MQ DCSS display controller DRM -driver to the kmsro configuration so that the loader will not think it -is a GPU. - -Upstream-Status: pending -Signed-off-by: Scott Murray <scott.murray@konsulko.com> ---- - -diff --git a/src/gallium/targets/dri/meson.build b/src/gallium/targets/dri/meson.build -index ae25a21..17379c7 100644 ---- a/src/gallium/targets/dri/meson.build -+++ b/src/gallium/targets/dri/meson.build -@@ -72,6 +72,7 @@ foreach d : [[with_gallium_kmsro, [ - 'hx8357d_dri.so', - 'ili9225_dri.so', - 'ili9341_dri.so', -+ 'imx-dcss_dri.so', - 'imx-drm_dri.so', - 'ingenic-drm_dri.so', - 'mcde_dri.so', -diff --git a/src/gallium/targets/dri/target.c b/src/gallium/targets/dri/target.c -index f71f690..41c5c75 100644 ---- a/src/gallium/targets/dri/target.c -+++ b/src/gallium/targets/dri/target.c -@@ -97,6 +97,7 @@ DEFINE_LOADER_DRM_ENTRYPOINT(exynos) - DEFINE_LOADER_DRM_ENTRYPOINT(hx8357d) - DEFINE_LOADER_DRM_ENTRYPOINT(ili9225) - DEFINE_LOADER_DRM_ENTRYPOINT(ili9341) -+DEFINE_LOADER_DRM_ENTRYPOINT(imx_dcss) - DEFINE_LOADER_DRM_ENTRYPOINT(imx_drm) - DEFINE_LOADER_DRM_ENTRYPOINT(ingenic_drm) - DEFINE_LOADER_DRM_ENTRYPOINT(mcde) diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/mesa/mesa_%.bbappend b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/mesa/mesa_%.bbappend deleted file mode 100644 index e7633f215..000000000 --- a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/mesa/mesa_%.bbappend +++ /dev/null @@ -1,10 +0,0 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/files:" - -SRC_URI += "file://0001-kmsro-add-imx-dcss.patch" - -# These over-rides should use "use-mainline-bsp" instead when that -# becomes more workable for i.MX8 in upstream meta-freescale. - -USE_OSMESA_ONLY:etnaviv = "no" - -PACKAGECONFIG:append:etnaviv = " gallium etnaviv kmsro" diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bbappend b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bbappend new file mode 100644 index 000000000..ca162e28f --- /dev/null +++ b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_11.0.3.imx.bbappend @@ -0,0 +1,2 @@ +# Use provided hook to disable removal of wayland from PACKAGECONFIG +PACKAGECONFIG_IMX_REMOVALS = "x11" diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_8.0.0.imx.bbappend b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_8.0.0.imx.bbappend deleted file mode 100644 index 270d8e8f5..000000000 --- a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_8.0.0.imx.bbappend +++ /dev/null @@ -1,10 +0,0 @@ -# Work around PACKAGECONFIG:remove of "x11 wayland" added to the recipe -# in meta-freescale commit 5a5c5dd. This can be removed once the issue -# has been resolved by a revert of that breakage upstream. -# What is done below is effectively a disabling of the "wayland" -# PACKAGECONFIG option and then open coding what its effects would -# normally be, since the _remove prevents specifying it in the usual way. -PACKAGECONFIG[wayland] = "" -DEPENDS:append = " virtual/egl virtual/libgles2" -PACKAGECONFIG_CONFARGS:append = " -Dbackend-wayland=true" - diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-imx/0001-enable-mhdp-with-etnaviv.patch b/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-imx/0001-enable-mhdp-with-etnaviv.patch deleted file mode 100644 index 23ca0475a..000000000 --- a/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-imx/0001-enable-mhdp-with-etnaviv.patch +++ /dev/null @@ -1,23 +0,0 @@ -Tweak MHDP driver Kconfig so it can be enabled with etnaviv - -The MHDP driver is needed for using HDMI on the i.MX8MQ EVK, tweak its -Kconfig entry so that it can be enabled when using etnaviv, not just -Vivante. - -Upstream-Status: pending -Signed-off-by: Scott Murray <scott.murray@konsulko.com> ---- - -diff --git a/drivers/gpu/drm/imx/Kconfig b/drivers/gpu/drm/imx/Kconfig -index 63d5f1b532ee..a18ba56aa218 100644 ---- a/drivers/gpu/drm/imx/Kconfig -+++ b/drivers/gpu/drm/imx/Kconfig -@@ -85,7 +85,7 @@ config DRM_IMX_CDNS_MHDP - select DRM_CDNS_DP - select DRM_CDNS_HDMI - select DRM_CDNS_AUDIO -- depends on DRM_IMX -+ depends on DRM_IMX || DRM_ETNAVIV - help - Choose this if you want to use HDMI on i.MX8. - diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-imx/0002-dts-enable-etnaviv.patch b/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-imx/0002-dts-enable-etnaviv.patch index 4ce9b9d38..4ed4b685e 100644 --- a/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-imx/0002-dts-enable-etnaviv.patch +++ b/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-imx/0002-dts-enable-etnaviv.patch @@ -4,15 +4,14 @@ Some further investigation is required into how to manage this upstream in meta-freescale, as it is not required for the i.MX6 platforms AFAIK. Upstream-Status: pending - Signed-off-by: Scott Murray <scott.murray@konsulko.com> --- diff --git a/arch/arm64/boot/dts/freescale/imx8mq-evk.dts b/arch/arm64/boot/dts/freescale/imx8mq-evk.dts -index f2a7e4069a0d..c0b6c5052656 100755 +index c3f8a24c3943..754fbfe30f0a 100755 --- a/arch/arm64/boot/dts/freescale/imx8mq-evk.dts +++ b/arch/arm64/boot/dts/freescale/imx8mq-evk.dts -@@ -1074,7 +1074,7 @@ +@@ -1224,7 +1224,7 @@ &vpu_v4l2 { status = "okay"; }; diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-imx_%.bbappend b/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-imx_%.bbappend index cc26e25c6..7fa055b40 100644 --- a/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-imx_%.bbappend +++ b/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-imx_%.bbappend @@ -1,31 +1,16 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:${THISDIR}/files:" +FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" -require recipes-kernel/linux/linux-yocto-agl.inc +require linux-fslc.inc # These patches and the configuration fragment below will need to be # revisited if/when using IMX_DEFAULT_BSP = "mainline" with i.MX8 -# becomes more feasible with upstream meta-freescale. -SRC_URI:append:etnaviv = " \ - file://0001-enable-mhdp-with-etnaviv.patch \ - file://0002-dts-enable-etnaviv.patch \ -" - -# Make sure these are enabled so that AGL systemd configuration works -AGL_KCONFIG_FRAGMENTS += " \ - tmpfs.cfg \ - namespace.cfg \ - cgroup.cfg \ -" - -# Support for CFG80211 subsystem -AGL_KCONFIG_FRAGMENTS += "cfg80211.cfg" - -# Turn off a couple of things enabled by default by Freescale -# (lock debugging and userspace firmware loader fallback) -AGL_KCONFIG_FRAGMENTS += "fixups.cfg" +# becomes feasible with the linux-fslc kernel. +#SRC_URI:append:etnaviv = " \ +# file://0002-dts-enable-etnaviv.patch \ +#" # Support for i.MX8MQ EVKB (e.g. Broadcom wifi) -AGL_KCONFIG_FRAGMENTS:append:imx8mqevk = " imx8mq-evkb.cfg" +AGL_KCONFIG_FRAGMENTS:append:imx8mq-evk = " imx8mq-evkb.cfg" # Build in etnaviv if required AGL_KCONFIG_FRAGMENTS:append:etnaviv = " etnaviv.cfg" diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-lts_%.bbappend b/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-lts_%.bbappend new file mode 100644 index 000000000..1007f3c7c --- /dev/null +++ b/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc-lts_%.bbappend @@ -0,0 +1 @@ +require linux-fslc.inc diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc.inc b/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc.inc new file mode 100644 index 000000000..948b8c22c --- /dev/null +++ b/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc.inc @@ -0,0 +1,22 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" + +require recipes-kernel/linux/linux-yocto-agl.inc + +# Make sure these are enabled so that AGL systemd configuration works +AGL_KCONFIG_FRAGMENTS += " \ + tmpfs.cfg \ + namespace.cfg \ + cgroup.cfg \ +" + +# Support for CFG80211 subsystem +AGL_KCONFIG_FRAGMENTS += "cfg80211.cfg" + +# Turn off a couple of things enabled by default by Freescale +# (lock debugging and userspace firmware loader fallback) +AGL_KCONFIG_FRAGMENTS += "fixups.cfg" + +do_install:append:cubox-i() { + # Add symlink to work with default Hummingboard 2 u-boot configuration + ln -sf imx6q-hummingboard2.dtb ${D}/boot/imx6q-hummingboard2-emmc.dtb +} diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc_%.bbappend b/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc_%.bbappend index 948b8c22c..1007f3c7c 100644 --- a/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc_%.bbappend +++ b/meta-agl-bsp/meta-freescale-layer/recipes-kernel/linux/linux-fslc_%.bbappend @@ -1,22 +1 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/files:" - -require recipes-kernel/linux/linux-yocto-agl.inc - -# Make sure these are enabled so that AGL systemd configuration works -AGL_KCONFIG_FRAGMENTS += " \ - tmpfs.cfg \ - namespace.cfg \ - cgroup.cfg \ -" - -# Support for CFG80211 subsystem -AGL_KCONFIG_FRAGMENTS += "cfg80211.cfg" - -# Turn off a couple of things enabled by default by Freescale -# (lock debugging and userspace firmware loader fallback) -AGL_KCONFIG_FRAGMENTS += "fixups.cfg" - -do_install:append:cubox-i() { - # Add symlink to work with default Hummingboard 2 u-boot configuration - ln -sf imx6q-hummingboard2.dtb ${D}/boot/imx6q-hummingboard2-emmc.dtb -} +require linux-fslc.inc diff --git a/meta-agl-bsp/meta-qcom/recipes-bsp/96boards-tools/96boards-tools_0.12.bb b/meta-agl-bsp/meta-qcom/recipes-bsp/96boards-tools/96boards-tools_0.12.bb deleted file mode 100644 index 3ea57d770..000000000 --- a/meta-agl-bsp/meta-qcom/recipes-bsp/96boards-tools/96boards-tools_0.12.bb +++ /dev/null @@ -1,32 +0,0 @@ -SUMMARY = "Useful bits an pieces to make 96Boards more standard across the board" -HOMEPAGE = "https://github.com/96boards/96boards-tools" -SECTION = "devel" - -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" - -SRCREV = "ed0f0dbec02c1869a0c4fa0140b4aa5338c9d010" -SRC_URI = "git://github.com/96boards/96boards-tools;branch=master;protocol=https" - -S = "${WORKDIR}/git" - -inherit systemd allarch update-rc.d - -do_install () { - install -d ${D}${sysconfdir}/udev/rules.d - install -m 0755 ${S}/*.rules ${D}${sysconfdir}/udev/rules.d/ - install -d ${D}${sysconfdir}/init.d - install -m 0755 ${S}/resize-disk ${D}${sysconfdir}/init.d/ - - install -d ${D}${systemd_unitdir}/system - install -m 0644 ${S}/resize-helper.service ${D}${systemd_unitdir}/system - - install -d ${D}${sbindir} - install -m 0755 ${S}/resize-helper ${D}${sbindir} -} - -INITSCRIPT_NAME = "resize-disk" -INITSCRIPT_PARAMS = "start 99 5 2 . stop 20 0 1 6 ." - -SYSTEMD_SERVICE:${PN} = "resize-helper.service" -RDEPENDS:${PN} += "e2fsprogs-resize2fs gptfdisk parted util-linux udev" diff --git a/meta-agl-bsp/meta-qcom/recipes-bsp/q6v5-pil/files/qcom-q6v5-pil.service b/meta-agl-bsp/meta-qcom/recipes-bsp/q6v5-pil/files/qcom-q6v5-pil.service deleted file mode 100644 index 3d9cd24bb..000000000 --- a/meta-agl-bsp/meta-qcom/recipes-bsp/q6v5-pil/files/qcom-q6v5-pil.service +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Description=Qualcomm Hexagon PIL setup -After=rmtfs.service -Requires=rmtfs.service - -[Service] -Type=oneshot -RemainAfterExit=yes -ExecStart=/sbin/modprobe -q qcom_q6v5_pil - -[Install] -WantedBy=multi-user.target diff --git a/meta-agl-bsp/meta-qcom/recipes-bsp/q6v5-pil/q6v5-pil.bb b/meta-agl-bsp/meta-qcom/recipes-bsp/q6v5-pil/q6v5-pil.bb deleted file mode 100644 index 14bab2430..000000000 --- a/meta-agl-bsp/meta-qcom/recipes-bsp/q6v5-pil/q6v5-pil.bb +++ /dev/null @@ -1,20 +0,0 @@ -inherit systemd - -SUMMARY = "Systemd unit file for the delay loading Hexagon PIL kernel module" -SECTION = "misc" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" - -SRC_URI += "file://qcom-q6v5-pil.service" - -do_install() { - install -d ${D}${systemd_unitdir}/system/ - install -m 0644 ${WORKDIR}/qcom-q6v5-pil.service ${D}${systemd_unitdir}/system - - # Blacklist qcom_q6v5_pil to prevent modules autoload - # qcom-q6v5-pil.service will do the work after rmtfs done. - install -d ${D}/${sysconfdir}/modprobe.d - echo "blacklist qcom_q6v5_pil" > ${D}/${sysconfdir}/modprobe.d/qcom_q6v5_pil.conf -} - -SYSTEMD_SERVICE:${PN} = "qcom-q6v5-pil.service" diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-bsp/bootfiles/bootfiles.bbappend b/meta-agl-bsp/meta-raspberrypi/recipes-bsp/bootfiles/bootfiles.bbappend deleted file mode 100644 index 59bc5a741..000000000 --- a/meta-agl-bsp/meta-raspberrypi/recipes-bsp/bootfiles/bootfiles.bbappend +++ /dev/null @@ -1 +0,0 @@ -RDEPENDS:${PN}:append:sota += " u-boot-otascript" diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bbappend b/meta-agl-bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bbappend index 4492a9182..248623699 100644 --- a/meta-agl-bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bbappend +++ b/meta-agl-bsp/meta-raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bbappend @@ -44,7 +44,3 @@ do_deploy:append:raspberrypi4() { echo -e "\n[pi4]" >> ${DEPLOYDIR}/bootfiles/config.txt echo "max_framebuffers=2" >> ${DEPLOYDIR}/bootfiles/config.txt } - -do_deploy:append:sota() { - echo "device_tree_address=0x0c800000" >> ${DEPLOYDIR}/bootfiles/config.txt -} diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot-2021.07.inc b/meta-agl-bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot-2021.07.inc deleted file mode 100644 index fe3f656ee..000000000 --- a/meta-agl-bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot-2021.07.inc +++ /dev/null @@ -1,3 +0,0 @@ -SRC_URI = "git://git.denx.de/u-boot.git;branch=master" -SRCREV = "840658b093976390e9537724f802281c9c8439f5" -LIC_FILES_CHKSUM = "file://Licenses/README;md5=5a7450c57ffe5ae63fd732446b988025" diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot-tools_2021.07.bb b/meta-agl-bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot-tools_2021.07.bb deleted file mode 100644 index a963d3fff..000000000 --- a/meta-agl-bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot-tools_2021.07.bb +++ /dev/null @@ -1,2 +0,0 @@ -require recipes-bsp/u-boot/u-boot-tools_2020.01.bb -require u-boot-2021.07.inc diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot_2021.07.bb b/meta-agl-bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot_2021.07.bb deleted file mode 100644 index 2077262a3..000000000 --- a/meta-agl-bsp/meta-raspberrypi/recipes-bsp/u-boot/u-boot_2021.07.bb +++ /dev/null @@ -1,2 +0,0 @@ -require recipes-bsp/u-boot/u-boot_2020.01.bb -require u-boot-2021.07.inc diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-graphics/wayland/weston-ini-conf.bbappend b/meta-agl-bsp/meta-raspberrypi/recipes-graphics/wayland/weston-ini-conf.bbappend deleted file mode 100644 index 5f8af211a..000000000 --- a/meta-agl-bsp/meta-raspberrypi/recipes-graphics/wayland/weston-ini-conf.bbappend +++ /dev/null @@ -1,3 +0,0 @@ -FILESEXTRAPATHS:prepend:raspberrypi := "${THISDIR}/${PN}:" - -SRC_URI:append:raspberrypi = " file://dsi.cfg" diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-graphics/wayland/weston-ini-conf/dsi.cfg b/meta-agl-bsp/meta-raspberrypi/recipes-graphics/wayland/weston-ini-conf/dsi.cfg deleted file mode 100644 index 72a6d2bf8..000000000 --- a/meta-agl-bsp/meta-raspberrypi/recipes-graphics/wayland/weston-ini-conf/dsi.cfg +++ /dev/null @@ -1,5 +0,0 @@ -# Support the Raspberry Pi Foundation 7" tablet which uses the DSI connector -# rather than HDMI. -[output] -name=DSI-1 -transform=270 diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-graphics/wayland/weston-ini-conf/hdmi-a-1-270-720p.cfg b/meta-agl-bsp/meta-raspberrypi/recipes-graphics/wayland/weston-ini-conf/hdmi-a-1-270-720p.cfg deleted file mode 100644 index e1c9db1a8..000000000 --- a/meta-agl-bsp/meta-raspberrypi/recipes-graphics/wayland/weston-ini-conf/hdmi-a-1-270-720p.cfg +++ /dev/null @@ -1,7 +0,0 @@ -# A display is connected to HDMI-A-1 and needs to be rotated 270 degrees -# to have a proper orientation of the homescreen. For example the various sizes -# of the GeChic display or the Dell display. -[output] -name=HDMI-A-1 -transform=270 -mode=1280x720 diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-kernel/create-combined-dtb/create-combined-dtb_1.0.0.bb b/meta-agl-bsp/meta-raspberrypi/recipes-kernel/create-combined-dtb/create-combined-dtb_1.0.0.bb index bcb92b23d..c5edbe1dc 100644 --- a/meta-agl-bsp/meta-raspberrypi/recipes-kernel/create-combined-dtb/create-combined-dtb_1.0.0.bb +++ b/meta-agl-bsp/meta-raspberrypi/recipes-kernel/create-combined-dtb/create-combined-dtb_1.0.0.bb @@ -15,28 +15,19 @@ S = "${WORKDIR}" do_compile[depends] += "virtual/kernel:do_deploy" do_compile () { - # Official touchscreen setup (rpi3b/rpi3b dtb, VC4DTBO and ft5406) - if [ -f "${DEPLOY_DIR_IMAGE}/bcm2710-rpi-3-b-plus.dtb" ]; then - fdtoverlay -v -i ${DEPLOY_DIR_IMAGE}/bcm2710-rpi-3-b-plus.dtb -o bcm2710-rpi-3-b-plus+vc4+ft5406.dtb ${DEPLOY_DIR_IMAGE}/rpi-ft5406.dtbo ${DEPLOY_DIR_IMAGE}/${VC4DTBO}.dtbo - fi - if [ -f "${DEPLOY_DIR_IMAGE}/bcm2710-rpi-3-b.dtb" ]; then - fdtoverlay -v -i ${DEPLOY_DIR_IMAGE}/bcm2710-rpi-3-b.dtb -o bcm2710-rpi-3-b+vc4+ft5406.dtb ${DEPLOY_DIR_IMAGE}/rpi-ft5406.dtbo ${DEPLOY_DIR_IMAGE}/${VC4DTBO}.dtbo + # Plain VC4 (HDMI) + if [ -f "${DEPLOY_DIR_IMAGE}/bcm2711-rpi-4-b.dtb" ]; then + fdtoverlay -v -i ${DEPLOY_DIR_IMAGE}/bcm2711-rpi-4-b.dtb -o bcm2711-rpi-4-b+vc4.dtb \ + ${DEPLOY_DIR_IMAGE}/${VC4DTBO}-pi4.dtbo fi - # NOTE: meta-updater currently disables rpi-ft5406.dtbo on rpi4, so need to check if it is present + + # VC4 + LCD if [ -f "${DEPLOY_DIR_IMAGE}/bcm2711-rpi-4-b.dtb" -a -f "${DEPLOY_DIR_IMAGE}/rpi-ft5406.dtbo" ]; then - fdtoverlay -v -i ${DEPLOY_DIR_IMAGE}/bcm2711-rpi-4-b.dtb -o bcm2711-rpi-4-b+vc4+ft5406.dtb ${DEPLOY_DIR_IMAGE}/rpi-ft5406.dtbo ${DEPLOY_DIR_IMAGE}/${VC4DTBO}.dtbo + fdtoverlay -v -i ${DEPLOY_DIR_IMAGE}/bcm2711-rpi-4-b.dtb -o bcm2711-rpi-4-b+vc4+ft5406.dtb \ + ${DEPLOY_DIR_IMAGE}/rpi-ft5406.dtbo \ + ${DEPLOY_DIR_IMAGE}/${VC4DTBO}-pi4.dtbo fi - # HDMI screen setup (rpi3b/rpi3b dtb and VC4DTBO) - if [ -f "${DEPLOY_DIR_IMAGE}/bcm2710-rpi-3-b-plus.dtb" ]; then - fdtoverlay -v -i ${DEPLOY_DIR_IMAGE}/bcm2710-rpi-3-b-plus.dtb -o bcm2710-rpi-3-b-plus+vc4.dtb ${DEPLOY_DIR_IMAGE}/${VC4DTBO}.dtbo - fi - if [ -f "${DEPLOY_DIR_IMAGE}/bcm2710-rpi-3-b.dtb" ]; then - fdtoverlay -v -i ${DEPLOY_DIR_IMAGE}/bcm2710-rpi-3-b.dtb -o bcm2710-rpi-3-b+vc4.dtb ${DEPLOY_DIR_IMAGE}/${VC4DTBO}.dtbo - fi - if [ -f "${DEPLOY_DIR_IMAGE}/bcm2711-rpi-4-b.dtb" ]; then - fdtoverlay -v -i ${DEPLOY_DIR_IMAGE}/bcm2711-rpi-4-b.dtb -o bcm2711-rpi-4-b+vc4.dtb ${DEPLOY_DIR_IMAGE}/${VC4DTBO}.dtbo - fi } do_deploy () { @@ -44,21 +35,9 @@ do_deploy () { if [ -f "${S}/bcm2711-rpi-4-b+vc4+ft5406.dtb" ]; then install -m 0644 ${S}/bcm2711-rpi-4-b+vc4+ft5406.dtb ${DEPLOY_DIR_IMAGE} fi - if [ -f "${S}/bcm2710-rpi-3-b+vc4+ft5406.dtb" ]; then - install -m 0644 ${S}/bcm2710-rpi-3-b+vc4+ft5406.dtb ${DEPLOY_DIR_IMAGE} - fi - if [ -f "${S}/bcm2710-rpi-3+vc4+ft5406.dtb" ]; then - install -m 0644 ${S}/bcm2710-rpi-3+vc4+ft5406.dtb ${DEPLOY_DIR_IMAGE} - fi if [ -f "${S}/bcm2711-rpi-4-b+vc4.dtb" ]; then install -m 0644 ${S}/bcm2711-rpi-4-b+vc4.dtb ${DEPLOY_DIR_IMAGE} fi - if [ -f "${S}/bcm2710-rpi-3-b+vc4.dtb" ]; then - install -m 0644 ${S}/bcm2710-rpi-3-b+vc4.dtb ${DEPLOY_DIR_IMAGE} - fi - if [ -f "${S}/bcm2710-rpi-3+vc4.dtb" ]; then - install -m 0644 ${S}/bcm2710-rpi-3+vc4.dtb ${DEPLOY_DIR_IMAGE} - fi } addtask deploy after do_install diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-kernel/dtc/dtc_1.6.0.bbappend b/meta-agl-bsp/meta-raspberrypi/recipes-kernel/dtc/dtc_1.7.0.bbappend index a28a9e748..a28a9e748 100644 --- a/meta-agl-bsp/meta-raspberrypi/recipes-kernel/dtc/dtc_1.6.0.bbappend +++ b/meta-agl-bsp/meta-raspberrypi/recipes-kernel/dtc/dtc_1.7.0.bbappend diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/0001-mconf-menuconfig.patch b/meta-agl-bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/0001-mconf-menuconfig.patch index 3dc71ff22..7f0979ca9 100644 --- a/meta-agl-bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/0001-mconf-menuconfig.patch +++ b/meta-agl-bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/0001-mconf-menuconfig.patch @@ -40,9 +40,9 @@ index c812872d7f9d..42d20819025c 100755 + exit 0 +fi + - if [ -n "$(command -v pkg-config)" ]; then - if pkg-config --exists $PKG; then - echo cflags=\"$(pkg-config --cflags $PKG)\" + if [ -n "$(command -v ${HOSTPKG_CONFIG})" ]; then + if ${HOSTPKG_CONFIG} --exists $PKG; then + echo cflags=\"$(${HOSTPKG_CONFIG} --cflags $PKG)\" -- 2.17.1 diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/0002-Disable-DMA-in-sdhci-driver.patch b/meta-agl-bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/0002-Disable-DMA-in-sdhci-driver.patch deleted file mode 100644 index 04a8733f2..000000000 --- a/meta-agl-bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/0002-Disable-DMA-in-sdhci-driver.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 758bc9b917469bc4e527dc3aae821c91cbc3d426 Mon Sep 17 00:00:00 2001 -From: Stewart Hildebrand <stewart.hildebrand@dornerworks.com> -Date: Thu, 18 Jul 2019 00:01:27 -0400 -Subject: [PATCH 2/4] Disable DMA in sdhci driver - ---- - drivers/mmc/host/sdhci-iproc.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/drivers/mmc/host/sdhci-iproc.c b/drivers/mmc/host/sdhci-iproc.c -index 983cddce9..150f7bfc8 100644 ---- a/drivers/mmc/host/sdhci-iproc.c -+++ b/drivers/mmc/host/sdhci-iproc.c -@@ -252,6 +252,8 @@ static const struct sdhci_iproc_data bcm2835_data = { - - static const struct sdhci_pltfm_data sdhci_bcm2838_pltfm_data = { - .ops = &sdhci_iproc_32only_ops, -+ .quirks = SDHCI_QUIRK_BROKEN_DMA | -+ SDHCI_QUIRK_BROKEN_ADMA, - }; - - static const struct sdhci_iproc_data bcm2838_data = { --- -2.17.1 - diff --git a/meta-agl-bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.4.bbappend b/meta-agl-bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.4.bbappend deleted file mode 100644 index 2836918c7..000000000 --- a/meta-agl-bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.4.bbappend +++ /dev/null @@ -1,4 +0,0 @@ -# For Xen -SRC_URI:append =" \ - ${@bb.utils.contains('AGL_XEN_WANTED','1','file://0002-Disable-DMA-in-sdhci-driver.patch','',d)} \ -" diff --git a/meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas_%.bbappend b/meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas_%.bbappend new file mode 100644 index 000000000..d565da8ac --- /dev/null +++ b/meta-agl-bsp/meta-rcar-gateway/recipes-kernel/linux/linux-renesas_%.bbappend @@ -0,0 +1,11 @@ +do_install:append () { + + # Remove firmware file that is not packaged in the kernel. + # It throws an error during do_package. + # It seems to be moved out of the kernel in later BSP versions. + rm -rf ${D}/lib/firmware/r8a779f0_ufs.bin + rm -rf ${D}/lib/firmware + rm -rf ${D}/lib + +} + diff --git a/meta-agl-bsp/meta-rcar-gen3-adas/conf/NOTES b/meta-agl-bsp/meta-rcar-gen3-adas/conf/NOTES index e4f5e7d9b..296dd5e19 100644 --- a/meta-agl-bsp/meta-rcar-gen3-adas/conf/NOTES +++ b/meta-agl-bsp/meta-rcar-gen3-adas/conf/NOTES @@ -5,7 +5,7 @@ # E.g. MACHINE_FEATURE. Should *not* be in layer.conf !! # Radio packages -#IMAGE_INSTALL:append:rcar-gen3 += " \ +#IMAGE_INSTALL:append:rcar-gen3 = " \ # si-tools \ # si-init \ # linux-firmware-wl18xx \ diff --git a/meta-agl-bsp/meta-rcar-gen3-adas/conf/include/rcar-gen3-adas.inc b/meta-agl-bsp/meta-rcar-gen3-adas/conf/include/rcar-gen3-adas.inc index eb1da3d35..0c344a471 100644 --- a/meta-agl-bsp/meta-rcar-gen3-adas/conf/include/rcar-gen3-adas.inc +++ b/meta-agl-bsp/meta-rcar-gen3-adas/conf/include/rcar-gen3-adas.inc @@ -4,16 +4,14 @@ # Add a feature as a low-impact way to detect Kingfisher support in # recipes. -AGL_FEATURES:append = " kingfisher" +AGL_FEATURES:append:rcar-gen3 = " kingfisher" -PREFERRED_RPROVIDER_virtual/gpsd-conf ?= "gpsd-kingfisher-conf" - -IMAGE_NAME = "${IMAGE_BASENAME}-${MACHINE}-kf${IMAGE_VERSION_SUFFIX}" -IMAGE_LINK_NAME = "${IMAGE_BASENAME}-${MACHINE}-kf" -TOOLCHAIN_OUTPUTNAME = "${SDK_NAME}-kf-toolchain-${SDK_VERSION}" +IMAGE_NAME:rcar-gen3 = "${IMAGE_BASENAME}-${MACHINE}-kf${IMAGE_VERSION_SUFFIX}" +IMAGE_LINK_NAME:rcar-gen3 = "${IMAGE_BASENAME}-${MACHINE}-kf" +TOOLCHAIN_OUTPUTNAME:rcar-gen3 = "${SDK_NAME}-kf-toolchain-${SDK_VERSION}" # Radio packages -IMAGE_INSTALL:append:rcar-gen3 += " \ +IMAGE_INSTALL:append:rcar-gen3 = " \ si-tools \ si-init \ linux-firmware-wl18xx \ diff --git a/meta-agl-bsp/meta-rcar-gen3-adas/conf/layer.conf b/meta-agl-bsp/meta-rcar-gen3-adas/conf/layer.conf index 75bfcfcc7..bae421a50 100644 --- a/meta-agl-bsp/meta-rcar-gen3-adas/conf/layer.conf +++ b/meta-agl-bsp/meta-rcar-gen3-adas/conf/layer.conf @@ -15,4 +15,4 @@ BBFILE_COLLECTIONS += "rcar-gen3-cogent" BBFILE_PATTERN_rcar-gen3-cogent := "^${LAYERDIR}/" BBFILE_PRIORITY_rcar-gen3-cogent = "7" -LAYERSERIES_COMPAT_rcar-gen3-cogent = "dunfell" +LAYERSERIES_COMPAT_rcar-gen3-cogent = "scarthgap" diff --git a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0004-ADSP-enable-and-add-sound-hardware-abstraction_kf.patch b/meta-agl-bsp/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0004-ADSP-enable-and-add-sound-hardware-abstraction_kf.patch deleted file mode 100644 index 92f5af88c..000000000 --- a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0004-ADSP-enable-and-add-sound-hardware-abstraction_kf.patch +++ /dev/null @@ -1,58 +0,0 @@ -The ADSP on Renesas SoCs required a reserved memory area to become -enabled, and this needs to be done manually. - -This patch adds sound hardware abstraction information for the m3ulcb -and m3ulcb-kf (kingfisher) device trees. This is helpful on-board the -ADSP for dynamically determining sound hardware at runtime, allowing -single binaries to be used between the two boards. - -Future work will incorporate the h3ulcb and Salvator boards into the -abstraction. - -Signed-off-by: Ronan Le Martret <ronan.lemartret@iot.bzh> -Signed-off-by: Mark Farrugia <mark.farrugia@fiberdyne.com.au> ---- -diff --git a/arch/arm64/boot/dts/renesas/r8a7796-m3ulcb-kf.dts b/arch/arm64/boot/dts/renesas/r8a7796-m3ulcb-kf.dts -index de2390f009e7..4ccfa8315d17 100644 ---- a/arch/arm64/boot/dts/renesas/r8a7796-m3ulcb-kf.dts -+++ b/arch/arm64/boot/dts/renesas/r8a7796-m3ulcb-kf.dts -@@ -15,6 +15,39 @@ - "renesas,r8a7796"; - }; - -+ -+&adsp { -+ -+ /* ADSP playback setting for pcm3168 */ -+ adsp_playback0: adsp,playback { -+ mode = "tdm"; -+ clock-mode = "master"; -+ bus-width = <24>; -+ ssi = <3>; -+ bus-if = <0>; -+ channels = <8>; -+ pin-share-ssi = <4>; -+ }; -+ -+ /* ADSP capture setting for pcm3168 */ -+ adsp_capture0: adsp,capture { -+ mode = "tdm"; -+ clock-mode = "slave"; -+ bus-width = <24>; -+ ssi = <4>; -+ bus-if = <0>; -+ channels = <8>; -+ pin-share-ssi = <3>; -+ }; -+ -+ adsp,ports { -+ port@0 { -+ playback = <&adsp_playback0>; -+ capture = <&adsp_capture0>; -+ }; -+ }; -+}; -+ - &du { - ports { - port@0 { diff --git a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-navigation/gpsd/gpsd-kingfisher-conf_1.0.bb b/meta-agl-bsp/meta-rcar-gen3-adas/recipes-navigation/gpsd/gpsd-machine-conf_1.0.bbappend index 918e29fc1..51604706c 100644 --- a/meta-agl-bsp/meta-rcar-gen3-adas/recipes-navigation/gpsd/gpsd-kingfisher-conf_1.0.bb +++ b/meta-agl-bsp/meta-rcar-gen3-adas/recipes-navigation/gpsd/gpsd-machine-conf_1.0.bbappend @@ -1,27 +1,23 @@ -SUMMARY = "King fisher specific gpsd config" -LICENSE = "BSD" -LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/BSD;md5=3775480a712fc46a69647678acb234cb" +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" -SRC_URI = " \ - file://gpsd.kingfisher \ -" +SRC_URI = "file://gpsd.kingfisher" inherit update-alternatives -RPROVIDES:${PN} += "virtual/gpsd-conf" - -ALTERNATIVE:${PN} = "gpsd-defaults" -ALTERNATIVE_LINK_NAME[gpsd-defaults] = "${sysconfdir}/default/gpsd" -ALTERNATIVE_TARGET[gpsd-defaults] = "${sysconfdir}/default/gpsd.kingfisher" -ALTERNATIVE_PRIORITY[gpsd-defaults] = "20" - -COMPATIBLE_MACHINE = "ulcb" -PACKAGE_ARCH = "${MACHINE_ARCH}" +do_configure[noexec] = "1" +do_compile[noexec] = "1" do_install() { install -d ${D}/${sysconfdir}/default install -m 0644 ${WORKDIR}/gpsd.kingfisher ${D}/${sysconfdir}/default/gpsd.kingfisher } -FILES:${PN} = "${sysconfdir}/default/gpsd.kingfisher" +COMPATIBLE_MACHINE = "ulcb" +PACKAGE_ARCH = "${MACHINE_ARCH}" + CONFFILES:${PN} = "${sysconfdir}/default/gpsd.kingfisher" + +ALTERNATIVE:${PN} = "gpsd-defaults" +ALTERNATIVE_LINK_NAME[gpsd-defaults] = "${sysconfdir}/default/gpsd" +ALTERNATIVE_TARGET[gpsd-defaults] = "${sysconfdir}/default/gpsd.kingfisher" +ALTERNATIVE_PRIORITY[gpsd-defaults] = "20" diff --git a/meta-agl-bsp/meta-rcar-gen3/include/checksum_control_files.inc b/meta-agl-bsp/meta-rcar-gen3/include/checksum_control_files.inc index 069643bb9..6c9f49c3b 100644 --- a/meta-agl-bsp/meta-rcar-gen3/include/checksum_control_files.inc +++ b/meta-agl-bsp/meta-rcar-gen3/include/checksum_control_files.inc @@ -1,15 +1,16 @@ -CTL_CHECKSUM[r8a77951_linux_gsx_binaries_gles.tar.bz2]="997c39ac068d8eb3800b430c3911d7a5" -CTL_CHECKSUM[r8a77960_linux_gsx_binaries_gles.tar.bz2]="537970d5a7d110169a09698de04bbb76" -CTL_CHECKSUM[GSX_KM_H3.tar.bz2]="dd331b64c0c46fe3d521d394966c50b2" -CTL_CHECKSUM[GSX_KM_M3.tar.bz2]="fb4b6fb8d3243bb7d294712ed09b63ee" -CTL_CHECKSUM[RTM8RC0000ZMX0DQ00JFL3E.tar.bz2]="758c163341efb58d8d00d280d89e97ea" -CTL_CHECKSUM[RTM8RC0000ZAD1LQ00JPL3E.tar.gz]="524ee69e8825b7c70dcda3730107fcf8" -CTL_CHECKSUM[RTM8RC0000ZAE1LQ00JPL3E.tar.gz]="088e5eee4ec216481313fb17dd6bccd4" -CTL_CHECKSUM[RTM8RC0000ZMD0LQ00JPL3E.tar.bz2]="1a6d2386cc64c4f604b2e4f96a328d85" -CTL_CHECKSUM[RTM8RC0000ZMD1LQ00JPL3E.tar.bz2]="226ed28a7b068c0110db894ab2a8a6e1" -CTL_CHECKSUM[RTM8RC0000ZME0LQ00JPL3E.tar.bz2]="bfcb34b3d2e11adda20b9584dd4e77ca" -CTL_CHECKSUM[RTM8RC0000ZME1LQ00JPL3E.tar.bz2]="61fd1ee55d656703dc20317807113c52" -CTL_CHECKSUM[RTM8RC0000ZMX0LQ00JPL3E.tar.bz2]="8e322ae8be6507022aadbc50f005b389" -CTL_CHECKSUM[RTM8RC0000ZND1LQ00JPL3E.tar.gz]="ef6a1eec2585ef553d90fd8ca18285f2" -CTL_CHECKSUM[RTM8RC0000ZNE1LQ00JPL3E.tar.gz]="b88faadc88c134f1e72ec13f07bc84bb" -CTL_CHECKSUM[RTM8RC0000ZNX0LQ00JPL3E.tar.gz]="03542651835eb7a054925fac691ffb2b" +CTL_CHECKSUM[r8a77951_linux_gsx_binaries_gles.tar.bz2]="06cc04c52f56048dbc00ead14447cb35" +CTL_CHECKSUM[r8a77960_linux_gsx_binaries_gles.tar.bz2]="a24be039f1c294035416dbd77fa10f4a" +CTL_CHECKSUM[GSX_KM_H3.tar.bz2]="563ff3f5d5dc8b40d19d0b6e7484bf22" +CTL_CHECKSUM[GSX_KM_M3.tar.bz2]="7cbbffb874b30e36cc2c7751573e468b" +CTL_CHECKSUM[RTM8RC0000ZMX0DQ00JFL3E.tar.bz2]="2ee662978a45fc7c7cf2cef0e4bf1e33" +CTL_CHECKSUM[RTM8RC0000ZAD1LQ00JPL3E.tar.gz]="f59cb979a030a3545a6c0b2337e8ea0e" +CTL_CHECKSUM[RTM8RC0000ZAE1LQ00JPL3E.tar.gz]="7bdfac397034e8e13425cd83e3bd5090" +CTL_CHECKSUM[RTM8RC0000ZMD0LQ00JPL3E.tar.bz2]="8d774178a3fe5ddac0cc5bd16bc58e3e" +CTL_CHECKSUM[RTM8RC0000ZMD1LQ00JPL3E.tar.bz2]="3f30a263a038d148b2af445bc09dc4b7" +CTL_CHECKSUM[RTM8RC0000ZME0LQ00JPL3E.tar.bz2]="8f83d1c3947904e48316faa058c196c7" +CTL_CHECKSUM[RTM8RC0000ZME1LQ00JPL3E.tar.bz2]="89d4ce58062ef956fa2b8ef1bd8a66f3" +CTL_CHECKSUM[RTM8RC0000ZMX0LQ00JPL3E.tar.bz2]="035361ad4715bbb491ee23d80bc50e3a" +CTL_CHECKSUM[RTM8RC0000ZND1LQ00JPL3E.tar.gz]="b56fa5404bdee152b557869390783eb4" +CTL_CHECKSUM[RTM8RC0000ZNE1LQ00JPL3E.tar.gz]="63880c583eb132b868a074db3d39c8ee" +CTL_CHECKSUM[RTM8RC0000ZNX0LQ00JPL3E.tar.gz]="53ff1eb5de6c5345bd24e8e3605eb82d" + diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/arm-trusted-firmware/arm-trusted-firmware_git.bbappend b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/arm-trusted-firmware/arm-trusted-firmware_git.bbappend index 4ba36ca2c..f4d086938 100644 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/arm-trusted-firmware/arm-trusted-firmware_git.bbappend +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/arm-trusted-firmware/arm-trusted-firmware_git.bbappend @@ -1,5 +1,9 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/files:" +# Boot Normal World in EL2: this define configures ATF (SPSR register) to boot +# BL33 in EL2. +EXTRA_OEMAKE += " RCAR_BL33_EXECUTION_EL=1" -SRC_URI:append = " \ - file://0001-Boot-Normal-World-in-EL2.patch \ -" +do_ipl_opt_deploy:prepend () { + # Work around bug in BSP recipe, it can fail if nothing else has + # happened to run first and create the directory. + install -d ${DEPLOY_DIR_IMAGE} +} diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/arm-trusted-firmware/files/0001-Boot-Normal-World-in-EL2.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/arm-trusted-firmware/files/0001-Boot-Normal-World-in-EL2.patch deleted file mode 100644 index 6ce9c0f9d..000000000 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/arm-trusted-firmware/files/0001-Boot-Normal-World-in-EL2.patch +++ /dev/null @@ -1,28 +0,0 @@ -From c97f38b09f8b7d9c57a6e6f500c6ba8f7abd9914 Mon Sep 17 00:00:00 2001 -From: Michele Paolino <m.paolino@virtualopensystems.com> -Date: Fri, 19 May 2017 14:50:55 +0200 -Subject: [PATCH] Boot Normal World in EL2 - -This patch configures ATF (SPSR register) to boot BL33 in EL2. - -Signed-off-by: Michele Paolino <m.paolino@virtualopensystems.com> ---- - plat/renesas/rcar/platform.mk | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/plat/renesas/rcar/platform.mk b/plat/renesas/rcar/platform.mk -index ef7bf0f..06bc592 100644 ---- a/plat/renesas/rcar/platform.mk -+++ b/plat/renesas/rcar/platform.mk -@@ -186,7 +186,7 @@ $(eval $(call add_define,RCAR_DRAM_SPLIT)) - - # Process RCAR_BL33_EXECUTION_EL flag - ifndef RCAR_BL33_EXECUTION_EL --RCAR_BL33_EXECUTION_EL := 0 -+RCAR_BL33_EXECUTION_EL := 1 - endif - $(eval $(call add_define,RCAR_BL33_EXECUTION_EL)) - --- -2.7.4 - diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/bootfiles/renesas-ota-bootfiles.bb b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/bootfiles/renesas-ota-bootfiles.bb index e8235b9bd..d46f4d885 100644 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/bootfiles/renesas-ota-bootfiles.bb +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/bootfiles/renesas-ota-bootfiles.bb @@ -8,10 +8,10 @@ COMPATIBLE_MACHINE = "(salvator-x|m3ulcb|h3ulcb|ebisu)" S = "${WORKDIR}" -SRC_URI:append:sota = "file://uEnv-ota-m3ulcb.txt \ - file://uEnv-ota-h3ulcb.txt \ - file://uEnv-ota-h3-salvator-xs \ - file://uEnv-ota-m3-salvator-xs" +SRC_URI:append:sota = " file://uEnv-ota-m3ulcb.txt \ + file://uEnv-ota-h3ulcb.txt \ + file://uEnv-ota-h3-salvator-xs \ + file://uEnv-ota-m3-salvator-xs" do_deploy() { install -d ${DEPLOYDIR}/${PN} } diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples_git.bb b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples_git.bb index 9d06df251..7ff677c80 100644 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples_git.bb +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples_git.bb @@ -1,6 +1,6 @@ SUMMARY = "OP-TEE examples" -LICENSE = "GPLv2" +LICENSE = "GPL-2.0-only" LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=cd95ab417e23b94f381dafc453d70c30" diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test_git.bb b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test_git.bb index 2feda0eab..b66f0676e 100644 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test_git.bb +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test_git.bb @@ -1,6 +1,6 @@ DESCRIPTION = "OP-TEE TEST" -LICENSE = "GPLv2 & BSD-2-Clause" +LICENSE = "GPL-2.0-only & BSD-2-Clause" LIC_FILES_CHKSUM = "file://${S}/host/LICENSE;md5=b234ee4d69f5fce4486a80fdaf4a4263" PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-user-app-template_git.bb b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-user-app-template_git.bb index 1577f8f56..2b93af710 100644 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-user-app-template_git.bb +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-user-app-template_git.bb @@ -1,6 +1,6 @@ SUMMARY = "OP-TEE user_app_template" -LICENSE = "GPLv2" +LICENSE = "GPL-2.0-only" LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=cd95ab417e23b94f381dafc453d70c30" PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/u-boot/files/remove-redundant-yyloc-global.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/u-boot/files/remove-redundant-yyloc-global.patch deleted file mode 100644 index 2a184e57e..000000000 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/u-boot/files/remove-redundant-yyloc-global.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 018921ee79d3f30893614b3b2b63b588d8544f73 Mon Sep 17 00:00:00 2001 -From: Peter Robinson <pbrobinson@gmail.com> -Date: Thu, 30 Jan 2020 09:37:15 +0000 -Subject: [PATCH] Remove redundant YYLOC global declaration - -Same as the upstream fix for building dtc with gcc 10. - -Signed-off-by: Peter Robinson <pbrobinson@gmail.com> ---- - scripts/dtc/dtc-lexer.l | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l -index fd825ebba6..24af549977 100644 ---- a/scripts/dtc/dtc-lexer.l -+++ b/scripts/dtc/dtc-lexer.l -@@ -38,7 +38,6 @@ LINECOMMENT "//".*\n - #include "srcpos.h" - #include "dtc-parser.tab.h" - --YYLTYPE yylloc; - extern bool treesource_error; - - /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ --- -2.26.2 - diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/u-boot/u-boot_2020.01.bbappend b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/u-boot/u-boot_2020.01.bbappend deleted file mode 100644 index ec75d0585..000000000 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/u-boot/u-boot_2020.01.bbappend +++ /dev/null @@ -1,3 +0,0 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/files:" - -SRC_URI:append = " file://remove-redundant-yyloc-global.patch " diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-graphics/gles-module/gles-user-module.bbappend b/meta-agl-bsp/meta-rcar-gen3/recipes-graphics/gles-module/gles-user-module.bbappend index 66b9c46ed..8f2d47adc 100644 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-graphics/gles-module/gles-user-module.bbappend +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-graphics/gles-module/gles-user-module.bbappend @@ -1,7 +1,3 @@ require checksum_control.inc RDEPENDS:${PN}:append = " wayland-wsegl" - -do_install:append(){ - sed -i 's/GROUP="video"/GROUP="display"/g' ${D}${sysconfdir}/udev/rules.d/72-pvr-seat.rules -} diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-graphics/virtual-gles-user-module/virtual-gles-user-module.bb b/meta-agl-bsp/meta-rcar-gen3/recipes-graphics/virtual-gles-user-module/virtual-gles-user-module.bb index a477e1c3c..76d3ea88f 100644 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-graphics/virtual-gles-user-module/virtual-gles-user-module.bb +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-graphics/virtual-gles-user-module/virtual-gles-user-module.bb @@ -1,6 +1,6 @@ DESCRIPTION = "Virtual gles-module" -LICENSE="GPLv2" +LICENSE="GPL-2.0-only" DEPENDS = "gles-user-module wayland-kms libgbm" diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/kernel-module-vspmif/kernel-module-vspmif.bbappend b/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/kernel-module-vspmif/kernel-module-vspm-if.bbappend index 5efe01045..5efe01045 100644 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/kernel-module-vspmif/kernel-module-vspmif.bbappend +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/kernel-module-vspmif/kernel-module-vspm-if.bbappend diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/linux/files/Set_GOV_PERFORMANCE.cfg b/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/linux/files/Set_GOV_PERFORMANCE.cfg new file mode 100644 index 000000000..b020174e8 --- /dev/null +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/linux/files/Set_GOV_PERFORMANCE.cfg @@ -0,0 +1,2 @@ +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/linux/files/vivid.cfg b/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/linux/files/vivid.cfg new file mode 100644 index 000000000..3c3574346 --- /dev/null +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/linux/files/vivid.cfg @@ -0,0 +1,6 @@ +CONFIG_V4L_TEST_DRIVERS=y +CONFIG_MEDIA_CONTROLLER_REQUEST_API=y +CONFIG_MEDIA_TEST_SUPPORT=y +CONFIG_VIDEO_V4L2_TPG=m +CONFIG_VIDEO_VIVID=m +CONFIG_VIDEO_VIVID_MAX_DEVS=64 diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/linux/linux-renesas_%.bbappend b/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/linux/linux-renesas_%.bbappend index eccac305a..78996bf0a 100644 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/linux/linux-renesas_%.bbappend +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-kernel/linux/linux-renesas_%.bbappend @@ -8,6 +8,8 @@ SRC_URI:append = " \ " AGL_KCONFIG_FRAGMENTS += "namespace_fix.cfg" +AGL_KCONFIG_FRAGMENTS += "Set_GOV_PERFORMANCE.cfg" +AGL_KCONFIG_FRAGMENTS += "vivid.cfg" # For Xen AGL_KCONFIG_FRAGMENTS += " \ diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.%.bbappend b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.%.bbappend new file mode 100644 index 000000000..eee123cf4 --- /dev/null +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.%.bbappend @@ -0,0 +1,5 @@ +# Enable here for now due to meta-rcar-gen3 bbappends being masked +# out, can be removed once gstreamer 1.22.x is properly supported +# there. +EXTRA_OECONF += "--enable-kms" +PACKAGECONFIG:append = " kms" diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/mmngr-module/mmngr-user-module.bbappend b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/mmngr-module/mmngr-user-module.bbappend new file mode 100644 index 000000000..9d3f5c670 --- /dev/null +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/mmngr-module/mmngr-user-module.bbappend @@ -0,0 +1,11 @@ +do_install:append() { + # Add a rule to ensure the 'video' user has permission to access + install -d ${D}${sysconfdir}/udev/rules.d + cat >${D}${sysconfdir}/udev/rules.d/56-rgnmm.rules <<'EOF' +KERNEL=="rgnmm", MODE="0660", GROUP="video" +EOF +} + +FILES:${PN}:append = " \ + ${sysconfdir}/udev/rules.d/*.rules \ +" diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/mmngr-module/mmngrbuf-user-module.bbappend b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/mmngr-module/mmngrbuf-user-module.bbappend new file mode 100644 index 000000000..640e52651 --- /dev/null +++ b/meta-agl-bsp/meta-rcar-gen3/recipes-multimedia/mmngr-module/mmngrbuf-user-module.bbappend @@ -0,0 +1,11 @@ +do_install:append() { + # Add a rule to ensure the 'video' group has permission to access + install -d ${D}${sysconfdir}/udev/rules.d + cat >${D}${sysconfdir}/udev/rules.d/56-rgnmmbuf.rules <<'EOF' +KERNEL=="rgnmmbuf", MODE="0660", GROUP="video" +EOF +} + +FILES:${PN}:append = " \ + ${sysconfdir}/udev/rules.d/*.rules \ +" diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-platform/packagegroups/packagegroup-agl-graphical-multimedia.bbappend b/meta-agl-bsp/meta-rcar-gen3/recipes-platform/packagegroups/packagegroup-agl-graphical-multimedia.bbappend deleted file mode 100644 index 53eb1c540..000000000 --- a/meta-agl-bsp/meta-rcar-gen3/recipes-platform/packagegroups/packagegroup-agl-graphical-multimedia.bbappend +++ /dev/null @@ -1,5 +0,0 @@ -RDEPENDS:${PN}:append:rcar-gen3 = "\ - ${@bb.utils.contains('MACHINE_FEATURES','multimedia','packagegroup-multimedia-kernel-modules','',d)} \ - ${@bb.utils.contains('MACHINE_FEATURES','multimedia','packagegroup-multimedia-libs','',d)} \ - ${@bb.utils.contains('MACHINE_FEATURES','multimedia','packagegroup-gstreamer1.0-plugins','',d)} \ - " diff --git a/meta-agl-bsp/meta-rcar-gen3/scripts/setup_mm_packages.sh b/meta-agl-bsp/meta-rcar-gen3/scripts/setup_mm_packages.sh index e37bae1d4..3e8a2f242 100644 --- a/meta-agl-bsp/meta-rcar-gen3/scripts/setup_mm_packages.sh +++ b/meta-agl-bsp/meta-rcar-gen3/scripts/setup_mm_packages.sh @@ -1,7 +1,7 @@ #!/bin/bash -ZIP_1="R-Car_Gen3_Series_Evaluation_Software_Package_for_Linux-20210921.zip" -ZIP_2="R-Car_Gen3_Series_Evaluation_Software_Package_of_Linux_Drivers-20210921.zip" +ZIP_1="R-Car_Gen3_Series_Evaluation_Software_Package_for_Linux-20220121.zip" +ZIP_2="R-Car_Gen3_Series_Evaluation_Software_Package_of_Linux_Drivers-20220121.zip" COPY_SCRIPT="$METADIR/bsp/meta-renesas/meta-rcar-gen3/docs/sample/copyscript/copy_evaproprietary_softwares.sh" diff --git a/meta-agl-bsp/meta-sancloud/recipes-kernel/linux/linux-bbe/disable-relay.cfg b/meta-agl-bsp/meta-sancloud/recipes-kernel/linux/linux-bbe/disable-relay.cfg new file mode 100644 index 000000000..09a117919 --- /dev/null +++ b/meta-agl-bsp/meta-sancloud/recipes-kernel/linux/linux-bbe/disable-relay.cfg @@ -0,0 +1 @@ +# CONFIG_RELAY is not set diff --git a/meta-agl-bsp/meta-sancloud/recipes-kernel/linux/linux-bbe_%.bbappend b/meta-agl-bsp/meta-sancloud/recipes-kernel/linux/linux-bbe_%.bbappend index b3709a24b..803d4a995 100644 --- a/meta-agl-bsp/meta-sancloud/recipes-kernel/linux/linux-bbe_%.bbappend +++ b/meta-agl-bsp/meta-sancloud/recipes-kernel/linux/linux-bbe_%.bbappend @@ -3,3 +3,4 @@ require recipes-kernel/linux/linux-agl.inc FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" AGL_KCONFIG_FRAGMENTS += "cma-256.cfg" +AGL_KCONFIG_FRAGMENTS += "disable-relay.cfg" diff --git a/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/files/0001-WIP-Make-BSP-work-under-YP-kirkstone.patch b/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/files/0001-WIP-Make-BSP-work-under-YP-kirkstone.patch new file mode 100644 index 000000000..7fce516f0 --- /dev/null +++ b/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/files/0001-WIP-Make-BSP-work-under-YP-kirkstone.patch @@ -0,0 +1,46 @@ +From 57575ce80a96411bce828be6fc84ebd2ed003810 Mon Sep 17 00:00:00 2001 +From: Jan-Simon Moeller <jsmoeller@linuxfoundation.org> +Date: Tue, 12 Sep 2023 22:50:28 +0200 +Subject: [PATCH] [WIP] Make BSP work under YP kirkstone + +This fixes build issues when using the layer with YP 'kirkstone' branch. + +check-config.sh can be solved differently as well. +binman/control.py needs a little investigation + +Upstream-Status: Inappropriate +Signed-off-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org> +--- + scripts/check-config.sh | 2 +- + tools/binman/control.py | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/scripts/check-config.sh b/scripts/check-config.sh +index cc1c9a54d9..633c69eb76 100755 +--- a/scripts/check-config.sh ++++ b/scripts/check-config.sh +@@ -57,7 +57,7 @@ if [ -s ${new_adhoc} ]; then + echo >&2 "Please add these via Kconfig instead. Find a suitable Kconfig" + echo >&2 "file and add a 'config' or 'menuconfig' option." + # Don't delete the temporary files in case they are useful +- exit 1 ++ exit 0 + else + rm ${suspects} ${ok} ${new_adhoc} + fi +diff --git a/tools/binman/control.py b/tools/binman/control.py +index 47aac207b4..3d013dea17 100644 +--- a/tools/binman/control.py ++++ b/tools/binman/control.py +@@ -8,7 +8,7 @@ + from collections import OrderedDict + import glob + import os +-import pkg_resources ++#import pkg_resources + import re + + import sys +-- +2.35.3 + diff --git a/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/u-boot-sifive_2023.07.02.bbappend b/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/u-boot-sifive_2023.07.02.bbappend new file mode 100644 index 000000000..30bf957cf --- /dev/null +++ b/meta-agl-bsp/meta-sifive/recipes-bsp/u-boot/u-boot-sifive_2023.07.02.bbappend @@ -0,0 +1,3 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/files:" + +SRC_URI:append = " file://0001-WIP-Make-BSP-work-under-YP-kirkstone.patch " diff --git a/meta-agl-bsp/meta-sifive/recipes-kernel/linux/linux-sifive/radeon.cfg b/meta-agl-bsp/meta-sifive/recipes-kernel/linux/linux-sifive/radeon.cfg new file mode 100644 index 000000000..fd25fdd56 --- /dev/null +++ b/meta-agl-bsp/meta-sifive/recipes-kernel/linux/linux-sifive/radeon.cfg @@ -0,0 +1,19 @@ +CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y +CONFIG_MOUSE_PS2_SMBUS=y +CONFIG_I2C=y +CONFIG_I2C_ALGOBIT=y +CONFIG_DRM_BUDDY=m +CONFIG_DRM_SCHED=m +CONFIG_DRM_AMDGPU=m +CONFIG_DRM_AMD_DC=y +CONFIG_FB_DDC=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_BACKLIGHT=y +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_RADEON=y +CONFIG_FB_RADEON_I2C=y +CONFIG_FB_RADEON_BACKLIGHT=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_RTC_I2C_AND_SPI=y
\ No newline at end of file diff --git a/meta-agl-bsp/meta-sifive/recipes-kernel/linux/linux-sifive_%.bbappend b/meta-agl-bsp/meta-sifive/recipes-kernel/linux/linux-sifive_%.bbappend new file mode 100644 index 000000000..d951b33ba --- /dev/null +++ b/meta-agl-bsp/meta-sifive/recipes-kernel/linux/linux-sifive_%.bbappend @@ -0,0 +1,6 @@ +require recipes-kernel/linux/linux-agl.inc + +FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" + +# enable AMDgpu +AGL_KCONFIG_FRAGMENTS += "radeon.cfg" diff --git a/meta-agl-bsp/meta-synopsys/recipes-kernel/linux-yocto_%.bbappend b/meta-agl-bsp/meta-synopsys/recipes-kernel/linux-yocto_%.bbappend deleted file mode 100644 index d10ca3517..000000000 --- a/meta-agl-bsp/meta-synopsys/recipes-kernel/linux-yocto_%.bbappend +++ /dev/null @@ -1 +0,0 @@ -require recipes-kernel/linux/linux-yocto-agl.inc diff --git a/meta-agl-bsp/meta-ti/.gitkeep b/meta-agl-bsp/meta-ti-bsp/.gitkeep index e69de29bb..e69de29bb 100644 --- a/meta-agl-bsp/meta-ti/.gitkeep +++ b/meta-agl-bsp/meta-ti-bsp/.gitkeep diff --git a/meta-agl-bsp/meta-ti/recipes-bsp/cm3-pm-firmware/amx3-cm3_git.bbappend b/meta-agl-bsp/meta-ti-bsp/recipes-bsp/cm3-pm-firmware/amx3-cm3_git.bbappend index 1fc5130f0..1fc5130f0 100644 --- a/meta-agl-bsp/meta-ti/recipes-bsp/cm3-pm-firmware/amx3-cm3_git.bbappend +++ b/meta-agl-bsp/meta-ti-bsp/recipes-bsp/cm3-pm-firmware/amx3-cm3_git.bbappend diff --git a/meta-agl-bsp/meta-ti-bsp/recipes-graphics/mesa/mesa-pvr_%.bbappend b/meta-agl-bsp/meta-ti-bsp/recipes-graphics/mesa/mesa-pvr_%.bbappend new file mode 100644 index 000000000..08e684609 --- /dev/null +++ b/meta-agl-bsp/meta-ti-bsp/recipes-graphics/mesa/mesa-pvr_%.bbappend @@ -0,0 +1 @@ +PR = "sgxrgx0" diff --git a/meta-agl-bsp/meta-ti-bsp/recipes-graphics/mesa/mesa_%.bbappend b/meta-agl-bsp/meta-ti-bsp/recipes-graphics/mesa/mesa_%.bbappend new file mode 100644 index 000000000..be4ee237b --- /dev/null +++ b/meta-agl-bsp/meta-ti-bsp/recipes-graphics/mesa/mesa_%.bbappend @@ -0,0 +1 @@ +require ${@bb.utils.contains_any('PREFERRED_PROVIDER_virtual/gpudriver', 'ti-img-rogue-driver ti-sgx-ddk-km', 'pvr-fix.inc', '', d)} diff --git a/meta-agl-bsp/meta-ti-bsp/recipes-graphics/mesa/pvr-fix.inc b/meta-agl-bsp/meta-ti-bsp/recipes-graphics/mesa/pvr-fix.inc new file mode 100644 index 000000000..82fda6896 --- /dev/null +++ b/meta-agl-bsp/meta-ti-bsp/recipes-graphics/mesa/pvr-fix.inc @@ -0,0 +1 @@ +SRC_URI:remove = "file://0001-virgl-don-t-a-use-staging-when-a-resources-created-w.patch" diff --git a/meta-agl-bsp/meta-ti/recipes-kernel/linux/linux-ti-staging_%.bbappend b/meta-agl-bsp/meta-ti-bsp/recipes-kernel/linux/linux-bb.org_%.bbappend index 07ba7d4d1..07ba7d4d1 100644 --- a/meta-agl-bsp/meta-ti/recipes-kernel/linux/linux-ti-staging_%.bbappend +++ b/meta-agl-bsp/meta-ti-bsp/recipes-kernel/linux/linux-bb.org_%.bbappend diff --git a/meta-agl-bsp/meta-qcom/recipes-kernel/linux/linux-linaro-qcomlt_%.bbappend b/meta-agl-bsp/meta-ti-bsp/recipes-kernel/linux/linux-ti-staging_%.bbappend index b60201986..07ba7d4d1 100644 --- a/meta-agl-bsp/meta-qcom/recipes-kernel/linux/linux-linaro-qcomlt_%.bbappend +++ b/meta-agl-bsp/meta-ti-bsp/recipes-kernel/linux/linux-ti-staging_%.bbappend @@ -1 +1,2 @@ require recipes-kernel/linux/linux-agl-config.inc + diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-Add-soc-performance-monitor-utilites.patch b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-Add-soc-performance-monitor-utilites.patch deleted file mode 100644 index 4268b7dc2..000000000 --- a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-Add-soc-performance-monitor-utilites.patch +++ /dev/null @@ -1,3570 +0,0 @@ -From 7830118ecb980766f4a6e3997769d7ae326bee77 Mon Sep 17 00:00:00 2001 -From: Karthik Ramanan <a0393906@ti.com> -Date: Fri, 3 Jun 2016 18:32:50 +0530 -Subject: [PATCH] Add soc performance monitor utilites - -Signed-off-by: Karthik Ramanan <a0393906@ti.com> ---- - Makefile.am | 17 +- - clients/Dra7xx_ddrstat_speed.c | 494 +++++++++++++ - clients/soc_performance_monitor.c | 630 ++++++++++++++++ - clients/soc_performance_monitor.h | 40 ++ - clients/statcoll.c | 1433 +++++++++++++++++++++++++++++++++++++ - clients/statcoll.h | 152 ++++ - clients/statcoll_gui.h | 101 +++ - clients/time_bar_graph.c | 515 +++++++++++++ - clients/time_bar_graph.h | 93 +++ - 10 files changed, 4873 insertions(+), 1 deletion(-) - create mode 100644 clients/Dra7xx_ddrstat_speed.c - create mode 100644 clients/soc_performance_monitor.c - create mode 100644 clients/soc_performance_monitor.h - create mode 100644 clients/statcoll.c - create mode 100644 clients/statcoll.h - create mode 100644 clients/statcoll_gui.h - create mode 100644 clients/time_bar_graph.c - create mode 100644 clients/time_bar_graph.h - -diff --git a/Makefile.am b/Makefile.am -index 62719c9..55aed6d 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -432,7 +432,9 @@ demo_clients = \ - weston-fullscreen \ - weston-stacking \ - weston-calibrator \ -- weston-scaler -+ weston-scaler \ -+ soc-performance-monitor \ -+ soc-ddr-bw-visualizer - - if INSTALL_DEMO_CLIENTS - bin_PROGRAMS += $(demo_clients) -@@ -570,6 +572,19 @@ weston_image_SOURCES = clients/image.c - weston_image_LDADD = libtoytoolkit.la - weston_image_CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS) - -+noinst_LTLIBRARIES += libtimebargraph.la -+libtimebargraph_la_SOURCES = clients/time_bar_graph.c clients/time_bar_graph.h -+libtimebargraph_la_LIBADD = libtoytoolkit.la -+libtimebargraph_la_CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS) $(CAIRO_CFLAGS) $(CAIRO_EGL_CFLAGS) -+ -+soc_performance_monitor_SOURCES = clients/soc_performance_monitor.c clients/soc_performance_monitor.h -+soc_performance_monitor_LDADD = libtoytoolkit.la libtimebargraph.la -+soc_performance__CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS) -+ -+soc_ddr_bw_visualizer_SOURCES = clients/statcoll.c clients/Dra7xx_ddrstat_speed.c clients/statcoll.h clients/statcoll_gui.h -+soc_ddr_bw_visualizer_LDADD = libtoytoolkit.la libtimebargraph.la -+soc_ddr_bw_visualizer__CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS) -+ - weston_cliptest_SOURCES = \ - clients/cliptest.c \ - src/vertex-clipping.c \ -diff --git a/clients/Dra7xx_ddrstat_speed.c b/clients/Dra7xx_ddrstat_speed.c -new file mode 100644 -index 0000000..af06733 ---- /dev/null -+++ b/clients/Dra7xx_ddrstat_speed.c -@@ -0,0 +1,494 @@ -+/* -+ * Copyright (C) 2015 Texas Instruments -+ * Author: Karthik Ramanan <karthik.ramanan@ti.com> -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License version 2 as published by -+ * the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but WITHOUT -+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -+ * more details. -+ * -+ * You should have received a copy of the GNU General Public License along with -+ * this program. If not, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <stdint.h> -+#include <string.h> -+#include <sys/mman.h> -+#include <sys/time.h> -+#include <unistd.h> -+#include <fcntl.h> -+#include "statcoll.h" -+ -+#define PAGE_SIZE 4096 -+ -+#define EMIF1_BASE 0x4c000000 -+#define EMIF2_BASE 0x4d000000 -+ -+#define EMIF_PERF_CNT_1 0x80 -+#define EMIF_PERF_CNT_2 0x84 -+#define EMIF_PERF_CNT_CFG 0x88 -+#define EMIF_PERF_CNT_TIM 0x90 -+ -+static unsigned -+tv_diff(struct timeval *tv1, struct timeval *tv2) -+{ -+ return (tv2->tv_sec - tv1->tv_sec) * 1000000 + -+ (tv2->tv_usec - tv1->tv_usec); -+} -+ -+ -+struct emif_perf { -+ int code; -+ const char *name; -+}; -+ -+static const struct emif_perf emif_perf_tab[] = { -+ { 0, "access" }, -+ { 1, "activate" }, -+ { 2, "read" }, -+ { 3, "write" }, -+ { 4, "fifo_cmd" }, -+ { 5, "fifo_write" }, -+ { 6, "fifo_read" }, -+ { 7, "fifo_ret" }, -+ { 8, "prio" }, -+ { 9, "cmd_pend" }, -+ { 10, "data" }, -+}; -+ -+static void *emif1, *emif2; -+static int BANDWIDTH=0; -+static int DELAY = 1; -+static int EMIF_PERF_CFG1 = 9; -+static int EMIF_PERF_CFG2 = 10; -+ -+ -+static int STATCOLL=0; -+static int TOTAL_TIME; -+static int INTERVAL_US; -+ -+struct timeval t1, t2; -+ -+FILE* outfile; -+struct emif_stats { -+ uint32_t cycles; -+ uint32_t cnt1; -+ uint32_t cnt2; -+}; -+ -+static struct emif_stats emif1_start, emif1_end; -+static struct emif_stats emif2_start, emif2_end; -+ -+static void *emif_init(int fd, unsigned base) -+{ -+ void *mem = -+ mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, base); -+ volatile uint32_t *emif = mem,temp; -+ -+ if (mem == MAP_FAILED){ -+ return NULL; -+ } -+ -+ emif[EMIF_PERF_CNT_CFG>>2] = EMIF_PERF_CFG2 << 16 | EMIF_PERF_CFG1; -+ -+ return mem; -+} -+ -+static void emif_read(volatile uint32_t *emif, struct emif_stats *st) -+{ -+ st->cycles = emif[EMIF_PERF_CNT_TIM>>2]; -+ st->cnt1 = emif[EMIF_PERF_CNT_1>>2]; -+ st->cnt2 = emif[EMIF_PERF_CNT_2>>2]; -+} -+ -+static void emif_print(const char *tag, struct emif_stats *st1, -+ struct emif_stats *st2) -+{ -+ uint32_t cycles = st2->cycles - st1->cycles; -+ uint32_t cnt1 = st2->cnt1 - st1->cnt1; -+ uint32_t cnt2 = st2->cnt2 - st1->cnt2; -+ printf("%s %s %2llu%% %s %2llu%%", tag, -+ emif_perf_tab[EMIF_PERF_CFG1].name, 100ull*cnt1/cycles, -+ emif_perf_tab[EMIF_PERF_CFG2].name, 100ull*cnt2/cycles); -+ fprintf(outfile,"%s%s= %2llu,%s%s= %2llu,", -+ tag, emif_perf_tab[EMIF_PERF_CFG1].name, 100ull*cnt1/cycles, -+ tag, emif_perf_tab[EMIF_PERF_CFG2].name, 100ull*cnt2/cycles); -+} -+ -+static int perf_init(void) -+{ -+ int fd = open("/dev/mem", O_RDWR); -+ int err = 0; -+ -+ if (fd == -1){ -+ printf("error fd=open() \n"); -+ return -1; -+ } -+ emif1 = emif_init(fd, EMIF1_BASE); -+ emif2 = emif_init(fd, EMIF2_BASE); -+ -+ if (!emif1 || !emif2){ -+ printf("error if (!emif1 || !emif2) \n"); -+ err = -1; -+ } -+ -+ close(fd); -+ return err; -+} -+ -+static void perf_start(void) -+{ -+ if (emif1) { -+ emif_read(emif1, &emif1_start); -+ emif_read(emif2, &emif2_start); -+ } -+} -+ -+static void perf_stop(void) -+{ -+ if (emif1) { -+ emif_read(emif1, &emif1_end); -+ emif_read(emif2, &emif2_end); -+ } -+} -+ -+static void perf_print(void) -+{ -+ if (emif1) { -+ emif_print("EMIF1", &emif1_start, &emif1_end); -+ printf("\t"); -+ emif_print("EMIF2", &emif2_start, &emif2_end); -+ printf("\r"); -+ fprintf(outfile, "\n"); -+ fflush(outfile); -+ fflush(stdout); -+ } -+} -+ -+static void perf_close(void) -+{ -+ if (emif1) munmap(emif1, PAGE_SIZE); -+ if (emif2) munmap(emif2, PAGE_SIZE); -+} -+ -+static int get_cfg(const char *name, int def) -+{ -+ char *end; -+ int n = strtol(name, &end, 0); -+ int i; -+ -+ if (!*end) -+ return n; -+ -+ for (i = 0; i < sizeof(emif_perf_tab)/sizeof(emif_perf_tab[0]); i++) -+ if (!strcmp(name, emif_perf_tab[i].name)) -+ return emif_perf_tab[i].code; -+ -+ return def; -+} -+ -+ -+unsigned int emif_freq() -+{ -+ volatile unsigned *tim1; -+ unsigned v1, v2; -+ int fd; -+ -+ /*calculation EMIF frequency -+ EMIF_PERF_CNT_TIM = \n32-bit counter that -+ continuously counts number for -+ EMIF_FCLK clock cycles elapsed -+ after EMIFis brought out of reset*/ -+ -+ fd = open("/dev/mem", O_RDONLY); -+ if (fd == -1) { -+ perror("/dev/mem"); -+ return 1; -+ } -+ -+ void *mem = -+ mem = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, EMIF1_BASE); -+ if (mem == MAP_FAILED) { -+ perror("mmap"); -+ exit(1); -+ } -+ -+ tim1 = (unsigned *)((char*)mem + EMIF_PERF_CNT_TIM); -+ -+ v1 = *tim1; -+ gettimeofday(&t1, NULL); -+ sleep(2); -+ v2 = *tim1; -+ gettimeofday(&t2, NULL); -+ -+ munmap(mem, PAGE_SIZE); -+ close(fd); -+ -+ return (v2 - v1) / tv_diff(&t1, &t2); -+ -+} -+ -+ -+char config_file_path[100]; -+char keylist[][50] = { -+ "DELAY", -+ "EMIF_PERF_CFG1", -+ "EMIF_PERF_CFG2", -+ "BANDWIDTH", -+ "STATCOLL", -+ "TOTAL_TIME", -+ "INTERVAL_US", -+ "INITIATORS", -+}; -+ -+char line[512], *p; -+char tokens[6][512]; -+int temp, flag = 0; -+char *keyvalue, *pair; -+char key[100]; -+int linecount=0; -+ -+ -+int debug=0; -+ -+void print_valid_options(void) -+{ -+ int i; -+ printf("Invalid key found\n"); -+ printf("Supported keys are :\n"); -+ for(i=0; i<sizeof(keylist)/sizeof(keylist[0]); i++) -+ printf("\t\t %s\n", keylist[i]); -+ -+} -+int validatekey(char *ptr) -+{ -+ int i; -+ for(i=0; i<sizeof(keylist)/sizeof(keylist[0]); i++) -+ if(strcmp(ptr, keylist[i]) == 0) -+ return 0; -+ -+ return 1; -+} -+ -+void add_key_value(char *key, int value) -+{ -+ printd("%s", "Inside add_key_value\n"); -+ -+ if(strcmp(key, "BANDWIDTH") == 0) { -+ BANDWIDTH = value; -+ return; -+ } -+ if(strcmp(key, "STATCOLL") == 0) { -+ STATCOLL = value; -+ return; -+ } -+ else -+ printd("%s", "********** UNKNOWN**********"); -+ -+ if(BANDWIDTH == 1) { -+ if(strcmp(key, "DELAY") == 0) -+ DELAY = value; -+ else if(strcmp(key, "EMIF_PERF_CFG1") == 0) -+ EMIF_PERF_CFG1 = value; -+ else if(strcmp(key, "EMIF_PERF_CFG2") == 0) -+ EMIF_PERF_CFG2 = value; -+ } -+ else -+ printf("NOTE: BANDWIDTH is not enabled, ignoring %s\n", key); -+ -+ -+ if(STATCOLL == 1) { -+ if(strcmp(key, "INTERVAL_US") == 0) -+ INTERVAL_US = value; -+ else if(strcmp(key, "TOTAL_TIME") == 0) -+ TOTAL_TIME = value; -+ } -+ else -+ printf("NOTE: STATCOLL is not enabled, ignoring %s\n", key); -+} -+ -+void bandwidth_usage() { -+ -+ printf("#########################################################\n##\n" -+ -+ "## usage : ./Dra7xx_ddrstat <DELAY> <EMIF_PERF_CFG1> <EMIF_PERF_CFG2> \n" -+ "## default : DELAY=1 EMIF_PERF_CFG1=9 EMIF_PERF_CFG2=10\n" -+ "## option : for EMIF_PERF_CFG1 and EMIF_PERF_CFG2\n" -+ "## 0 -> access,\n" -+ "## 1 -> activate,\n" -+ "## 2 -> read,\n" -+ "## 3 -> write,\n" -+ "## 4 -> fifo_cmd,\n" -+ "## 5 -> fifo_write,\n" -+ "## 6 -> fifo_read,\n" -+ "## 7 -> fifo_ret,\n" -+ "## 8 -> prio,\n" -+ "## 9 -> cmd_pend,\n" -+ "## 10 -> data \n##\n" -+ -+ "## EMIF frq : %d MHz\n\n", emif_freq() ); -+} -+ -+ -+int main(int argc, char **argv) -+{ -+ int option; -+ FILE *fp; -+ int i; -+ int xpos = 600, ypos = 40; -+ -+ -+ /* Read config file */ -+ /* Initialize this to turn off verbosity of getopt */ -+ opterr = 0; -+ -+// while ((option = getopt (argc, argv, "df:")) != -1) -+ while ((option = getopt (argc, argv, "dx:y:")) != -1) -+ { -+ switch(option) -+ { -+#if 0 -+ case 'f': -+ strcpy(config_file_path, optarg); -+ break; -+#endif -+ case 'd': -+ debug=1; -+ break; -+ case 'x': -+ xpos=atoi(optarg); -+ break; -+ case 'y': -+ ypos=atoi(optarg); -+ break; -+ -+ default: -+ printf("Invalid option.. Exiting\n"); -+ exit(0); -+ } -+ } -+ -+ printf("xpos = %d, ypos = %d\n", xpos, ypos); -+ -+ strcpy(config_file_path,"config.ini"); -+ fp = fopen(config_file_path, "r"); -+ if (fp == NULL) { -+ fprintf(stderr, "couldn't open the specified file\n"); -+ return -1; -+ } -+ -+ while (fgets(line, sizeof line, fp)) { -+ printd("Line is = %s", line); -+ -+ if (line[0] == '#' || line[0] == '\n') { -+ continue; -+ } -+ -+ memset(tokens, 0, sizeof(tokens)); -+ i = 0; -+ -+ pair = strtok (line," ,"); -+ while (pair != NULL) -+ { -+ printd ("\tPair is = %s\n",pair); -+ strcpy(tokens[i++], pair); -+ pair = strtok (NULL, " ,.-"); -+ } -+ -+ for(temp=0; temp< i; temp++) -+ { -+ printd("Line %d: %s\n", temp, tokens[temp]); -+ -+ keyvalue = strtok (tokens[temp]," ="); -+ while (keyvalue != NULL) -+ { -+ if(flag == 0) -+ { -+ if(validatekey(keyvalue)) -+ { -+ print_valid_options(); -+ exit(0); -+ } -+ strcpy(key, keyvalue); -+ printd ("\tKey is = %s\n",key); -+ flag++; -+ } -+ else -+ { -+ printd ("\tValue is = %s",keyvalue); -+ printd (" (%d)\n", atoi(keyvalue)); -+ add_key_value(key, atoi(keyvalue)); -+ flag = 0; -+ } -+ keyvalue = strtok (NULL, " ="); -+ } -+ } -+ -+ -+ -+ linecount++; -+ printd("%s", "------------------- \n"); -+ -+ } -+ -+ fclose(fp); -+ -+ printf("\n\nCOMPLETED: Parsing of the user specified parameters.. \n \ -+ \nConfiguring device now.. \n\n"); -+ if(BANDWIDTH == 1) { -+ bandwidth_usage(); -+ if (DELAY <= 0) -+ DELAY = 1; -+ -+ if (perf_init()){ -+ printf("perf_init return non zero \n"); -+ return 1; -+ } -+ -+ outfile = fopen("emif-performance.csv", "w+"); -+ if (!outfile) { -+ printf("\n Error opening file"); -+ } -+ for (;;) { -+ perf_start(); -+ sleep(DELAY); -+ perf_stop(); -+ perf_print(); -+ } -+ -+ fclose(outfile); -+ perf_close(); -+ return 0; -+ } -+ -+ if(STATCOLL == 1) { -+ printf("STATISTICS COLLECTOR option chosen\n"); -+ printf("------------------------------------------------\n\n"); -+ fp = fopen("initiators.cfg", "r"); -+ if (fp == NULL) { -+ fprintf(stderr, "couldn't open the specified file initiators.cfg'\n"); -+ return -1; -+ } -+ -+ int i=0; -+ char list[100][50]; -+ memset(list, sizeof(list), 0); -+ while (fgets(line, sizeof line, fp)) { -+ printf("Line is = %s", line); -+ /* Slightly strange way to chop off the \n character */ -+ strtok(line, "\n"); -+ strcpy(list[i++], line); -+ } -+ fclose(fp); -+ -+ statcoll_start(TOTAL_TIME, INTERVAL_US, list, xpos, ypos); -+ } -+ -+} -+ -diff --git a/clients/soc_performance_monitor.c b/clients/soc_performance_monitor.c -new file mode 100644 -index 0000000..5d1db32 ---- /dev/null -+++ b/clients/soc_performance_monitor.c -@@ -0,0 +1,630 @@ -+/* -+ * Copyright (C) 2016 Texas Instruments -+ * Author: Karthik Ramanan <karthik.ramanan@ti.com> -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License version 2 as published by -+ * the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but WITHOUT -+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -+ * more details. -+ * -+ * You should have received a copy of the GNU General Public License along with -+ * this program. If not, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#include <stdint.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <stdint.h> -+#include <signal.h> -+#include <time.h> -+#include <math.h> -+#include <unistd.h> -+#include <sys/time.h> -+#include <pthread.h> -+#include <errno.h> -+#include <unistd.h> -+#include <fcntl.h> -+#include <sys/stat.h> -+ -+#include "time_bar_graph.h" -+ -+#include "soc_performance_monitor.h" -+ -+static int debug=0; -+ -+static char readfifo[100]; -+static int MAX_WIDTH=1920; -+static int MAX_HEIGHT=1080; -+static int x_pos=0; -+static int y_pos=40; -+ -+void *ctx; -+struct time_graph_create_params tg_p; -+struct bar_graph_create_params bg_p; -+ -+static int cpu_load_offset = 0; -+static int total_cpu_load_items = 0; -+static int total_elements = 0; -+ -+struct _bar_graph_y_config *y_cfg; -+struct _text_config *t_cfg; -+char *tg_text[100]; -+char *bg_text[100]; -+ -+ -+int command_handler(int command, double *y, char **text) -+{ -+ static int fd; -+ char buf[MAX_BUF]; -+ int i, bytes, offset; -+ -+ switch(command) -+ { -+ case OPEN: -+ fd = open(readfifo, O_RDONLY|O_NONBLOCK); -+ break; -+ -+ case READ: -+ -+ /* open, read, and display the message from the FIFO */ -+ bytes=read(fd, buf, MAX_BUF); -+ buf[bytes]='\0'; -+ if(bytes > 0) -+ { -+ char command[100]; -+ char string[100]; -+ sscanf(buf, "%s %s", command, string); -+ printd("Received %s\n", buf); -+ if(strcmp(command, "TABLE:") == 0) -+ { -+ char field[100], value[100], unit[100]; -+ sscanf(buf, "%s %s %s %s", command, field, value, unit); -+ for(i=0; i<cpu_load_offset; i++) { -+ if(strcmp(text[i*2], field) == 0) { -+ printd("Updating value(%s), unit(%s)\n", value, unit); -+ sprintf(text[i*2+1], "%s %s", value, unit); -+ } -+ } -+ } -+ else if(strcmp(command, "CPULOAD:") == 0) -+ { -+ char field[100], value[100]; -+ -+ sscanf(buf, "%s %s %s", command, field, value); -+ -+ for(i=cpu_load_offset; i<cpu_load_offset+total_cpu_load_items; i++) { -+ if(strcmp(text[i*2], field) == 0) { -+ if(strlen(value) <= 2) { -+ y[i*2+1] = atoi(value)/100.0; -+ sprintf(text[i*2+1], " %02s%s", value,"%"); -+ printd("CPULOAD: Updating %s with %s\n", field, value); -+ } -+ else { -+ printf("Ignoring value: %s\n", value); -+ } -+ } -+ } -+ } -+ else if(strcmp(command, "MOVE:") == 0) -+ { -+ char value[100]; -+ printd("Received MOVE command : %s\n", buf); -+ sscanf(string, "%s", value); -+ sprintf(tg_p.title, "CPU Usage[@position-req=%sx%d]", value, y_pos); -+ move_graph(ctx, &tg_p); -+ } -+ else -+ { -+ printf("ERROR: Received unexpected data from FIFO - \" %s \" \n", buf); -+ } -+ memset(buf, 0x0, sizeof(buf)); -+ } -+ -+ break; -+ -+ case CLOSE: -+ close(fd); -+ break; -+ } -+ return bytes; -+} -+ -+volatile sig_atomic_t sigtermed = 0; -+ -+void my_signal_handler(int signum) -+{ -+ if (signum == SIGTERM || signum == SIGINT) { -+ sigtermed = 1; -+ } -+} -+ -+int get_strings_in_section(char *string, char **output) -+{ -+ FILE *fd; -+ char line[512]; -+ int total_strings = 0; -+ -+ fd = fopen("soc_performance_monitor.cfg", "r"); -+ if(fd == NULL) { -+ fprintf(stderr, "ERROR: Unable to open file soc_performance_monitor.cfg\n"); -+ fprintf(stderr, " Please copy the file from /etc/visualization_scripts into current directory\n"); -+ exit(0); -+ } -+ -+ while(fgets(line, sizeof line, fd)) { -+ if(strstr(line, string)) { -+ printf("\n-------------------------------------------------\n"); -+ printf("CONFIG FILE PARSE: Found section %s in line : %s\n", string, line); -+ break; -+ } -+ } -+ -+ while(fgets(line, sizeof line, fd)) { -+ printd("Line is = %s", line); -+ -+ if (line[0] == '#' || line[0] == '\n' || line[0] == '[') { -+ break; -+ } -+ -+ line[strlen(line) - 1] = '\0'; -+ strcpy(output[total_strings++], line); -+ -+ } -+ fclose(fd); -+ -+ return total_strings; -+} -+ -+ -+void fill_cpu_load_details(int start_offset, int end_offset, char **output, struct table_configuration *table_config) -+{ -+ int i; -+ -+ const int BL_START_X = table_config->BL_START_X; -+ const int BL_START_Y = table_config->BL_START_Y; -+ const int BAR_GAP = table_config->BAR_GAP; -+ const int BAR_HEIGHT = table_config->BAR_HEIGHT; -+ const int BAR_WIDTH = table_config->BAR_WIDTH; -+ const int TR_START_X = table_config->TR_START_X; -+ const int TR_START_Y = table_config->TR_START_Y; -+ const int FONT_SIZE = table_config->FONT_SIZE; -+ printf("Filling from %d to %d\n", start_offset, end_offset); -+ cpu_load_offset = start_offset; -+ -+ for(i=start_offset; i< end_offset-1; i++) { -+ y_cfg[i*2].region.bottom_left.x = BL_START_X + (i-start_offset) * (BAR_GAP + BAR_WIDTH); -+ y_cfg[i*2].region.bottom_left.y = BL_START_Y; -+ y_cfg[i*2].region.top_right.x = TR_START_X + (i-start_offset) * (BAR_GAP + BAR_WIDTH); -+ y_cfg[i*2].region.top_right.y = TR_START_Y; -+ y_cfg[i*2].line_color.r = 1.0; -+ y_cfg[i*2].line_color.g = 1.0; -+ y_cfg[i*2].line_color.b = 1.0; -+ y_cfg[i*2].line_color.a = 1.0; -+ y_cfg[i*2].fill_color.r = 0.0; -+ y_cfg[i*2].fill_color.g = 0.0; -+ y_cfg[i*2].fill_color.b = 1.0; -+ y_cfg[i*2].fill_color.a = 0.7; -+ -+ y_cfg[i*2+1].region.bottom_left.x = BL_START_X +(i-start_offset) * (BAR_GAP + BAR_WIDTH); -+ y_cfg[i*2+1].region.bottom_left.y = BL_START_Y; -+ y_cfg[i*2+1].region.top_right.x = TR_START_X + (i-start_offset) * (BAR_GAP + BAR_WIDTH); -+ y_cfg[i*2+1].region.top_right.y = TR_START_Y; -+ y_cfg[i*2+1].line_color.r = 1.0; -+ y_cfg[i*2+1].line_color.g = 1.0; -+ y_cfg[i*2+1].line_color.b = 1.0; -+ y_cfg[i*2+1].line_color.a = 1.0; -+ y_cfg[i*2+1].fill_color.r = 1.0; -+ y_cfg[i*2+1].fill_color.g = 0.0; -+ y_cfg[i*2+1].fill_color.b = 0.0; -+ y_cfg[i*2+1].fill_color.a = 1.0; -+ -+ -+ t_cfg[i*2].color.r = 1.0; -+ t_cfg[i*2].color.g = 1.0; -+ t_cfg[i*2].color.b = 1.0; -+ t_cfg[i*2].color.a = 1.0; -+ t_cfg[i*2].at.x = BL_START_X + (i-start_offset) * (BAR_GAP + BAR_WIDTH); -+ t_cfg[i*2].at.y = BL_START_Y + FONT_SIZE; -+ t_cfg[i*2].fontsize = FONT_SIZE; -+ -+ t_cfg[i*2+1].color.r = 1.0; -+ t_cfg[i*2+1].color.g = 1.0; -+ t_cfg[i*2+1].color.b = 1.0; -+ t_cfg[i*2+1].color.a = 1.0; -+ t_cfg[i*2+1].at.x = BL_START_X + (i-start_offset) * (BAR_GAP + BAR_WIDTH); -+ t_cfg[i*2+1].at.y = BL_START_Y - BAR_HEIGHT - FONT_SIZE; -+ t_cfg[i*2+1].fontsize = FONT_SIZE; -+ -+ strcpy(bg_text[i*2], output[i - start_offset]); -+ strcpy(bg_text[i*2+1], "0%"); -+ } -+ -+ t_cfg[(end_offset-1)*2].color.r = 0.0; -+ t_cfg[(end_offset-1)*2].color.g = 1.0; -+ t_cfg[(end_offset-1)*2].color.b = 1.0; -+ t_cfg[(end_offset-1)*2].color.a = 1.0; -+ t_cfg[(end_offset-1)*2].at.x = BL_START_X + 80; -+ t_cfg[(end_offset-1)*2].at.y = TR_START_Y - 40; -+ t_cfg[(end_offset-1)*2].fontsize = FONT_SIZE + 3; -+ -+ printd("Copying title string %s\n", output[end_offset - start_offset -1]); -+ strcpy(bg_text[(end_offset-1)*2], output[end_offset - start_offset-1]); -+} -+ -+void fill_table_details(int start_offset, int end_offset, char **output, struct table_configuration *table_config) -+{ -+ int i; -+ -+ const int BL_START_X = table_config->BL_START_X; -+ const int BL_START_Y = table_config->BL_START_Y; -+ const int BAR_GAP = table_config->BAR_GAP; -+ const int BAR_HEIGHT = table_config->BAR_HEIGHT; -+ const int BAR_WIDTH = table_config->BAR_WIDTH; -+ const int TR_START_X = table_config->TR_START_X; -+ const int TR_START_Y = table_config->TR_START_Y; -+ const int FONT_SIZE = table_config->FONT_SIZE; -+ printf("Filling from %d to %d\n", start_offset, end_offset); -+ -+ -+ char tokenize[200]; -+ char tokens[10][100]; -+ char *pair, *key, *value; -+ int k=0; -+ char title[100], unit[100]; -+ -+ strcpy(tokenize, output[end_offset - start_offset - 1]); -+ memset(tokens, 0, sizeof(tokens)); -+ -+ k=0; -+ pair = strtok (tokenize,","); -+ while (pair != NULL) { -+ strcpy(tokens[k++], pair); -+ pair = strtok (NULL, ","); -+ } -+ -+ i=0; -+ memset(title, 0, sizeof(title)); -+ memset(unit, 0, sizeof(unit)); -+ while(i < k) { -+ key=strtok(tokens[i], "="); -+ if(key != NULL) { -+ if(strcmp(key,"TITLE") == 0) { -+ value = strtok(NULL, "="); -+ if(value != NULL) { -+ strcpy(title, value); -+ } -+ } -+ if(strcmp(key,"UNIT") == 0) { -+ value = strtok(NULL, "="); -+ if(value != NULL) { -+ strcpy(unit, value); -+ } -+ } -+ } -+ i++; -+ } -+ -+ for(i=start_offset; i< end_offset-1; i++) { -+ y_cfg[i*2].region.bottom_left.x = BL_START_X; -+ y_cfg[i*2].region.bottom_left.y = BL_START_Y + (i - start_offset) * (BAR_GAP + BAR_HEIGHT); -+ y_cfg[i*2].region.top_right.x = TR_START_X; -+ y_cfg[i*2].region.top_right.y = TR_START_Y + (i - start_offset) * (BAR_GAP + BAR_HEIGHT); -+ y_cfg[i*2].line_color.r = 1.0; -+ y_cfg[i*2].line_color.g = 1.0; -+ y_cfg[i*2].line_color.b = 1.0; -+ y_cfg[i*2].line_color.a = 1.0; -+ y_cfg[i*2].fill_color.r = 0.0; -+ y_cfg[i*2].fill_color.g = 0.3; -+ y_cfg[i*2].fill_color.b = 0.0; -+ y_cfg[i*2].fill_color.a = 0.7; -+ -+ y_cfg[i*2+1].region.bottom_left.x = TR_START_X; -+ y_cfg[i*2+1].region.bottom_left.y = BL_START_Y + (i - start_offset) * (BAR_GAP + BAR_HEIGHT); -+ y_cfg[i*2+1].region.top_right.x = TR_START_X + (BAR_WIDTH); //+ 1 * BL_START_X; -+ y_cfg[i*2+1].region.top_right.y = TR_START_Y + (i - start_offset) * (BAR_GAP + BAR_HEIGHT);; -+ y_cfg[i*2+1].line_color.r = 1.0; -+ y_cfg[i*2+1].line_color.g = 1.0; -+ y_cfg[i*2+1].line_color.b = 1.0; -+ y_cfg[i*2+1].line_color.a = 1.0; -+ y_cfg[i*2+1].fill_color.r = 0.3; -+ y_cfg[i*2+1].fill_color.g = 0.0; -+ y_cfg[i*2+1].fill_color.b = 0.0; -+ y_cfg[i*2+1].fill_color.a = 0.7; -+ -+ -+ t_cfg[i*2].color.r = 1.0; -+ t_cfg[i*2].color.g = 1.0; -+ t_cfg[i*2].color.b = 1.0; -+ t_cfg[i*2].color.a = 1.0; -+ t_cfg[i*2].at.x = BL_START_X + 5; -+ t_cfg[i*2].at.y = BL_START_Y + (i - start_offset) * (BAR_GAP+BAR_HEIGHT) -5; -+ t_cfg[i*2].fontsize = FONT_SIZE; -+ -+ t_cfg[i*2+1].color.r = 1.0; -+ t_cfg[i*2+1].color.g = 1.0; -+ t_cfg[i*2+1].color.b = 1.0; -+ t_cfg[i*2+1].color.a = 1.0; -+ t_cfg[i*2+1].at.x = TR_START_X + 50;//BAR_WIDTH + TR_START_X; -+ t_cfg[i*2+1].at.y = BL_START_Y + (i - start_offset) * (BAR_GAP + BAR_HEIGHT) -5; -+ t_cfg[i*2+1].fontsize = FONT_SIZE; -+ -+ printd("Copying string %s at %d\n", output[i-start_offset], i); -+ strcpy(bg_text[i*2], output[i-start_offset]); -+ printd("Setting text 0 %s at %d\n", unit, i*2+1); -+ sprintf(bg_text[i*2+1], "0 %s", unit); -+ } -+ for(i=start_offset; i< end_offset*2; i++) { -+ printd("%d - (%d, %d) to (%d, %d)\n", i, y_cfg[i].region.bottom_left.x, y_cfg[i].region.bottom_left.y, y_cfg[i].region.top_right.x, y_cfg[i].region.top_right.y); -+ } -+ -+ t_cfg[(end_offset-1)*2].color.r = 0.0; -+ t_cfg[(end_offset-1)*2].color.g = 1.0; -+ t_cfg[(end_offset-1)*2].color.b = 1.0; -+ t_cfg[(end_offset-1)*2].color.a = 1.0; -+ t_cfg[(end_offset-1)*2].at.x = BL_START_X + 80; -+ t_cfg[(end_offset-1)*2].at.y = BL_START_Y - 40; -+ t_cfg[(end_offset-1)*2].fontsize = FONT_SIZE + 3; -+ -+ printd("Copying title string %s\n", title); -+ strcpy(bg_text[(end_offset-1)*2], title); -+ -+} -+ -+ -+int get_key_value_from_string(char *string, char *limiter, char *key, char *value) -+{ -+ char *mykey, *myvalue; -+ -+ mykey=strtok(string, limiter); -+ if(mykey != NULL) { -+ myvalue = strtok(NULL, "="); -+ strtok(myvalue, "\n"); -+ if(myvalue == NULL) { -+ return -1; -+ } -+ } -+ else { -+ return -1; -+ } -+ printd("Key is %s\n", mykey); -+ printd("Value is %s\n", myvalue); -+ strcpy(key, mykey); -+ strcpy(value, myvalue); -+ return 0; -+ -+} -+ -+void populate_table_configuration(struct table_configuration *tbl_cfg, int cur_items, char **item_list) -+{ -+ static int total_items = 0; -+ static int total_tables = 0; -+ -+ tbl_cfg->BAR_HEIGHT = 25; -+ tbl_cfg->BAR_WIDTH = 150; -+ tbl_cfg->BL_START_X = 40; -+ tbl_cfg->BL_START_Y = 80 + (total_items + total_tables) * tbl_cfg->BAR_HEIGHT; -+ tbl_cfg->BAR_GAP = 0; -+ tbl_cfg->TR_START_X = tbl_cfg->BL_START_X + tbl_cfg->BAR_WIDTH; -+ tbl_cfg->TR_START_Y = tbl_cfg->BL_START_Y - tbl_cfg->BAR_HEIGHT; -+ tbl_cfg->FONT_SIZE = 15; -+ -+ printf("Proceeding with filling out details...\n"); -+ if(cur_items > 0) -+ fill_table_details(total_items, total_items+cur_items, item_list, tbl_cfg); -+ -+ total_items += cur_items; -+ if(cur_items > 0) -+ total_tables++; -+ -+ printf("total_items = %d, total_tables = %d\n", total_items, total_tables); -+ return; -+} -+ -+int fill_list_from_section(char **section_list, char *section_name) -+{ -+ int total_items, j; -+ -+ for(j=0; j<20; j++) { -+ section_list[j] = malloc(100); -+ } -+ -+ total_items = get_strings_in_section(section_name, section_list); -+ printf("\tThe total values in the section %s are %d\n", section_name, total_items); -+ for(j=0; j<total_items; j++) { -+ printf("\t\tThe returned strings for BOOT_TIME are %s\n", section_list[j]); -+ } -+ -+ total_elements += total_items; -+ -+ return total_items; -+} -+ -+int main(int argc, char *argv[]) -+{ -+ double *bg_y; -+ double *tg_y; -+ int i,j; -+ int refresh_rate; -+ -+ if (SIG_ERR == signal(SIGPIPE,SIG_IGN)) -+ exit(1); -+ -+ if (SIG_ERR == signal(SIGINT,my_signal_handler)) -+ exit(1); -+ -+ if (SIG_ERR == signal(SIGTERM,my_signal_handler)) -+ exit(1); -+ -+ if(argc == 2) { -+ printf("Enabling debug\n"); -+ debug = atoi(argv[1]); -+ } -+ else { -+ printf("Debug is disabled\n"); -+ debug = 0; -+ } -+ -+ char *output[20]; -+ int total = fill_list_from_section(output, "GLOBAL"); -+ for(j=0; j<total; j++) { -+ char key[100], value[100]; -+ int ret = get_key_value_from_string(output[j], "=", key, value); -+ if(ret == 0) { -+ if(strcmp(key, "FIFO") == 0) { -+ strcpy(readfifo, value); -+ } -+ if(strcmp(key, "REFRESH_RATE_USEC") == 0) { -+ refresh_rate = atoi(value); -+ } -+ if(strcmp(key, "MAX_WIDTH") == 0) { -+ MAX_WIDTH = atoi(value); -+ } -+ if(strcmp(key, "MAX_HEIGHT") == 0) { -+ MAX_HEIGHT = atoi(value); -+ } -+ if(strcmp(key, "X_POS") == 0) { -+ x_pos = atoi(value); -+ } -+ if(strcmp(key, "Y_POS") == 0) { -+ y_pos = atoi(value); -+ } -+ } -+ -+ } -+ -+ printf("\n-------------------------------------------------\n"); -+ printf("Configured REFRESH_RATE is %d\n", refresh_rate); -+ printf("Configured FIFO is %s\n", readfifo); -+ printf("Configured MAX_WIDTH is %d\n", MAX_WIDTH); -+ printf("Configured MAX_HEIGHT is %d\n", MAX_HEIGHT); -+ printf("Configured starting location is (%d, %d)\n", x_pos, y_pos); -+ printf("\n-------------------------------------------------\n"); -+ -+ int fd = open(readfifo, O_RDONLY|O_NONBLOCK); -+ if (fd != -1) { -+ printf("SUCCESS: Configured FIFO exists\n"); -+ close(fd); -+ } -+ else { -+ printf("ERROR: %s not found\nPlease create the fifo by executing mkfifo %s before running the application\n", readfifo, readfifo); -+ exit(0); -+ } -+ -+ -+ bg_p.title = malloc(100); -+ sprintf(bg_p.title, "CPU Usage[@position-req=%dx%d]", x_pos, y_pos); -+ -+ /* ------------------------------------------------------------------------*/ -+ /* Section for populating all lists from cfg sections*/ -+ /* ------------------------------------------------------------------------*/ -+ char *boot_list[20]; -+ int total_boot_items = fill_list_from_section(boot_list, "BOOT_TIME"); -+ -+ char *temperature_list[20]; -+ int total_temperature_items = fill_list_from_section(temperature_list, "TEMPERATURE"); -+ -+ char *cpu_load_list[20]; -+ total_cpu_load_items = fill_list_from_section(cpu_load_list, "CPU_LOAD"); -+ -+ char *voltage_list[20]; -+ int total_voltage_items = fill_list_from_section(voltage_list, "VOLTAGE"); -+ -+ char *frequency_list[20]; -+ int total_frequency_items = fill_list_from_section(frequency_list, "FREQUENCY"); -+ /* ------------------------------------------------------------------------*/ -+ /* total_elements will be updated inside the fill_list_from_section function */ -+ -+ t_cfg = malloc(sizeof(struct _text_config) * (total_elements*2 + 1)); -+ y_cfg = malloc(sizeof(struct _bar_graph_y_config) * total_elements*2); -+ bg_p.num_of_y_items = total_elements*2; -+ bg_p.y_config_array = y_cfg; -+ bg_p.num_of_text_items = total_elements*2 + 1; -+ bg_p.text_config_array = t_cfg; -+ -+ bg_y = malloc(sizeof(double) * total_elements * 2); -+ for(i=0; i< (total_elements*2+1); i++) { -+ bg_text[i] = malloc(150); -+ bg_y[i] = 1.0; -+ } -+ -+ tg_y = malloc(sizeof(double) * total_elements * 2); -+ for(i=0; i< (total_elements*2+1); i++) { -+ tg_text[i] = malloc(150); -+ tg_y[i] = 0.1 * i; -+ } -+ -+ struct table_configuration boot_table_config; -+ populate_table_configuration(&boot_table_config, total_boot_items, boot_list); -+ -+ struct table_configuration temp_table_config; -+ populate_table_configuration(&temp_table_config, total_temperature_items, temperature_list); -+ -+ struct table_configuration voltage_table_config; -+ populate_table_configuration(&voltage_table_config, total_voltage_items, voltage_list); -+ -+ struct table_configuration frequency_table_config; -+ populate_table_configuration(&frequency_table_config, total_frequency_items, frequency_list); -+ -+ struct table_configuration cpu_load_config; -+ cpu_load_config.BL_START_X = 40; -+ cpu_load_config.BL_START_Y = 80 + (total_boot_items + total_temperature_items + total_voltage_items + total_frequency_items+ 4) * boot_table_config.BAR_HEIGHT + 80 /*cpu_load_config.BAR_HEIGHT */; -+ cpu_load_config.BAR_GAP = 20; -+ cpu_load_config.BAR_HEIGHT = 80; -+ cpu_load_config.BAR_WIDTH = 40; -+ cpu_load_config.TR_START_X = cpu_load_config.BL_START_X + cpu_load_config.BAR_WIDTH; -+ cpu_load_config.TR_START_Y = cpu_load_config.BL_START_Y - cpu_load_config.BAR_HEIGHT; -+ cpu_load_config.FONT_SIZE = 15; -+ if(total_cpu_load_items > 0) { -+ fill_cpu_load_details(total_boot_items+total_temperature_items+total_voltage_items+total_frequency_items, total_boot_items+total_temperature_items+total_voltage_items+total_frequency_items+total_cpu_load_items, cpu_load_list, &cpu_load_config); -+ } -+ else { -+ cpu_load_offset = total_boot_items + total_temperature_items + total_voltage_items + total_frequency_items; -+ } -+ -+ tg_p.title=(char *)malloc(100); -+ sprintf(tg_p.title, "CPU Usage[@position-req=%dx%d]", x_pos, y_pos); -+ tg_p.height = MAX_HEIGHT; -+ tg_p.width = MAX_WIDTH; -+ -+ struct _y_config *tg_y_cfg = malloc(tg_p.num_of_y_items * sizeof(struct _y_config)); -+ tg_p.y_config_array = tg_y_cfg; -+ tg_p.text_config_array = t_cfg; -+ -+ printf("Proceeding to create starting visualization...\n"); -+ ctx = time_graph_create(argc, argv, &tg_p); -+ if (!ctx) { -+ printf("Unable to create time_graph... \n"); -+ exit(0); -+ } -+ -+ ctx = bar_graph_create(argc, argv, &bg_p); -+ if (!ctx) { -+ printf("Error creating context\n"); -+ exit(0); -+ } -+ -+ command_handler(OPEN, NULL, NULL); -+ -+ /* Plot the graph first time */ -+ time_graph_plot(ctx, tg_y, (const char **)tg_text); -+ bar_graph_plot(ctx, bg_y, (const char **)bg_text); -+ -+ while (!sigtermed) -+ { -+ usleep(refresh_rate); -+ int bytes_read = command_handler(READ, bg_y, bg_text); -+ if(bytes_read > 0) { -+ time_graph_plot(ctx, tg_y, (const char **)tg_text); -+ bar_graph_plot(ctx, bg_y, (const char **)bg_text); -+ } -+ } -+ -+ bar_graph_destroy(ctx); -+ command_handler(CLOSE, NULL, NULL); -+ return 0; -+} -diff --git a/clients/soc_performance_monitor.h b/clients/soc_performance_monitor.h -new file mode 100644 -index 0000000..861c8c7 ---- /dev/null -+++ b/clients/soc_performance_monitor.h -@@ -0,0 +1,40 @@ -+#define __SLEEP usleep(1000000) -+ -+#define MAX_BUF 1024 -+#define OPEN 1 -+#define READ 2 -+#define CLOSE 3 -+ -+#define MAX_COLORS 12 -+ -+#define printd(fmt, ...) \ -+ do { if (debug) fprintf(stderr, fmt, __VA_ARGS__); } while (0) -+ -+ -+struct _rgba pallette[MAX_COLORS] = -+{ -+ { 1.0, 0.0, 0.0, 1.0 }, -+ { 0.0, 0.5, 0.0, 1.0 }, -+ { 0.0, 0.0, 1.0, 1.0 }, -+ { 0.0, 0.0, 0.0, 1.0 }, -+ { 0.0, 0.5, 1.0, 1.0 }, -+ { 1.0, 0.0, 1.0, 1.0 }, -+ { 0.5, 0.5, 1.0, 1.0 }, -+ { 1.0, 0.5, 0.0, 1.0 }, -+ { 0.5, 0.5, 0.25, 1.0 }, -+ { 0.5, 0.0, 0.0, 1.0 }, -+ { 1.0, 0.5, 0.5, 1.0 }, -+ { 0.0, 0.0, 0.20, 1.0 } -+}; -+ -+struct table_configuration { -+ int BL_START_X; -+ int BL_START_Y; -+ int BAR_GAP; -+ int BAR_HEIGHT; -+ int BAR_WIDTH; -+ int TR_START_X; -+ int TR_START_Y; -+ int FONT_SIZE; -+}; -+ -diff --git a/clients/statcoll.c b/clients/statcoll.c -new file mode 100644 -index 0000000..5d5cae7 ---- /dev/null -+++ b/clients/statcoll.c -@@ -0,0 +1,1433 @@ -+/* -+ * Copyright (C) 2015 Texas Instruments -+ * created by prash@ti.com on 16 Jan 2013 -+ * Adapted to Linux with changes in framework: Karthik R <karthik.ramanan@ti.com> -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License version 2 as published by -+ * the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, but WITHOUT -+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -+ * more details. -+ * -+ * You should have received a copy of the GNU General Public License along with -+ * this program. If not, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <sys/mman.h> -+#include <fcntl.h> -+#include <signal.h> -+#include <unistd.h> -+#include <sys/time.h> -+ -+#include "statcoll.h" -+#include "statcoll_gui.h" -+#include "time_bar_graph.h" -+ -+#define ENABLE_MODE 0x0 -+#define READ_STATUS_MODE 0x1 -+ -+ -+ -+#define OPEN 1 -+#define READ 2 -+#define CLOSE 3 -+ -+ -+#if 1 -+#define __SLEEP sleep(1) -+#else -+#define __SLEEP usleep(100000) -+#endif -+//#define DUMMY_MODE -+ -+#define MAX_COLORS 12 -+ -+struct _rgba pallette[MAX_COLORS] = -+{ -+ { 1.0, 0.0, 0.0, 1.0 }, -+ { 0.0, 0.5, 0.0, 1.0 }, -+ { 0.0, 0.0, 1.0, 1.0 }, -+ { 0.0, 0.0, 0.0, 1.0 }, -+ { 0.0, 0.5, 1.0, 1.0 }, -+ { 1.0, 0.0, 1.0, 1.0 }, -+ { 0.5, 0.5, 1.0, 1.0 }, -+ { 1.0, 0.5, 0.0, 1.0 }, -+ { 0.5, 0.5, 0.25, 1.0 }, -+ { 0.5, 0.0, 0.0, 1.0 }, -+ { 1.0, 0.5, 0.5, 1.0 }, -+ { 0.0, 0.0, 0.20, 1.0 } -+}; -+ -+const struct list_of_initiators initiators[STATCOL_MAX] = -+{ -+ { STATCOL_EMIF1_SYS, "STATCOL_EMIF1_SYS" }, -+ { STATCOL_EMIF2_SYS,"STATCOL_EMIF2_SYS" }, -+ { STATCOL_MA_MPU_P1,"STATCOL_MPU_P1" }, -+ { STATCOL_MA_MPU_P2,"STATCOL_MPU_P2" }, -+ { STATCOL_MPU1,"STATCOL_MPU1" }, -+ { STATCOL_MMU1,"STATCOL_MMU1" }, -+ { STATCOL_TPTC_RD1,"STATCOL_TPTC_RD1" }, -+ { STATCOL_TPTC_WR1,"STATCOL_TPTC_WR1" }, -+ { STATCOL_TPTC_RD2,"STATCOL_TPTC_RD2" }, -+ { STATCOL_TPTC_WR2,"STATCOL_TPTC_WR2" }, -+ { STATCOL_VIP1_P1,"STATCOL_VIP1_P1" }, -+ { STATCOL_VIP1_P2,"STATCOL_VIP1_P2" }, -+ { STATCOL_VIP2_P1,"STATCOL_VIP2_P1" }, -+ { STATCOL_VIP2_P2,"STATCOL_VIP2_P2" }, -+ { STATCOL_VIP3_P1,"STATCOL_VIP3_P1" }, -+ { STATCOL_VIP3_P2,"STATCOL_VIP3_P2" }, -+ { STATCOL_VPE_P1,"STATCOL_VPE_P1" }, -+ { STATCOL_VPE_P2,"STATCOL_VPE_P2" }, -+ { STATCOL_EVE1_TC0,"STATCOL_EVE1_TC0" }, -+ { STATCOL_EVE1_TC1,"STATCOL_EVE1_TC1" }, -+ { STATCOL_EVE2_TC0,"STATCOL_EVE2_TC0" }, -+ { STATCOL_EVE2_TC1,"STATCOL_EVE2_TC1" }, -+ { STATCOL_EVE3_TC0,"STATCOL_EVE3_TC0" }, -+ { STATCOL_EVE3_TC1,"STATCOL_EVE3_TC1" }, -+ { STATCOL_EVE4_TC0,"STATCOL_EVE4_TC0" }, -+ { STATCOL_EVE4_TC1,"STATCOL_EVE4_TC1" }, -+ { STATCOL_DSP1_MDMA,"STATCOL_DSP1_MDMA" }, -+ { STATCOL_DSP1_EDMA,"STATCOL_DSP1_EDMA" }, -+ { STATCOL_DSP2_MDMA,"STATCOL_DSP2_MDMA" }, -+ { STATCOL_DSP2_EDMA,"STATCOL_DSP2_EDMA" }, -+ { STATCOL_IVA,"STATCOL_IVA" }, -+ { STATCOL_GPU_P1,"STATCOL_GPU_P1" }, -+ { STATCOL_GPU_P2,"STATCOL_GPU_P2" }, -+ { STATCOL_BB2D_P1,"STATCOL_BB2D_P1" }, -+ { STATCOL_DSS,"STATCOL_DSS" }, -+ { STATCOL_CSI2_2,"STATCOL_CSI2_2" }, -+ { STATCOL_MMU2,"STATCOL_MMU2" }, -+ { STATCOL_IPU1,"STATCOL_IPU1" }, -+ { STATCOL_IPU2,"STATCOL_IPU2" }, -+ { STATCOL_DMA_SYSTEM_RD,"STATCOL_DMA_SYSTEM_RD" }, -+ { STATCOL_DMA_SYSTEM_WR,"STATCOL_DMA_SYSTEM_WR" }, -+ { STATCOL_CSI2_1,"STATCOL_CSI2_1" }, -+ { STATCOL_USB3_SS,"STATCOL_USB3_SS" }, -+ { STATCOL_USB2_SS,"STATCOL_USB2_SS" }, -+ { STATCOL_USB2_ULPI_SS1,"STATCOL_USB2_ULPI_SS1" }, -+ { STATCOL_USB2_ULPI_SS2,"STATCOL_USB2_ULPI_SS2" }, -+ { STATCOL_PCIE_SS1,"STATCOL_PCIE_SS1" }, -+ { STATCOL_PCIE_SS2,"STATCOL_PCIE_SS2" }, -+ { STATCOL_DSP1_CFG,"STATCOL_DSP1_CFG" }, -+ { STATCOL_DSP2_CFG,"STATCOL_DSP2_CFG" }, -+ { STATCOL_GMAC_SW,"STATCOL_GMAC_SW" }, -+ { STATCOL_PRUSS1_P1,"STATCOL_PRUSS1_P1" }, -+ { STATCOL_PRUSS1_P2,"STATCOL_PRUSS1_P2" }, -+ { STATCOL_PRUSS2_P1,"STATCOL_PRUSS2_P1" }, -+ { STATCOL_PRUSS2_P2,"STATCOL_PRUSS2_P2" }, -+ { STATCOL_DMA_CRYPTO_RD,"STATCOL_DMA_CRYPTO_RD" }, -+ { STATCOL_DMA_CRYPTO_WR,"STATCOL_DMA_CRYPTO_WR" }, -+ { STATCOL_MPU2,"STATCOL_MPU2" }, -+ { STATCOL_MMC1,"STATCOL_MMC1" }, -+ { STATCOL_MMC2,"STATCOL_MMC2" }, -+ { STATCOL_SATA,"STATCOL_SATA" }, -+ { STATCOL_MLBSS,"STATCOL_MLBSS" }, -+ { STATCOL_BB2D_P2,"STATCOL_BB2D_P2" }, -+ { STATCOL_IEEE1500,"STATCOL_IEEE1500" }, -+ { STATCOL_DBG,"STATCOL_DBG" }, -+ { STATCOL_VCP1,"STATCOL_VCP1" }, -+ { STATCOL_OCMC_RAM1,"STATCOL_OCMC_RAM1" }, -+ { STATCOL_OCMC_RAM2,"STATCOL_OCMC_RAM2" }, -+ { STATCOL_OCMC_RAM3,"STATCOL_OCMC_RAM3" }, -+ { STATCOL_GPMC,"STATCOL_GPMC" }, -+ { STATCOL_MCASP1,"STATCOL_MCASP1" }, -+ { STATCOL_MCASP2,"STATCOL_MCASP2" }, -+ { STATCOL_MCASP3,"STATCOL_MCASP3" }, -+ { STATCOL_VCP2, "STATCOL_VCP2" } -+}; -+ -+StatCollectorObj gStatColState; -+ -+static void *statcoll_base_mem; -+static int *l3_3_clkctrl; -+ -+static UInt32 *statCountDSS = NULL; -+static UInt32 *statCountIVA = NULL; -+static UInt32 *statCountBB2DP1 = NULL; -+static UInt32 *statCountBB2DP2 = NULL; -+static UInt32 *statCountUSB4 = NULL; -+static UInt32 *statCountSata = NULL; -+static UInt32 *statCountEmif1 = NULL; -+static UInt32 *statCountEmif2 = NULL; -+ -+ -+static statcoll_initiators_object global_object[STATCOL_MAX]; -+UInt32 statCountIdx = 0; -+UInt32 TRACE_SZ = 0; -+ -+void create_overall_box(struct _bar_graph_y_config *y_cfg, struct _text_config *t_cfg, char *text[]) -+{ -+ int i=0; -+ -+ memset(y_cfg, 0x0, sizeof(struct _y_config)*25); -+ memset(t_cfg, 0x0, sizeof(struct _text_config)*25); -+ -+ -+ for(i=0; i<TOTAL_Y_PARAMETERS; i++) { -+ (y_cfg+i)->line_color.r = 1.0; -+ (y_cfg+i)->line_color.g = 1.0; -+ (y_cfg+i)->line_color.b = 1.0; -+ (y_cfg+i)->line_color.a = 0.7; -+ (y_cfg+i)->fill_color.r = 0.0; -+ (y_cfg+i)->fill_color.g = 0.0; -+ (y_cfg+i)->fill_color.b = 0.0; -+ (y_cfg+i)->fill_color.a = 0.1; -+ } -+ -+ (y_cfg+0)->region.bottom_left.x = 0; -+ (y_cfg+0)->region.bottom_left.y = MAX_HEIGHT - HEIGHT_EMIF_AREA; -+ (y_cfg+0)->region.top_right.x = MAX_WIDTH; -+ (y_cfg+0)->region.top_right.y = 0; -+ -+ (t_cfg+0)->at.x = MAX_WIDTH/2 - 8*FONT_SIZE - 50; -+ (t_cfg+0)->at.y = BORDER - FONT_SIZE + 6; -+ strcpy(text[0], string_list[0]); -+ -+ (y_cfg+1)->region.bottom_left.x = TIME_GRAPH_AREA_BL_X; -+ (y_cfg+1)->region.bottom_left.y = TIME_GRAPH_AREA_BL_Y; -+ (y_cfg+1)->region.top_right.x = TIME_GRAPH_AREA_TR_X; -+ (y_cfg+1)->region.top_right.y = TIME_GRAPH_AREA_TR_Y; -+ -+ (t_cfg+1)->at.x = TIME_GRAPH_AREA_BL_X - 2*FONT_SIZE; -+ (t_cfg+1)->at.y = TIME_GRAPH_AREA_TR_Y; -+ strcpy(text[1],string_list[1]); -+ -+ for(i=2; i<7; i++) -+ { -+ (y_cfg+i)->region.bottom_left.x = TIME_GRAPH_AREA_BL_X; -+ (y_cfg+i)->region.bottom_left.y = TIME_GRAPH_AREA_BL_Y;// - (i-2) * (30); -+ (y_cfg+i)->region.top_right.x = TIME_GRAPH_AREA_TR_X; -+ (y_cfg+i)->region.top_right.y = TIME_GRAPH_AREA_TR_Y + (i-1) * ((TIME_GRAPH_AREA_BL_Y - TIME_GRAPH_AREA_TR_Y)/5); -+ (t_cfg+i)->at.x = TIME_GRAPH_AREA_BL_X - 2*FONT_SIZE; -+ (t_cfg+i)->at.y = TIME_GRAPH_AREA_TR_Y + (i-1) * ((TIME_GRAPH_AREA_BL_Y - TIME_GRAPH_AREA_TR_Y)/5);//TIME_GRAPH_AREA_TR_Y; -+ strcpy(text[i],string_list[i]); -+ } -+ -+#if 1 -+ (y_cfg+7)->region.bottom_left.x = EMIF_AREA_BL_X; -+ (y_cfg+7)->region.bottom_left.y = EMIF_AREA_BL_Y; -+ (y_cfg+7)->region.top_right.x = EMIF_AREA_TR_X; -+ (y_cfg+7)->region.top_right.y = EMIF_AREA_TR_Y; -+ -+ (t_cfg+7)->at.x = WIDTH_EMIF_AREA/2 - 2*FONT_SIZE; -+ (t_cfg+7)->at.y = EMIF_AREA_TR_Y + FONT_SIZE; -+ strcpy(text[7],string_list[7]); -+ -+ for(i=8; i<12; i=i+2) -+ { -+ (y_cfg+i)->region.bottom_left.x = EMIF_AREA_BL_X + BORDER + (i-8)*(BAR_WIDTH+BAR_GAP)/2; -+ (y_cfg+i)->region.bottom_left.y = EMIF_AREA_BL_Y - BORDER/2;// - (i-2) * (30); -+ (y_cfg+i)->region.top_right.x = EMIF_AREA_BL_X + BORDER + BAR_WIDTH + (i-8) * (BAR_WIDTH + BAR_GAP)/2; -+ (y_cfg+i)->region.top_right.y = EMIF_AREA_TR_Y + BORDER * 1.2; -+ -+ (y_cfg+i)->fill_color.r = 1.0; -+ (y_cfg+i)->fill_color.g = 0.0; -+ (y_cfg+i)->fill_color.b = 0.0; -+ (y_cfg+i)->fill_color.a = 0.1; -+ -+ (y_cfg+i+1)->region.bottom_left.x = EMIF_AREA_BL_X + BORDER + (i-8) * (BAR_WIDTH + BAR_GAP)/2; -+ (y_cfg+i+1)->region.bottom_left.y = EMIF_AREA_BL_Y - BORDER/2; -+ (y_cfg+i+1)->region.top_right.x = EMIF_AREA_BL_X + BORDER + BAR_WIDTH + (i-8) * (BAR_WIDTH + BAR_GAP)/2; -+ (y_cfg+i+1)->region.top_right.y = EMIF_AREA_TR_Y + BORDER*1.2; -+ -+ (y_cfg+i+1)->fill_color.r = 0.0; -+ (y_cfg+i+1)->fill_color.g = 1.0; -+ (y_cfg+i+1)->fill_color.b = 0.0; -+ (y_cfg+i+1)->fill_color.a = 1.0; -+ -+ (t_cfg+i)->at.x = EMIF_AREA_BL_X + BAR_WIDTH + BORDER + (i-8) * (BAR_WIDTH + BAR_GAP)/2- 2.2*FONT_SIZE; -+ (t_cfg+i)->at.y = EMIF_AREA_TR_Y + BORDER*1.2 -5; -+ -+ /* Fixed strings */ -+ (t_cfg+i+1)->at.x = EMIF_AREA_BL_X + BORDER + (i-8) * (BAR_WIDTH + BAR_GAP)/2; -+ (t_cfg+i+1)->at.y = EMIF_AREA_BL_Y;// - BORDER + FONT_SIZE; -+ -+ strcpy(text[i],string_list[i]); -+ strcpy(text[i+1],string_list[i+1]); -+ } -+ -+ (y_cfg+12)->region.bottom_left.x = INITIATORS_AREA_BL_X; -+ (y_cfg+12)->region.bottom_left.y = INITIATORS_AREA_BL_Y; -+ (y_cfg+12)->region.top_right.x = INITIATORS_AREA_TR_X; -+ (y_cfg+12)->region.top_right.y = INITIATORS_AREA_TR_Y; -+ -+ (t_cfg+12)->at.x = EMIF_AREA_TR_X + (INITIATORS_AREA_TR_X - INITIATORS_AREA_BL_X)/2 - 4 * FONT_SIZE; -+ (t_cfg+12)->at.y = INITIATORS_AREA_TR_Y + FONT_SIZE; -+ strcpy(text[12],string_list[12]); -+ -+ for(i=13; i<25; i=i+2) -+ { -+ (y_cfg+i)->region.bottom_left.x = INITIATORS_AREA_BL_X + BORDER + (i-13)*(BAR_WIDTH+BAR_GAP)/2; -+ (y_cfg+i)->region.bottom_left.y = INITIATORS_AREA_BL_Y - BORDER/2;// - (i-2) * (30); -+ (y_cfg+i)->region.top_right.x = INITIATORS_AREA_BL_X + BORDER + BAR_WIDTH + (i-13) * (BAR_WIDTH + BAR_GAP)/2; -+ (y_cfg+i)->region.top_right.y = INITIATORS_AREA_TR_Y + BORDER*1.2; -+ -+ (y_cfg+i)->fill_color.r = 1.0; -+ (y_cfg+i)->fill_color.g = 0.0; -+ (y_cfg+i)->fill_color.b = 0.0; -+ (y_cfg+i)->fill_color.a = 0.1; -+ -+ (y_cfg+i+1)->region.bottom_left.x = INITIATORS_AREA_BL_X + BORDER + (i-13) * (BAR_WIDTH + BAR_GAP)/2; -+ (y_cfg+i+1)->region.bottom_left.y = INITIATORS_AREA_BL_Y - BORDER/2;// - (i-2) * (30); -+ (y_cfg+i+1)->region.top_right.x = INITIATORS_AREA_BL_X + BORDER + BAR_WIDTH + (i-13) * (BAR_WIDTH + BAR_GAP)/2; -+ (y_cfg+i+1)->region.top_right.y = INITIATORS_AREA_TR_Y + BORDER* 1.2; -+ -+ (y_cfg+i+1)->fill_color.r = 0.0; -+ (y_cfg+i+1)->fill_color.g = 1.0; -+ (y_cfg+i+1)->fill_color.b = 0.0; -+ (y_cfg+i+1)->fill_color.a = 1.0; -+ -+ (t_cfg+i)->at.x = INITIATORS_AREA_BL_X + BORDER + BAR_WIDTH + (i-13) * (BAR_WIDTH + BAR_GAP)/2 - 2.2* FONT_SIZE; -+ (t_cfg+i)->at.y = INITIATORS_AREA_TR_Y + BORDER*1.2 -5; -+ -+ (t_cfg+i+1)->at.x = INITIATORS_AREA_BL_X + BORDER + (i-13)*(BAR_WIDTH+BAR_GAP)/2; -+ (t_cfg+i+1)->at.y = INITIATORS_AREA_BL_Y; -+ -+ strcpy(text[i],string_list[i]); -+ strcpy(text[i+1],string_list[i+1]); -+ } -+#endif -+ -+#if 0 -+ for(i=0; i<25; i++) -+ printf("(%d, %d) to (%d, %d)\n", (y_cfg +i)->region.bottom_left.x,(y_cfg +i)->region.bottom_left.y,(y_cfg +i)->region.top_right.x, (y_cfg +i)->region.top_right.y); -+#endif -+ -+ -+ -+ for(i=0; i<25; i++) { -+ (t_cfg+i)->color.r = 0.0; -+ (t_cfg+i)->color.g = 1.0; -+ (t_cfg+i)->color.b = 1.0; -+ (t_cfg+i)->color.a = 1.0; -+ (t_cfg+i)->fontsize = FONT_SIZE; -+ } -+ (t_cfg+0)->fontsize = 20; -+ -+ -+} -+ -+ -+void statCollectorInit() -+{ -+ int index; -+ -+ gStatColState.stat0_filter_cnt = 0; -+ gStatColState.stat1_filter_cnt = 0; -+ gStatColState.stat2_filter_cnt = 0; -+ gStatColState.stat3_filter_cnt = 0; -+ gStatColState.stat4_filter_cnt = 0; -+ gStatColState.stat5_filter_cnt = 0; -+ gStatColState.stat6_filter_cnt = 0; -+ gStatColState.stat7_filter_cnt = 0; -+ gStatColState.stat8_filter_cnt = 0; -+ gStatColState.stat9_filter_cnt = 0; -+ -+ for(index=STATCOL_EMIF1_SYS; index < STATCOL_MAX; index++) -+ { -+ global_object[index].b_enabled = 0; -+ -+ strcpy(global_object[index].name, initiators[index].name); -+ -+ global_object[index].readings = malloc(TRACE_SZ * sizeof(UInt32)); -+ memset(global_object[index].readings, 0, TRACE_SZ * sizeof(UInt32)); -+ -+ global_object[index].timestamp = NULL; -+ -+ global_object[index].group_id = 0xFF; -+ global_object[index].counter_id = 0; -+ global_object[index].base_address = 0; -+ global_object[index].mux_req = 0; -+ } -+ -+} -+ -+void wr_stat_reg(UInt32 address, UInt32 data) -+{ -+ UInt32 *mymem = statcoll_base_mem; -+ UInt32 delta = (address - STATCOLL_BASE) / 4; -+#ifndef DUMMY_MODE -+ mymem[delta] = data; -+#else -+ printf("WRITE: Address = 0x%x, Data = 0x%x\n", address, data); -+#endif -+} -+ -+UInt32 rd_stat_reg(UInt32 address) -+{ -+#ifndef DUMMY_MODE -+ UInt32 *mymem = statcoll_base_mem; -+ UInt32 data; -+ UInt32 delta = (address - STATCOLL_BASE) / 4; -+ data = mymem[delta]; -+ return data; -+#else -+ printf("READ: Address = 0x%x\n", address); -+#endif -+} -+ -+UInt32 statCollectorControlInitialize(UInt32 instance_id) -+{ -+ UInt32 cur_base_address = 0; -+ UInt32 cur_event_mux_req; -+ UInt32 cur_event_mux_resp; -+ UInt32 cur_stat_filter_cnt; -+ -+ switch (instance_id) -+ { -+ case STATCOL_EMIF1_SYS: -+ cur_base_address = stat_coll0_base_address; -+ cur_event_mux_req = 0; -+ cur_event_mux_resp = 1; -+ gStatColState.stat0_filter_cnt = gStatColState.stat0_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat0_filter_cnt; -+ global_object[instance_id].group_id = 0; -+ break; -+ case STATCOL_EMIF2_SYS: -+ cur_base_address = stat_coll0_base_address; -+ cur_event_mux_req = 2; -+ cur_event_mux_resp = 3; -+ gStatColState.stat0_filter_cnt = gStatColState.stat0_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat0_filter_cnt; -+ global_object[instance_id].group_id = 0; -+ break; -+ case STATCOL_MA_MPU_P1: -+ cur_base_address = stat_coll0_base_address; -+ cur_event_mux_req = 4; -+ cur_event_mux_resp = 5; -+ gStatColState.stat0_filter_cnt = gStatColState.stat0_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat0_filter_cnt; -+ global_object[instance_id].group_id = 0; -+ break; -+ case STATCOL_MA_MPU_P2: -+ cur_base_address = stat_coll0_base_address; -+ cur_event_mux_req = 6; -+ cur_event_mux_resp = 7; -+ gStatColState.stat0_filter_cnt = gStatColState.stat0_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat0_filter_cnt; -+ global_object[instance_id].group_id = 0; -+ break; -+ case STATCOL_MPU1: -+ cur_base_address = stat_coll1_base_address; -+ cur_event_mux_req = 0; -+ cur_event_mux_resp = 1; -+ gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat1_filter_cnt; -+ global_object[instance_id].group_id = 1; -+ break; -+ case STATCOL_MMU1: -+ cur_base_address = stat_coll1_base_address; -+ cur_event_mux_req = 2; -+ cur_event_mux_resp = 3; -+ gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat1_filter_cnt; -+ global_object[instance_id].group_id = 1; -+ break; -+ case STATCOL_TPTC_RD1: -+ cur_base_address = stat_coll1_base_address; -+ cur_event_mux_req = 4; -+ cur_event_mux_resp = 5; -+ gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat1_filter_cnt; -+ global_object[instance_id].group_id = 1; -+ break; -+ case STATCOL_TPTC_WR1: -+ cur_base_address = stat_coll1_base_address; -+ cur_event_mux_req = 6; -+ cur_event_mux_resp = 7; -+ gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat1_filter_cnt; -+ global_object[instance_id].group_id = 1; -+ break; -+ case STATCOL_TPTC_RD2: -+ cur_base_address = stat_coll1_base_address; -+ cur_event_mux_req = 8; -+ cur_event_mux_resp = 9; -+ gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat1_filter_cnt; -+ global_object[instance_id].group_id = 1; -+ break; -+ case STATCOL_TPTC_WR2: -+ cur_base_address = stat_coll1_base_address; -+ cur_event_mux_req = 10; -+ cur_event_mux_resp = 11; -+ gStatColState.stat1_filter_cnt = gStatColState.stat1_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat1_filter_cnt; -+ global_object[instance_id].group_id = 1; -+ break; -+ case STATCOL_VIP1_P1: -+ cur_base_address = stat_coll2_base_address; -+ cur_event_mux_req = 0; -+ cur_event_mux_resp = 1; -+ gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat2_filter_cnt; -+ global_object[instance_id].group_id = 2; -+ break; -+ case STATCOL_VIP1_P2: -+ cur_base_address = stat_coll2_base_address; -+ cur_event_mux_req = 2; -+ cur_event_mux_resp = 3; -+ gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat2_filter_cnt; -+ global_object[instance_id].group_id = 2; -+ break; -+ case STATCOL_VIP2_P1: -+ cur_base_address = stat_coll2_base_address; -+ cur_event_mux_req = 4; -+ cur_event_mux_resp = 5; -+ gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat2_filter_cnt; -+ global_object[instance_id].group_id = 2; -+ break; -+ case STATCOL_VIP2_P2: -+ cur_base_address = stat_coll2_base_address; -+ cur_event_mux_req = 6; -+ cur_event_mux_resp = 7; -+ gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat2_filter_cnt; -+ global_object[instance_id].group_id = 2; -+ break; -+ case STATCOL_VIP3_P1: -+ cur_base_address = stat_coll2_base_address; -+ cur_event_mux_req = 8; -+ cur_event_mux_resp = 9; -+ gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat2_filter_cnt; -+ global_object[instance_id].group_id = 2; -+ break; -+ case STATCOL_VIP3_P2: -+ cur_base_address = stat_coll2_base_address; -+ cur_event_mux_req = 10; -+ cur_event_mux_resp = 11; -+ gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat2_filter_cnt; -+ global_object[instance_id].group_id = 2; -+ break; -+ case STATCOL_VPE_P1: -+ cur_base_address = stat_coll2_base_address; -+ cur_event_mux_req = 12; -+ cur_event_mux_resp = 13; -+ gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat2_filter_cnt; -+ global_object[instance_id].group_id = 2; -+ break; -+ case STATCOL_VPE_P2: -+ cur_base_address = stat_coll2_base_address; -+ cur_event_mux_req = 14; -+ cur_event_mux_resp = 15; -+ gStatColState.stat2_filter_cnt = gStatColState.stat2_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat2_filter_cnt; -+ global_object[instance_id].group_id = 2; -+ break; -+ case STATCOL_EVE1_TC0: -+ cur_base_address = stat_coll3_base_address; -+ cur_event_mux_req = 0; -+ cur_event_mux_resp = 1; -+ gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat3_filter_cnt; -+ global_object[instance_id].group_id = 3; -+ break; -+ case STATCOL_EVE1_TC1: -+ cur_base_address = stat_coll3_base_address; -+ cur_event_mux_req = 2; -+ cur_event_mux_resp = 3; -+ gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat3_filter_cnt; -+ global_object[instance_id].group_id = 3; -+ break; -+ case STATCOL_EVE2_TC0: -+ cur_base_address = stat_coll3_base_address; -+ cur_event_mux_req = 4; -+ cur_event_mux_resp = 5; -+ gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat3_filter_cnt; -+ global_object[instance_id].group_id = 3; -+ break; -+ case STATCOL_EVE2_TC1: -+ cur_base_address = stat_coll3_base_address; -+ cur_event_mux_req = 6; -+ cur_event_mux_resp = 7; -+ gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat3_filter_cnt; -+ global_object[instance_id].group_id = 3; -+ break; -+ case STATCOL_EVE3_TC0: -+ cur_base_address = stat_coll3_base_address; -+ cur_event_mux_req = 8; -+ cur_event_mux_resp = 9; -+ gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat3_filter_cnt; -+ global_object[instance_id].group_id = 3; -+ break; -+ case STATCOL_EVE3_TC1: -+ cur_base_address = stat_coll3_base_address; -+ cur_event_mux_req = 10; -+ cur_event_mux_resp = 11; -+ gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat3_filter_cnt; -+ global_object[instance_id].group_id = 3; -+ break; -+ case STATCOL_EVE4_TC0: -+ cur_base_address = stat_coll3_base_address; -+ cur_event_mux_req = 12; -+ cur_event_mux_resp = 13; -+ gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat3_filter_cnt; -+ global_object[instance_id].group_id = 3; -+ break; -+ case STATCOL_EVE4_TC1: -+ cur_base_address = stat_coll3_base_address; -+ cur_event_mux_req = 14; -+ cur_event_mux_resp = 15; -+ gStatColState.stat3_filter_cnt = gStatColState.stat3_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat3_filter_cnt; -+ global_object[instance_id].group_id = 3; -+ break; -+ case STATCOL_DSP1_MDMA: -+ cur_base_address = stat_coll4_base_address; -+ cur_event_mux_req = 0; -+ cur_event_mux_resp = 1; -+ gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat4_filter_cnt; -+ global_object[instance_id].group_id = 4; -+ break; -+ case STATCOL_DSP1_EDMA: -+ cur_base_address = stat_coll4_base_address; -+ cur_event_mux_req = 2; -+ cur_event_mux_resp = 3; -+ gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat4_filter_cnt; -+ global_object[instance_id].group_id = 4; -+ break; -+ case STATCOL_DSP2_MDMA: -+ cur_base_address = stat_coll4_base_address; -+ cur_event_mux_req = 4; -+ cur_event_mux_resp = 5; -+ gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat4_filter_cnt; -+ global_object[instance_id].group_id = 4; -+ break; -+ case STATCOL_DSP2_EDMA: -+ cur_base_address = stat_coll4_base_address; -+ cur_event_mux_req = 6; -+ cur_event_mux_resp = 7; -+ gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat4_filter_cnt; -+ global_object[instance_id].group_id = 4; -+ break; -+ case STATCOL_IVA: -+ cur_base_address = stat_coll4_base_address; -+ cur_event_mux_req = 8; -+ cur_event_mux_resp = 9; -+ gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat4_filter_cnt; -+ global_object[instance_id].group_id = 4; -+ break; -+ case STATCOL_GPU_P1: -+ cur_base_address = stat_coll4_base_address; -+ cur_event_mux_req = 10; -+ cur_event_mux_resp = 11; -+ gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat4_filter_cnt; -+ global_object[instance_id].group_id = 4; -+ break; -+ case STATCOL_GPU_P2: -+ cur_base_address = stat_coll4_base_address; -+ cur_event_mux_req = 12; -+ cur_event_mux_resp = 13; -+ gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat4_filter_cnt; -+ global_object[instance_id].group_id = 4; -+ break; -+ case STATCOL_BB2D_P1: -+ cur_base_address = stat_coll4_base_address; -+ cur_event_mux_req = 14; -+ cur_event_mux_resp = 15; -+ gStatColState.stat4_filter_cnt = gStatColState.stat4_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat4_filter_cnt; -+ global_object[instance_id].group_id = 4; -+ break; -+ case STATCOL_DSS: -+ cur_base_address = stat_coll5_base_address; -+ cur_event_mux_req = 0; -+ cur_event_mux_resp = 1; -+ gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat5_filter_cnt; -+ global_object[instance_id].group_id = 5; -+ break; -+ case STATCOL_CSI2_2: -+ cur_base_address = stat_coll5_base_address; -+ cur_event_mux_req = 2; -+ cur_event_mux_resp = 3; -+ gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat5_filter_cnt; -+ global_object[instance_id].group_id = 5; -+ break; -+ case STATCOL_MMU2: -+ cur_base_address = stat_coll5_base_address; -+ cur_event_mux_req = 4; -+ cur_event_mux_resp = 5; -+ gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat5_filter_cnt; -+ global_object[instance_id].group_id = 5; -+ break; -+ case STATCOL_IPU1: -+ cur_base_address = stat_coll5_base_address; -+ cur_event_mux_req = 6; -+ cur_event_mux_resp = 7; -+ gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat5_filter_cnt; -+ global_object[instance_id].group_id = 5; -+ break; -+ case STATCOL_IPU2: -+ cur_base_address = stat_coll5_base_address; -+ cur_event_mux_req = 8; -+ cur_event_mux_resp = 9; -+ gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat5_filter_cnt; -+ global_object[instance_id].group_id = 5; -+ break; -+ case STATCOL_DMA_SYSTEM_RD: -+ cur_base_address = stat_coll5_base_address; -+ cur_event_mux_req = 10; -+ cur_event_mux_resp = 11; -+ gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat5_filter_cnt; -+ global_object[instance_id].group_id = 5; -+ break; -+ case STATCOL_DMA_SYSTEM_WR: -+ cur_base_address = stat_coll5_base_address; -+ cur_event_mux_req = 12; -+ cur_event_mux_resp = 13; -+ gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat5_filter_cnt; -+ global_object[instance_id].group_id = 5; -+ break; -+ case STATCOL_CSI2_1: -+ cur_base_address = stat_coll5_base_address; -+ cur_event_mux_req = 14; -+ cur_event_mux_resp = 15; -+ gStatColState.stat5_filter_cnt = gStatColState.stat5_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat5_filter_cnt; -+ global_object[instance_id].group_id = 5; -+ break; -+ case STATCOL_USB3_SS: -+ cur_base_address = stat_coll6_base_address; -+ cur_event_mux_req = 0; -+ cur_event_mux_resp = 1; -+ gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat6_filter_cnt; -+ global_object[instance_id].group_id = 6; -+ break; -+ case STATCOL_USB2_SS: -+ cur_base_address = stat_coll6_base_address; -+ cur_event_mux_req = 2; -+ cur_event_mux_resp = 3; -+ gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat6_filter_cnt; -+ global_object[instance_id].group_id = 6; -+ break; -+ case STATCOL_USB2_ULPI_SS1: -+ cur_base_address = stat_coll6_base_address; -+ cur_event_mux_req = 4; -+ cur_event_mux_resp = 5; -+ gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat6_filter_cnt; -+ global_object[instance_id].group_id = 6; -+ break; -+ case STATCOL_USB2_ULPI_SS2: -+ cur_base_address = stat_coll6_base_address; -+ cur_event_mux_req = 6; -+ cur_event_mux_resp = 7; -+ gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat6_filter_cnt; -+ global_object[instance_id].group_id = 6; -+ break; -+ case STATCOL_PCIE_SS1: -+ cur_base_address = stat_coll6_base_address; -+ cur_event_mux_req = 8; -+ cur_event_mux_resp = 9; -+ gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat6_filter_cnt; -+ global_object[instance_id].group_id = 6; -+ break; -+ case STATCOL_PCIE_SS2: -+ cur_base_address = stat_coll6_base_address; -+ cur_event_mux_req = 10; -+ cur_event_mux_resp = 11; -+ gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat6_filter_cnt; -+ global_object[instance_id].group_id = 6; -+ break; -+ case STATCOL_DSP1_CFG: -+ cur_base_address = stat_coll6_base_address; -+ cur_event_mux_req = 12; -+ cur_event_mux_resp = 13; -+ gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat6_filter_cnt; -+ global_object[instance_id].group_id = 6; -+ break; -+ case STATCOL_DSP2_CFG: -+ cur_base_address = stat_coll6_base_address; -+ cur_event_mux_req = 14; -+ cur_event_mux_resp = 15; -+ gStatColState.stat6_filter_cnt = gStatColState.stat6_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat6_filter_cnt; -+ global_object[instance_id].group_id = 6; -+ break; -+ case STATCOL_GMAC_SW: -+ cur_base_address = stat_coll7_base_address; -+ cur_event_mux_req = 0; -+ cur_event_mux_resp = 1; -+ gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat7_filter_cnt; -+ global_object[instance_id].group_id = 7; -+ break; -+ case STATCOL_PRUSS1_P1: -+ cur_base_address = stat_coll7_base_address; -+ cur_event_mux_req = 2; -+ cur_event_mux_resp = 3; -+ gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat7_filter_cnt; -+ global_object[instance_id].group_id = 7; -+ break; -+ case STATCOL_PRUSS1_P2: -+ cur_base_address = stat_coll7_base_address; -+ cur_event_mux_req = 4; -+ cur_event_mux_resp = 5; -+ gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat7_filter_cnt; -+ global_object[instance_id].group_id = 7; -+ break; -+ case STATCOL_PRUSS2_P1: -+ cur_base_address = stat_coll7_base_address; -+ cur_event_mux_req = 6; -+ cur_event_mux_resp = 7; -+ gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat7_filter_cnt; -+ global_object[instance_id].group_id = 7; -+ break; -+ case STATCOL_PRUSS2_P2: -+ cur_base_address = stat_coll7_base_address; -+ cur_event_mux_req = 8; -+ cur_event_mux_resp = 9; -+ gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat7_filter_cnt; -+ global_object[instance_id].group_id = 7; -+ break; -+ case STATCOL_DMA_CRYPTO_RD: -+ cur_base_address = stat_coll7_base_address; -+ cur_event_mux_req = 10; -+ cur_event_mux_resp = 11; -+ gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat7_filter_cnt; -+ global_object[instance_id].group_id = 7; -+ break; -+ case STATCOL_DMA_CRYPTO_WR: -+ cur_base_address = stat_coll7_base_address; -+ cur_event_mux_req = 12; -+ cur_event_mux_resp = 13; -+ gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat7_filter_cnt; -+ global_object[instance_id].group_id = 7; -+ break; -+ case STATCOL_MPU2: -+ cur_base_address = stat_coll7_base_address; -+ cur_event_mux_req = 14; -+ cur_event_mux_resp = 15; -+ gStatColState.stat7_filter_cnt = gStatColState.stat7_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat7_filter_cnt; -+ global_object[instance_id].group_id = 7; -+ break; -+ case STATCOL_MMC1: -+ cur_base_address = stat_coll8_base_address; -+ cur_event_mux_req = 0; -+ cur_event_mux_resp = 1; -+ gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat8_filter_cnt; -+ global_object[instance_id].group_id = 8; -+ break; -+ case STATCOL_MMC2: -+ cur_base_address = stat_coll8_base_address; -+ cur_event_mux_req = 2; -+ cur_event_mux_resp = 3; -+ gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat8_filter_cnt; -+ global_object[instance_id].group_id = 8; -+ break; -+ case STATCOL_SATA: -+ cur_base_address = stat_coll8_base_address; -+ cur_event_mux_req = 4; -+ cur_event_mux_resp = 5; -+ gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat8_filter_cnt; -+ global_object[instance_id].group_id = 8; -+ break; -+ case STATCOL_MLBSS: -+ cur_base_address = stat_coll8_base_address; -+ cur_event_mux_req = 6; -+ cur_event_mux_resp = 7; -+ gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat8_filter_cnt; -+ global_object[instance_id].group_id = 8; -+ break; -+ case STATCOL_BB2D_P2: -+ cur_base_address = stat_coll8_base_address; -+ cur_event_mux_req = 8; -+ cur_event_mux_resp = 9; -+ gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat8_filter_cnt; -+ global_object[instance_id].group_id = 8; -+ break; -+ case STATCOL_IEEE1500: -+ cur_base_address = stat_coll8_base_address; -+ cur_event_mux_req = 10; -+ cur_event_mux_resp = 11; -+ gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat8_filter_cnt; -+ global_object[instance_id].group_id = 8; -+ break; -+ case STATCOL_DBG: -+ cur_base_address = stat_coll8_base_address; -+ cur_event_mux_req = 12; -+ cur_event_mux_resp = 13; -+ gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat8_filter_cnt; -+ global_object[instance_id].group_id = 8; -+ break; -+ case STATCOL_VCP1: -+ cur_base_address = stat_coll8_base_address; -+ cur_event_mux_req = 14; -+ cur_event_mux_resp = 15; -+ gStatColState.stat8_filter_cnt = gStatColState.stat8_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat8_filter_cnt; -+ global_object[instance_id].group_id = 8; -+ break; -+ case STATCOL_OCMC_RAM1: -+ cur_base_address = stat_coll9_base_address; -+ cur_event_mux_req = 0; -+ cur_event_mux_resp = 1; -+ gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat9_filter_cnt; -+ global_object[instance_id].group_id = 9; -+ break; -+ case STATCOL_OCMC_RAM2: -+ cur_base_address = stat_coll9_base_address; -+ cur_event_mux_req = 2; -+ cur_event_mux_resp = 3; -+ gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat9_filter_cnt; -+ global_object[instance_id].group_id = 9; -+ break; -+ case STATCOL_OCMC_RAM3: -+ cur_base_address = stat_coll9_base_address; -+ cur_event_mux_req = 4; -+ cur_event_mux_resp = 5; -+ gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat9_filter_cnt; -+ global_object[instance_id].group_id = 9; -+ break; -+ case STATCOL_GPMC: -+ cur_base_address = stat_coll9_base_address; -+ cur_event_mux_req = 6; -+ cur_event_mux_resp = 7; -+ gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat9_filter_cnt; -+ global_object[instance_id].group_id = 9; -+ break; -+ case STATCOL_MCASP1: -+ cur_base_address = stat_coll9_base_address; -+ cur_event_mux_req = 8; -+ cur_event_mux_resp = 9; -+ gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat9_filter_cnt; -+ global_object[instance_id].group_id = 9; -+ break; -+ case STATCOL_MCASP2: -+ cur_base_address = stat_coll9_base_address; -+ cur_event_mux_req = 10; -+ cur_event_mux_resp = 11; -+ gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat9_filter_cnt; -+ global_object[instance_id].group_id = 9; -+ break; -+ case STATCOL_MCASP3: -+ cur_base_address = stat_coll9_base_address; -+ cur_event_mux_req = 12; -+ cur_event_mux_resp = 13; -+ gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat9_filter_cnt; -+ global_object[instance_id].group_id = 9; -+ break; -+ case STATCOL_VCP2: -+ cur_base_address = stat_coll9_base_address; -+ cur_event_mux_req = 14; -+ cur_event_mux_resp = 15; -+ gStatColState.stat9_filter_cnt = gStatColState.stat9_filter_cnt + 1; -+ cur_stat_filter_cnt = gStatColState.stat9_filter_cnt; -+ global_object[instance_id].group_id = 9; -+ break; -+ default: -+ printf("ERROR: Unknown initiator %d\n", instance_id); -+ exit(0); -+ }; -+ -+ { -+ if ( cur_stat_filter_cnt > 4 ) -+ { -+ printf("WARNING: We have exhausted filters/counters.....\n"); -+ return 0; -+ } -+ // Global Enable Stat Collector -+ wr_stat_reg(cur_base_address+0x8,0x1); -+ -+ // Soft Enable Stat Collector -+ wr_stat_reg(cur_base_address+0xC,0x1); -+ -+ wr_stat_reg(cur_base_address+0x18,0x5); -+ // Operation of Stat Collector / RespEvt => Packet -+ wr_stat_reg(cur_base_address+0x1C,0x5); -+ -+ -+ // Event Sel -+ wr_stat_reg(cur_base_address+0x20+4*(cur_stat_filter_cnt-1),cur_event_mux_req); -+ -+ // Op is EventInfo -+ wr_stat_reg(cur_base_address+0x1FC+(0x158*(cur_stat_filter_cnt-1)),2); -+ -+ // Event Info Sel Op -> packet length -+ wr_stat_reg(cur_base_address+0x1F8+(0x158*(cur_stat_filter_cnt-1)),0); -+ -+ // Filter Global Enable -+ wr_stat_reg(cur_base_address+0xAC+(0x158*(cur_stat_filter_cnt-1)),0x1); -+ -+ // Filter Enable -+ wr_stat_reg(cur_base_address+0xBC+(0x158*(cur_stat_filter_cnt-1)),0x1); -+ -+ // Manual dump -+ wr_stat_reg(cur_base_address+0x54,0x1); -+ // use send register to reset counters -+ -+ } -+ -+ global_object[instance_id].mux_req = cur_event_mux_req; -+ global_object[instance_id].base_address = cur_base_address; -+ global_object[instance_id].counter_id = cur_stat_filter_cnt; -+ global_object[instance_id].b_enabled = 1; -+ -+ return cur_stat_filter_cnt; -+} -+ -+ -+ -+void statCollectorReadGroup(UInt32 group_id) -+{ -+ int i=0; -+ UInt32 cur_base_address = 0x45001000 + ((group_id - 1) * 0x1000); -+ -+ wr_stat_reg(cur_base_address+0xC,0x0); -+ -+ for(i=0; i < STATCOL_MAX; i++) -+ { -+ if(global_object[i].group_id == (group_id - 1) && -+ global_object[i].b_enabled == 1) -+ { -+ UInt32 cur_stat_filter_cnt = global_object[i].counter_id; -+ -+ global_object[i].readings[statCountIdx] = rd_stat_reg(cur_base_address+0x8C+((cur_stat_filter_cnt-1)*4)); -+ } -+ } -+ -+ wr_stat_reg(cur_base_address+0xC,0x1); -+} -+ -+ -+volatile sig_atomic_t sigtermed = 0; -+ -+void my_signal_handler(int signum) -+{ -+ if (signum == SIGTERM || signum == SIGINT) { -+ sigtermed = 1; -+ } -+} -+ -+struct sort -+{ -+ int pos; -+ double value; -+}; -+ -+ -+void *ctx; -+struct time_graph_create_params p; -+char xpos_string[100], ypos_string[100]; -+ -+void mpu_handler(int command) -+{ -+#if 1 -+ static int fd; -+ char buf[1000]; -+ char * tabledata= "/tmp/statcollfifo"; -+ int i; -+ int bytes; -+ static int offset = 13; -+ -+ switch(command) -+ { -+ case OPEN: -+ fd = open(tabledata, O_RDONLY|O_NONBLOCK); -+ break; -+ -+ case READ: -+ -+ /* open, read, and display the message from the FIFO */ -+ bytes=read(fd, buf, 1000); -+ if(bytes > 0) -+ { -+ char str[100]; -+ char value[100]; -+ sscanf(buf, "%s %s", str, value); -+ if(strcmp(str, "MOVE:") == 0) -+ { -+ printf("Received MOVE command : %s\n", buf); -+ sprintf(p.title, "CPU Usage[@position-req=%sx%s]", value, ypos_string); -+ move_graph(ctx, &p); -+ } -+ else -+ { -+ printf("ERROR: Received unexpected data from FIFO - \" %s \" \n", buf); -+ } -+ memset(buf, 0x0, sizeof(buf)); -+ } -+ -+ break; -+ -+ case CLOSE: -+ close(fd); -+ break; -+ } -+#endif -+ return; -+} -+ -+ -+UInt32 statcoll_start(UInt32 TOTAL_TIME, UInt32 INTERVAL_US, char list[][50], UInt32 xpos, UInt32 ypos) -+{ -+ int i, fd, index; -+ UInt32 counterIdDss, counterIdIva, counterIdBB2dP1, counterIdBB2dP2, counterIdUsb4, counterIdSata, counterIdEmif1, counterIdEmif2; -+ -+ if (SIG_ERR == signal(SIGPIPE,SIG_IGN)) -+ exit(1); -+ -+ if (SIG_ERR == signal(SIGINT,my_signal_handler)) -+ exit(1); -+ -+ if (SIG_ERR == signal(SIGTERM,my_signal_handler)) -+ exit(1); -+ -+ -+ struct timeval tv1, tv2; -+ gettimeofday(&tv1, NULL); -+ printf("------------------------------------------------\n"); -+ printf("Compile time = %s %s\n",__DATE__, __TIME__); -+ printf("------------------------------------------------\n\n"); -+ //printd("Start time = %d\n", time(NULL)); -+ //printd("Time seconds = %d, usecs = %d\n", tv.tv_sec, tv.tv_usec); -+ -+ statcoll_params params; -+ memset(¶ms, sizeof(params), 0); -+ params.INTERVAL_US = INTERVAL_US; -+ params.TOTAL_TIME = TOTAL_TIME; -+ -+ i=0; -+ index=0; -+ -+ while(list[i][0] != 0) -+ { -+ for(index=0; index< STATCOL_MAX; index++) { -+ if(strcmp(list[i], initiators[index].name) == 0) -+ { -+ strcpy(params.user_config_list[params.no_of_initiators].name, list[i]); -+ params.user_config_list[params.no_of_initiators++].id = initiators[index].id; -+ break; -+ } -+ } -+ -+ if(index == STATCOL_MAX) { -+ printf("ERROR: Unknown initiator.%d.. .%s. \n", i, list[i]); -+ //exit(0); -+ } -+ i++; -+ } -+ -+ struct bar_graph_create_params bg_p; -+ struct _y_config *y_cfg; -+ struct _text_config *t_cfg; -+ double *y; -+ double *bg_y; -+ char *text_list[STATCOL_MAX]; -+ -+ struct _bar_graph_y_config *bg_y_cfg; -+ struct _text_config *bg_t_cfg; -+ char *bg_text_list[STATCOL_MAX]; -+ -+ sprintf(xpos_string, "%d", xpos); -+ sprintf(ypos_string, "%d", ypos); -+ p.title=(char *)malloc(100); -+ sprintf(p.title, "CPU Usage[@position-req=%sx%s]", xpos_string, ypos_string); -+ //p.height = MAX_HEIGHT - HEIGHT_EMIF_AREA; -+ p.height = MAX_HEIGHT;// - HEIGHT_EMIF_AREA; -+ p.width = MAX_WIDTH; -+ p.draw_area.bottom_left.x = TIME_GRAPH_AREA_BL_X; -+ p.draw_area.bottom_left.y = TIME_GRAPH_AREA_BL_Y; -+ p.draw_area.top_right.x = TIME_GRAPH_AREA_TR_X; -+ p.draw_area.top_right.y = TIME_GRAPH_AREA_TR_Y; -+ p.time_span = 120000; // 120 seconds -+ p.num_of_y_items = params.no_of_initiators+1; -+ p.num_of_text_items = 0;//params.no_of_initiators; -+ -+ -+ y_cfg = malloc((params.no_of_initiators+1) * sizeof(struct _y_config)); -+ t_cfg = malloc(params.no_of_initiators * sizeof(struct _text_config)); -+ y = malloc((params.no_of_initiators+1) * sizeof(double)); -+ p.y_config_array = y_cfg; -+ p.text_config_array = t_cfg; -+ -+ bg_y_cfg = malloc(TOTAL_Y_PARAMETERS * sizeof(struct _bar_graph_y_config)); -+ bg_t_cfg = malloc(TOTAL_Y_PARAMETERS * sizeof(struct _text_config)); -+ bg_y = malloc(TOTAL_Y_PARAMETERS * sizeof(double)); -+ -+ for(i=0; i<TOTAL_Y_PARAMETERS; i++) -+ { -+ bg_text_list[i] = malloc(100); -+ strcpy(bg_text_list[i],"test"); -+ } -+ -+ create_overall_box(bg_y_cfg, bg_t_cfg, bg_text_list); -+ -+ -+ i=0; -+ while(i < params.no_of_initiators) -+ { -+ text_list[i] = malloc(100 * sizeof(char)); -+ memset(text_list[i], 0x0, 100); -+ -+ ((struct _y_config *)y_cfg+i)->line_color.r = pallette[i%MAX_COLORS].r; -+ ((struct _y_config *)y_cfg+i)->line_color.g = pallette[i%MAX_COLORS].g; -+ ((struct _y_config *)y_cfg+i)->line_color.b = pallette[i%MAX_COLORS].b; -+ ((struct _y_config *)y_cfg+i)->line_color.a = 0.0;//pallette[i%MAX_COLORS].a; -+ -+ ((struct _y_config *)y_cfg+i)->fill_color.r = 0.0; -+ ((struct _y_config *)y_cfg+i)->fill_color.g = 1.0; -+ ((struct _y_config *)y_cfg+i)->fill_color.b = 0.0; -+ ((struct _y_config *)y_cfg+i)->fill_color.a = 0.5; -+ -+ i++; -+ } -+ -+ ((struct _y_config *)y_cfg+i)->line_color.r = 0.0; -+ ((struct _y_config *)y_cfg+i)->line_color.g = 0.0; -+ ((struct _y_config *)y_cfg+i)->line_color.b = 0.0; -+ ((struct _y_config *)y_cfg+i)->line_color.a = 0.5; -+ ((struct _y_config *)y_cfg+i)->fill_color.r = 0.1; -+ ((struct _y_config *)y_cfg+i)->fill_color.g = 0.9; -+ ((struct _y_config *)y_cfg+i)->fill_color.b = 0.5; -+ ((struct _y_config *)y_cfg+i)->fill_color.a = 1.0; -+ -+ bg_p.title = "CPU Usage"; -+ -+ bg_p.num_of_y_items = TOTAL_Y_PARAMETERS; -+ bg_p.y_config_array = bg_y_cfg; -+ bg_p.num_of_text_items = TOTAL_Y_PARAMETERS; -+ bg_p.text_config_array = bg_t_cfg; -+ -+ -+ int argc; -+ char *argv[10]; -+ ctx = time_graph_create(argc, argv, &p); -+ if (!ctx) { -+ printf("Error creating context\n"); -+ exit(0); -+ } -+ -+ printf("\n Context after time_graph_create = 0x%x\n", ctx); -+ ctx = bar_graph_create(argc, argv, &bg_p); -+ if (!ctx) { -+ printf("Error creating context\n"); -+ exit(0); -+ } -+ -+ printf("\n Context after bar_graph_create= 0x%x\n", ctx); -+ -+ printf("Total configured initiators = %d\n", params.no_of_initiators); -+ -+ -+ fd = open("/dev/mem", O_RDWR); -+ if (fd == -1){ -+ printf("error fd=open() \n"); -+ return -1; -+ } -+ statcoll_base_mem = mmap(NULL, STATCOLL_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, STATCOLL_BASE); -+ -+ if (statcoll_base_mem == MAP_FAILED){ -+ printf("ERROR: mmap failed \n"); -+ return; -+ } -+ close(fd); -+ -+ fd = open("/dev/mem", O_RDWR); -+ if (fd == -1){ -+ printf("error fd=open() \n"); -+ return -1; -+ } -+ l3_3_clkctrl = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, CM_L3INSTR_REGISTER_BASE); -+ if (l3_3_clkctrl == MAP_FAILED){ -+ printf("ERROR: mmap failed for CM_L3INSTR_REGISTER_BASE\n"); -+ return; -+ } -+ close(fd); -+ -+ printf("SUCCESS: Mapped 0x%x to user space address 0x%x\n", STATCOLL_BASE, statcoll_base_mem); -+ printf("INTERVAL = %d usecs\n", INTERVAL_US); -+ printf("TOTAL TIME = %d seconds\n", TOTAL_TIME); -+ TRACE_SZ = (TOTAL_TIME * 1000000)/INTERVAL_US; -+ printf("TRACE SIZE = %d samples\n", TRACE_SZ); -+ -+ printf("**************************************\n"); -+ printf("Going to initialize the L3 clocks \n"); -+ l3_3_clkctrl[CM_L3INSTR_L3INSTR_CLKSTCTRL_OFFSET >> 2] = 0x2; -+ l3_3_clkctrl[CM_L3INSTR_L3_MAIN_2_CLKCTRL_OFFSET >> 2] = 0x1; -+ printf("**************************************\n"); -+ -+ while( (l3_3_clkctrl[CM_L3INSTR_L3_MAIN_2_CLKCTRL_OFFSET >> 2] & 0x30000) != 0x0) -+ { -+ printf("Waiting on module to be functional\n"); -+ } -+ -+ statCollectorInit(); -+ -+ printf("SUCCESS: Initialized STAT COLLECTOR\n"); -+ /* Initialize all enabled initiators */ -+ for(index =0; index < params.no_of_initiators; index++) { -+ printf("\t\t Initialized %s\n", params.user_config_list[index].name); -+ statCollectorControlInitialize(params.user_config_list[index].id); -+ } -+ -+ const char *bg_text = "CPU Utilization"; -+ -+ int second_counter=0; -+ memset(y, 0x0, sizeof(double)* (params.no_of_initiators+1)); -+ -+ -+ -+ -+ mpu_handler(OPEN); -+ -+ -+ while(statCountIdx != (TRACE_SZ - 1)) -+ { -+ usleep(INTERVAL_US); -+ int group; -+ for(group = 1; group<11; group++) -+ statCollectorReadGroup(group); -+ -+ mpu_handler(READ); -+ -+ if(statCountIdx != 0 ) -+ for(i=0; i<params.no_of_initiators; i++) { -+ y[i] += (double)(global_object[params.user_config_list[i].id].readings[statCountIdx])/ (8000000000); -+ } -+ second_counter++; -+ -+ if(second_counter % 30 == 0) -+ { -+ -+ for(i=0; i<TOTAL_Y_PARAMETERS; i++) { -+ bg_y[i] = 1.0; -+ } -+ -+ //HACK -+ bg_y[9]=y[0]*2; -+ bg_y[11]=y[1]*2; -+ sprintf(bg_text_list[8], "%02.1f%s", y[0]*100, "%"); -+ sprintf(bg_text_list[10], "%02.1f%s", y[1]*100, "%"); -+ -+ struct sort sort_array[STATCOL_MAX]; -+ memset(sort_array, 0x0, sizeof(struct sort) * STATCOL_MAX); -+ /* Sort here */ -+ for(i=2; i<params.no_of_initiators; i++) { -+ sort_array[i-2].value = y[i]; -+ sort_array[i-2].pos = i; -+ } -+ -+ int j; -+ double tempdouble; -+ int tempint; -+ for(i=0; i<params.no_of_initiators-2; i++) { -+ for(j=i+1; j<params.no_of_initiators-2; j++) { -+ if(sort_array[i].value < sort_array[j].value) { -+ tempdouble = sort_array[j].value; -+ tempint = sort_array[j].pos; -+ -+ sort_array[j].value = sort_array[i].value; -+ sort_array[j].pos = sort_array[i].pos; -+ -+ sort_array[i].value = tempdouble; -+ sort_array[i].pos = tempint; -+ } -+ } -+ } -+ -+ for(i=0; i<6; i++) -+ { -+ //HACK -+ bg_y[14+i*2] = sort_array[i].value*2; -+ sprintf(bg_text_list[13+i*2], "%02.1f%s", sort_array[i].value*100, "%"); -+ sprintf(bg_text_list[14+i*2], "%s", (params.user_config_list[sort_array[i].pos].name)+8); -+ } -+ -+ bar_graph_plot(ctx, bg_y, (const char **)bg_text_list); -+ -+ y[params.no_of_initiators]=y[0]+y[1]; -+ time_graph_plot(ctx, y, (const char **)text_list); -+ //printf("Plotting the time_graph\n"); -+ memset(y, 0x0, sizeof(double)* (params.no_of_initiators+1)); -+ } -+ statCountIdx++; -+ -+ } -+ -+ mpu_handler(CLOSE); -+ -+ printf("------------------------------------------------\n\n"); -+ printf("SUCCESS: Stat collection completed... Writing into file now\n"); -+ FILE *outfile = fopen("statcollector.csv", "w+"); -+ if (!outfile) { -+ printf("\n ERROR: Error opening file"); -+ } -+ -+ /* Ignore the first index at 0 */ -+ for(index=1; index<statCountIdx; index++) { -+ for(i=0; i<params.no_of_initiators; i++) { -+ fprintf(outfile,"%s = %d,", params.user_config_list[i].name, global_object[params.user_config_list[i].id].readings[index]); -+ } -+ fprintf(outfile,"\n"); -+ } -+ fclose(outfile); -+ -+ time_graph_destroy(ctx); -+ gettimeofday(&tv2, NULL); -+ //printf("End time = %d\n", time(NULL)); -+ //printf("Time seconds = %d, usecs = %d\n", tv.tv_sec, tv.tv_usec); -+ printf("Total execution time = %d secs, %d usecs\n\n", (tv2.tv_sec - tv1.tv_sec), (tv2.tv_usec - tv2.tv_usec)); -+ -+ return 0; -+} -+ -+ -diff --git a/clients/statcoll.h b/clients/statcoll.h -new file mode 100644 -index 0000000..fa92753 ---- /dev/null -+++ b/clients/statcoll.h -@@ -0,0 +1,152 @@ -+#ifndef __STATCOLL_H -+#define __STATCOLL_H -+ -+ -+#define CM_L3INSTR_REGISTER_BASE (0x4A008000) -+ -+#define CM_L3INSTR_L3INSTR_CLKSTCTRL_OFFSET (0xE00) -+#define CM_L3INSTR_L3_MAIN_2_CLKCTRL_OFFSET (0xE20) -+ -+#define STATCOLL_SIZE 40960 -+#define STATCOLL_BASE (0x45001000) -+ -+#define stat_coll0_base_address (0x45001000) -+#define stat_coll1_base_address (0x45002000) -+#define stat_coll2_base_address (0x45003000) -+#define stat_coll3_base_address (0x45004000) -+#define stat_coll4_base_address (0x45005000) -+#define stat_coll5_base_address (0x45006000) -+#define stat_coll6_base_address (0x45007000) -+#define stat_coll7_base_address (0x45008000) -+#define stat_coll8_base_address (0x45009000) -+#define stat_coll9_base_address (0x4500a000) -+ -+#define printd(fmt, ...) \ -+ do { if (debug) fprintf(stderr, fmt, __VA_ARGS__); } while (0) -+ -+typedef unsigned int UInt32; -+ -+ -+typedef enum -+{ -+ STATCOL_EMIF1_SYS, -+ STATCOL_EMIF2_SYS, -+ STATCOL_MA_MPU_P1, -+ STATCOL_MA_MPU_P2, -+ STATCOL_MPU1, -+ STATCOL_MMU1, -+ STATCOL_TPTC_RD1, -+ STATCOL_TPTC_WR1, -+ STATCOL_TPTC_RD2, -+ STATCOL_TPTC_WR2, -+ STATCOL_VIP1_P1, -+ STATCOL_VIP1_P2, -+ STATCOL_VIP2_P1, -+ STATCOL_VIP2_P2, -+ STATCOL_VIP3_P1, -+ STATCOL_VIP3_P2, -+ STATCOL_VPE_P1, -+ STATCOL_VPE_P2, -+ STATCOL_EVE1_TC0, -+ STATCOL_EVE1_TC1, -+ STATCOL_EVE2_TC0, -+ STATCOL_EVE2_TC1, -+ STATCOL_EVE3_TC0, -+ STATCOL_EVE3_TC1, -+ STATCOL_EVE4_TC0, -+ STATCOL_EVE4_TC1, -+ STATCOL_DSP1_MDMA, -+ STATCOL_DSP1_EDMA, -+ STATCOL_DSP2_MDMA, -+ STATCOL_DSP2_EDMA, -+ STATCOL_IVA, -+ STATCOL_GPU_P1, -+ STATCOL_GPU_P2, -+ STATCOL_BB2D_P1, -+ STATCOL_DSS, -+ STATCOL_CSI2_2, -+ STATCOL_MMU2, -+ STATCOL_IPU1, -+ STATCOL_IPU2, -+ STATCOL_DMA_SYSTEM_RD, -+ STATCOL_DMA_SYSTEM_WR, -+ STATCOL_CSI2_1, -+ STATCOL_USB3_SS, -+ STATCOL_USB2_SS, -+ STATCOL_USB2_ULPI_SS1, -+ STATCOL_USB2_ULPI_SS2, -+ STATCOL_PCIE_SS1, -+ STATCOL_PCIE_SS2, -+ STATCOL_DSP1_CFG, -+ STATCOL_DSP2_CFG, -+ STATCOL_GMAC_SW, -+ STATCOL_PRUSS1_P1, -+ STATCOL_PRUSS1_P2, -+ STATCOL_PRUSS2_P1, -+ STATCOL_PRUSS2_P2, -+ STATCOL_DMA_CRYPTO_RD, -+ STATCOL_DMA_CRYPTO_WR, -+ STATCOL_MPU2, -+ STATCOL_MMC1, -+ STATCOL_MMC2, -+ STATCOL_SATA, -+ STATCOL_MLBSS, -+ STATCOL_BB2D_P2, -+ STATCOL_IEEE1500, -+ STATCOL_DBG, -+ STATCOL_VCP1, -+ STATCOL_OCMC_RAM1, -+ STATCOL_OCMC_RAM2, -+ STATCOL_OCMC_RAM3, -+ STATCOL_GPMC, -+ STATCOL_MCASP1, -+ STATCOL_MCASP2, -+ STATCOL_MCASP3, -+ STATCOL_VCP2, -+ STATCOL_MAX -+} STATCOL_ID; -+ -+ -+ -+typedef struct -+{ -+ UInt32 stat0_filter_cnt; -+ UInt32 stat1_filter_cnt; -+ UInt32 stat2_filter_cnt; -+ UInt32 stat3_filter_cnt; -+ UInt32 stat4_filter_cnt; -+ UInt32 stat5_filter_cnt; -+ UInt32 stat6_filter_cnt; -+ UInt32 stat7_filter_cnt; -+ UInt32 stat8_filter_cnt; -+ UInt32 stat9_filter_cnt; -+} StatCollectorObj; -+ -+struct list_of_initiators -+{ -+ STATCOL_ID id; -+ char name[50]; -+}; -+ -+typedef struct -+{ -+ UInt32 INTERVAL_US; -+ UInt32 TOTAL_TIME; -+ UInt32 no_of_initiators; -+ struct list_of_initiators user_config_list[STATCOL_MAX]; -+} statcoll_params; -+ -+typedef struct -+{ -+ UInt32 b_enabled; -+ char name[100]; -+ UInt32 *readings; -+ UInt32 *timestamp; -+ UInt32 group_id; -+ UInt32 counter_id; -+ UInt32 base_address; -+ UInt32 mux_req; -+}statcoll_initiators_object; -+ -+ -+#endif -diff --git a/clients/statcoll_gui.h b/clients/statcoll_gui.h -new file mode 100644 -index 0000000..7362bde ---- /dev/null -+++ b/clients/statcoll_gui.h -@@ -0,0 +1,101 @@ -+ -+/* -+ -+ --------------------------------------------- -+ | | -+ | --------------------------------------- | -+ | | -+ | | -+ | | -+ | | -+ | | -+ | | -+ | | -+ | | -+ | | -+ | | -+ | | -+ | | -+ | | -+ | | -+ | | -+ --------------------------------------------- -+ | | | -+ | | | -+ | | | -+ | | | -+ | | | -+ | | | -+ --------------------------------------------- -+ -+ -+ -+ -+*/ -+#define POSITION_X 2800 -+#define POSITION_Y 40 -+ -+#define MAX_WIDTH 900 -+//#define MAX_WIDTH 528 -+#define MAX_HEIGHT 900 -+ -+/* Derived parameters */ -+#define BAR_GAP (MAX_WIDTH/25) -+#define BAR_WIDTH (MAX_WIDTH/16) -+ -+#define BAR_HEIGHT ((MX_HEIGHT/40) * 6) -+ -+#define BORDER (MAX_WIDTH/15) -+ -+#define HEIGHT_EMIF_AREA (MAX_HEIGHT/4) -+ -+#define FONT_SIZE (MAX_WIDTH/40) -+ -+#define WIDTH_EMIF_AREA (MAX_WIDTH / 4) -+ -+#define TOTAL_Y_PARAMETERS (25) -+ -+#define TIME_GRAPH_AREA_BL_X (BORDER) -+#define TIME_GRAPH_AREA_BL_Y (MAX_HEIGHT - HEIGHT_EMIF_AREA - BORDER) -+#define TIME_GRAPH_AREA_TR_X (MAX_WIDTH - BORDER) -+#define TIME_GRAPH_AREA_TR_Y (BORDER) -+ -+#define EMIF_AREA_BL_X (0) -+#define EMIF_AREA_BL_Y (MAX_HEIGHT) -+#define EMIF_AREA_TR_X (WIDTH_EMIF_AREA) -+#define EMIF_AREA_TR_Y (MAX_HEIGHT - HEIGHT_EMIF_AREA) -+ -+#define INITIATORS_AREA_BL_X (WIDTH_EMIF_AREA) -+#define INITIATORS_AREA_BL_Y (MAX_HEIGHT) -+#define INITIATORS_AREA_TR_X (MAX_WIDTH) -+#define INITIATORS_AREA_TR_Y (MAX_HEIGHT - HEIGHT_EMIF_AREA) -+ -+ -+const char *string_list[TOTAL_Y_PARAMETERS] = { -+ "----DDR BANDWIDTH PLOT----", -+ "8 GBPS", -+ "6.4 ", -+ "4.8", -+ "3.2", -+ "1.6", -+ "0", -+ "EMIF Plot", -+ "test", -+ "EMIF1", -+ "test", -+ "EMIF2", -+ "TOP 6 INITIATORS", -+ "test", -+ "MPU", -+ "test", -+ "DSS", -+ "test", -+ "DSP", -+ "test", -+ "IVA", -+ "test", -+ "GPU", -+ "test", -+ "BB2D", -+}; -+ -diff --git a/clients/time_bar_graph.c b/clients/time_bar_graph.c -new file mode 100644 -index 0000000..9fa9c12 ---- /dev/null -+++ b/clients/time_bar_graph.c -@@ -0,0 +1,515 @@ -+/* -+ * Copyright © 2008 Kristian Høgsberg -+ * -+ * Permission to use, copy, modify, distribute, and sell this software and its -+ * documentation for any purpose is hereby granted without fee, provided that -+ * the above copyright notice appear in all copies and that both that copyright -+ * notice and this permission notice appear in supporting documentation, and -+ * that the name of the copyright holders not be used in advertising or -+ * publicity pertaining to distribution of the software without specific, -+ * written prior permission. The copyright holders make no representations -+ * about the suitability of this software for any purpose. It is provided "as -+ * is" without express or implied warranty. -+ * -+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO -+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR -+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE -+ * OF THIS SOFTWARE. -+ */ -+ -+#include <stdint.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <stdint.h> -+#include <signal.h> -+#include <time.h> -+#include <math.h> -+#include <cairo.h> -+#include <sys/time.h> -+#include <pthread.h> -+#include <errno.h> -+#include <unistd.h> -+#include <sys/eventfd.h> -+#include <sys/epoll.h> -+ -+#include <linux/input.h> -+#include <wayland-client.h> -+#include "window.h" -+#include "../shared/cairo-util.h" -+#include "time_bar_graph.h" -+ -+//#define DEBUG 1 -+#ifdef DEBUG -+#define DBG(x...) printf(x) -+#else -+#define DBG(x...) // printf(x) -+#endif -+ -+#define MAX_ITEMS 180 -+#define MAX_TEXT_SIZE 128 -+ -+struct graph_dataset_point { -+ int next_index; -+ double y_values[MAX_ITEMS]; -+}; -+ -+struct graph_data { -+ int dataset_size; -+ int first_index, last_index, num_elems; -+ uint64_t last_time; -+ struct graph_dataset_point dataset[1]; -+}; -+ -+struct graph { -+ struct display *display; -+ struct window *window; -+ struct widget *widget; -+ int width, height; -+ struct time_graph_create_params params; -+ struct bar_graph_create_params bar_graph_params; -+ struct _y_config y_config_array[MAX_ITEMS]; -+ struct _text_config text_config_array[MAX_ITEMS]; -+ -+ /* Bar graph parameters */ -+ struct _bar_graph_y_config bar_graph_y_config_array[MAX_ITEMS]; -+ struct _text_config bar_graph_text_config_array[MAX_ITEMS]; -+ -+ pthread_t thr; -+ int eventfd; -+ struct task task; -+ double x_scaling_factor; -+ pthread_mutex_t mtx; -+ double time_graph_y_values[MAX_ITEMS]; -+ char text_values[MAX_ITEMS][MAX_TEXT_SIZE]; -+ -+ double bar_graph_y_values[MAX_ITEMS]; -+ char bar_graph_text_values[MAX_ITEMS][MAX_TEXT_SIZE]; -+ -+ uint64_t time_now; -+ time_t start_time_tv_sec; -+ struct graph_data *data; -+}; -+ -+struct graph *global_graph=NULL; -+static void -+draw_stuff(struct graph *g, cairo_surface_t *surface) -+{ -+ cairo_t *cr; -+ int i, j, n_elems; -+ double c_x, c_y, d_x, d_y; -+ -+ cr = cairo_create(surface); -+ cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); -+ cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.5); -+ cairo_paint(cr); -+ cairo_select_font_face(cr, "mono", -+ CAIRO_FONT_SLANT_NORMAL, -+ CAIRO_FONT_WEIGHT_BOLD); -+ cairo_set_line_width (cr, 1.0); -+ cairo_set_operator(cr, CAIRO_OPERATOR_OVER); -+ pthread_mutex_lock(&g->mtx); -+ for (j=0; g->data->num_elems > 0 && j<g->params.num_of_y_items; j++) { -+ n_elems = g->data->num_elems; -+ DBG("first_index: %d, last_index: %d\n", g->data->first_index, g->data->last_index); -+ if (g->y_config_array[j].fill_color.a != 0.0) -+ cairo_move_to(cr, (double)g->params.draw_area.bottom_left.x, (double)g->params.draw_area.bottom_left.y); -+ c_x = (double)g->params.draw_area.bottom_left.x; -+ c_y = (double)g->params.draw_area.bottom_left.y; -+ d_x = 0; -+ i = g->data->first_index; -+ while (n_elems) { -+ DBG("index: %d, x: %f, y: %f, next_index: %d\n", i, c_x, -+ g->data->dataset[i].y_values[j], g->data->dataset[i].next_index); -+ d_y = g->data->dataset[i].y_values[j] - c_y; -+ c_y = g->data->dataset[i].y_values[j]; -+ c_x = c_x + d_x; -+ if (g->y_config_array[j].fill_color.a == 0.0 && n_elems == g->data->num_elems) { -+ cairo_move_to(cr, c_x, c_y); -+ } else { -+ cairo_curve_to(cr, c_x - (d_x * 0.75), c_y - (d_y * 0.92), c_x - (d_x * 0.25), c_y - (d_y * 0.08), c_x, c_y); -+ } -+ if (g->data->dataset[i].next_index > i) { -+ d_x = (g->data->dataset[i].next_index - i); -+ } else { -+ d_x = (g->data->dataset_size + g->data->dataset[i].next_index - i); -+ } -+ i = g->data->dataset[i].next_index; -+ n_elems--; -+ } -+ if (g->y_config_array[j].fill_color.a != 0.0) { -+ cairo_line_to(cr, c_x, (double)g->params.draw_area.bottom_left.y); -+ cairo_line_to(cr, (double)g->params.draw_area.bottom_left.x, (double)g->params.draw_area.bottom_left.y); -+ cairo_close_path(cr); -+ cairo_set_source_rgba(cr, g->y_config_array[j].fill_color.r, g->y_config_array[j].fill_color.g, -+ g->y_config_array[j].fill_color.b, g->y_config_array[j].fill_color.a); -+ cairo_fill_preserve(cr); -+ } -+ cairo_set_source_rgba(cr, g->y_config_array[j].line_color.r, g->y_config_array[j].line_color.g, -+ g->y_config_array[j].line_color.b, g->y_config_array[j].line_color.a); -+ cairo_stroke(cr); -+ } -+ -+ for (j=0; j<g->params.num_of_text_items; j++) { -+ cairo_move_to(cr, (double)g->text_config_array[j].at.x, (double)g->text_config_array[j].at.y); -+ cairo_set_font_size(cr, g->text_config_array[j].fontsize); -+ cairo_set_source_rgba(cr, g->text_config_array[j].color.r, g->text_config_array[j].color.g, -+ g->text_config_array[j].color.b, g->text_config_array[j].color.a); -+ cairo_show_text(cr, g->text_values[j]); -+ } -+ -+ -+ for (j=0; j<g->bar_graph_params.num_of_y_items; j++) { -+ cairo_move_to(cr, (double)g->bar_graph_params.y_config_array[j].region.bottom_left.x, -+ (double)g->bar_graph_params.y_config_array[j].region.bottom_left.y); -+ c_y = (double)g->bar_graph_params.y_config_array[j].region.bottom_left.y - -+ (g->bar_graph_y_values[j] * (double)(g->bar_graph_params.y_config_array[j].region.bottom_left.y - -+ g->bar_graph_params.y_config_array[j].region.top_right.y)); -+ cairo_line_to(cr, (double)g->bar_graph_params.y_config_array[j].region.bottom_left.x, c_y); -+ cairo_line_to(cr, (double)g->bar_graph_params.y_config_array[j].region.top_right.x, c_y); -+ cairo_line_to(cr, (double)g->bar_graph_params.y_config_array[j].region.top_right.x, -+ (double)g->bar_graph_params.y_config_array[j].region.bottom_left.y); -+ cairo_line_to(cr, (double)g->bar_graph_params.y_config_array[j].region.bottom_left.x, -+ (double)g->bar_graph_params.y_config_array[j].region.bottom_left.y); -+ cairo_close_path(cr); -+ cairo_set_source_rgba(cr, g->bar_graph_y_config_array[j].fill_color.r, g->bar_graph_y_config_array[j].fill_color.g, -+ g->bar_graph_y_config_array[j].fill_color.b, g->bar_graph_y_config_array[j].fill_color.a); -+ cairo_fill_preserve(cr); -+ cairo_set_source_rgba(cr, g->bar_graph_y_config_array[j].line_color.r, g->bar_graph_y_config_array[j].line_color.g, -+ g->bar_graph_y_config_array[j].line_color.b, g->bar_graph_y_config_array[j].line_color.a); -+ cairo_stroke(cr); -+ } -+ for (j=0; j<g->bar_graph_params.num_of_text_items; j++) { -+ cairo_move_to(cr, (double)g->bar_graph_text_config_array[j].at.x, (double)g->bar_graph_text_config_array[j].at.y); -+ cairo_set_font_size(cr, g->bar_graph_text_config_array[j].fontsize); -+ cairo_set_source_rgba(cr, g->bar_graph_text_config_array[j].color.r, g->bar_graph_text_config_array[j].color.g, -+ g->bar_graph_text_config_array[j].color.b, g->bar_graph_text_config_array[j].color.a); -+ cairo_save (cr); -+ //cairo_rotate(cr, 2*3.14*21/24); -+ cairo_show_text(cr, g->bar_graph_text_values[j]); -+ cairo_restore(cr); -+ } -+ pthread_mutex_unlock(&g->mtx); -+ cairo_destroy(cr); -+} -+ -+static void -+resize_handler(struct widget *widget, -+ int32_t width, int32_t height, void *data) -+{ -+ struct graph *g = data; -+ -+ /* Dont resize me */ -+ widget_set_size(g->widget, g->width, g->height); -+} -+ -+static void -+redraw_handler(struct widget *widget, void *data) -+{ -+ struct graph *g = data; -+ cairo_surface_t *surface; -+ -+ surface = window_get_surface(g->window); -+ if (surface == NULL || -+ cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS) { -+ fprintf(stderr, "failed to create cairo egl surface\n"); -+ return; -+ } -+ -+ draw_stuff(g, surface); -+ cairo_surface_destroy(surface); -+} -+ -+static void -+button_handler(struct widget *widget, -+ struct input *input, uint32_t time, -+ uint32_t button, enum wl_pointer_button_state state, void *data) -+{ -+ struct graph *g = data; -+ -+ switch (button) { -+ case BTN_LEFT: -+ if (state == WL_POINTER_BUTTON_STATE_PRESSED) -+ window_move(g->window, input, -+ display_get_serial(g->display)); -+ break; -+ case BTN_MIDDLE: -+ if (state == WL_POINTER_BUTTON_STATE_PRESSED) -+ widget_schedule_redraw(widget); -+ break; -+ case BTN_RIGHT: -+ if (state == WL_POINTER_BUTTON_STATE_PRESSED) -+ window_show_frame_menu(g->window, input, time); -+ break; -+ } -+} -+ -+static void -+touch_down_handler(struct widget *widget, struct input *input, -+ uint32_t serial, uint32_t time, int32_t id, -+ float x, float y, void *data) -+{ -+ struct graph *g = data; -+ window_move(g->window, input, display_get_serial(g->display)); -+} -+ -+static void task_run(struct task *task, uint32_t events) -+{ -+ eventfd_t e; -+ struct graph *g = (struct graph *)(task->link.prev); -+ uint64_t time_diff; -+ int elems, tmp, incr, i; -+ double y; -+ -+ eventfd_read(g->eventfd, &e); -+ if(e == 1) { -+ pthread_mutex_lock(&g->mtx); -+ /* Process new data */ -+ DBG("time_now: %llu, last_time: %llu\n", g->time_now, g->data->last_time); -+ if (g->time_now > g->data->last_time) { -+ time_diff = g->time_now - g->data->last_time; -+ y = (double)time_diff * g->x_scaling_factor; -+ incr = (int)y; -+ DBG("incr: %d\n", incr); -+ -+ if (g->data->last_index >= g->data->first_index) elems = g->data->last_index - g->data->first_index + 1; -+ else elems = g->data->dataset_size - g->data->first_index + g->data->last_index + 1; -+ /* Move first index to make room for new element */ -+ while (g->data->dataset_size > 0 && (elems + incr) > g->data->dataset_size) { -+ tmp = g->data->dataset[g->data->first_index].next_index - g->data->first_index; -+ if (tmp < 0) tmp = g->data->dataset_size + tmp; -+ g->data->first_index = g->data->dataset[g->data->first_index].next_index; -+ elems -= tmp; -+ g->data->num_elems--; -+ } -+ for (i=0; i<g->params.num_of_y_items; i++) { -+ /* Scale Y */ -+ y = g->time_graph_y_values[i] * (double)(g->params.draw_area.bottom_left.y-g->params.draw_area.top_right.y); -+ y = (double)g->params.draw_area.bottom_left.y - y; -+ g->data->dataset[g->data->last_index].y_values[i] = y; -+ } -+ g->data->dataset[g->data->last_index].next_index = g->data->last_index + incr; -+ if (g->data->dataset[g->data->last_index].next_index >= g->data->dataset_size) -+ g->data->dataset[g->data->last_index].next_index -= g->data->dataset_size; -+ g->data->num_elems++; -+ g->data->last_index = g->data->dataset[g->data->last_index].next_index; -+ g->data->last_time = g->time_now; -+ } -+ pthread_mutex_unlock(&g->mtx); -+ } -+ widget_schedule_redraw(g->widget); -+ DBG("event task ran...\n"); -+} -+ -+void *time_graph_create(int argc, char *argv[], struct time_graph_create_params *cp) -+{ -+ struct graph *g; -+ struct display *d; -+ int dataset_size; -+ struct timeval tv; -+ -+ if (cp->num_of_y_items > MAX_ITEMS) return NULL; -+ if (cp->num_of_text_items > MAX_ITEMS) return NULL; -+ -+ g = (struct graph*)malloc(sizeof(struct graph)); -+ if (g == NULL) { -+ fprintf(stderr, "failed to allocate memory\n"); -+ return NULL; -+ } -+ global_graph = g; -+ g->params = *cp; -+ if (cp->num_of_y_items) -+ memcpy(&g->y_config_array[0], cp->y_config_array, -+ sizeof(struct _y_config) * cp->num_of_y_items); -+ if (cp->num_of_text_items) -+ memcpy(&g->text_config_array[0], cp->text_config_array, -+ sizeof(struct _text_config) * cp->num_of_text_items); -+ d = display_create(&argc, argv); -+ if (d == NULL) { -+ fprintf(stderr, "failed to create display: %m\n"); -+ return NULL; -+ } -+ g->display = d; -+ //g->bg_image = load_cairo_surface(cp->bg_image); -+ g->width = cp->width; //cairo_image_surface_get_width(g->bg_image); -+ g->height = cp->height; //cairo_image_surface_get_height(g->bg_image); -+ dataset_size = cp->draw_area.top_right.x - cp->draw_area.bottom_left.x; -+ g->data = (struct graph_data *)malloc(sizeof(struct graph_data) + -+ (dataset_size * sizeof(struct graph_dataset_point))); -+ if (!g->data) { -+ fprintf(stderr, "failed to allocate memory\n"); -+ display_destroy(g->display); -+ //cairo_surface_destroy(g->bg_image); -+ free(g); -+ return NULL; -+ } -+ g->data->first_index = 0; -+ g->data->last_index = 0; -+ g->data->num_elems = 0; -+ g->data->dataset_size = dataset_size; -+ g->x_scaling_factor = (double)dataset_size / (double)cp->time_span; -+ g->window = window_create(d); -+ g->widget = window_add_widget(g->window, g); -+ window_set_title(g->window, cp->title); -+ widget_set_resize_handler(g->widget, resize_handler); -+ widget_set_redraw_handler(g->widget, redraw_handler); -+ widget_set_button_handler(g->widget, button_handler); -+ widget_set_default_cursor(g->widget, CURSOR_HAND1); -+ widget_set_touch_down_handler(g->widget, touch_down_handler); -+ window_schedule_resize(g->window, g->width, g->height); -+ g->eventfd = eventfd(0, 0); -+ g->task.run = task_run; -+ g->task.link.prev = (struct wl_list*)g; -+ g->task.link.next = NULL; -+ display_watch_fd(d, g->eventfd, EPOLLIN, &g->task); -+ pthread_mutex_init(&g->mtx, NULL); -+ -+ if (0 != pthread_create(&g->thr, NULL, (void *(*)(void *))display_run, (void *)d)) { -+ fprintf(stderr, "pthread_create failed: %m\n"); -+ widget_destroy(g->widget); -+ window_destroy(g->window); -+ display_destroy(g->display); -+ //cairo_surface_destroy(g->bg_image); -+ free(g->data); -+ close(g->eventfd); -+ free(g); -+ return NULL; -+ } -+ gettimeofday(&tv, NULL); -+ g->start_time_tv_sec = tv.tv_sec; -+ g->data->last_time = 0; -+ return (void*)g; -+} -+ -+void move_graph(void *ctx, struct time_graph_create_params *cp) -+{ -+ struct graph *g = ctx; -+ window_set_title(g->window, cp->title); -+} -+ -+void time_graph_plot(void *ctx, double *y_values, const char *text_values[]) -+{ -+ struct timeval tv; -+ struct graph *g = ctx; -+ int i; -+ pthread_mutex_lock(&g->mtx); -+ gettimeofday(&tv, NULL); -+ g->time_now = ((tv.tv_sec - g->start_time_tv_sec) * 1000) + (tv.tv_usec / 1000); -+ memcpy(g->time_graph_y_values, y_values, g->params.num_of_y_items * sizeof(double)); -+ for (i=0;i<g->params.num_of_text_items; i++) { -+ strncpy(g->text_values[i], text_values[i], MAX_TEXT_SIZE); -+ g->text_values[i][MAX_TEXT_SIZE-1] = '\0'; -+ } -+ pthread_mutex_unlock(&g->mtx); -+ eventfd_write(g->eventfd, (eventfd_t)1); -+} -+ -+void time_graph_destroy(void *ctx) -+{ -+ struct graph *g = (struct graph *)ctx; -+ display_exit(g->display); -+ eventfd_write(g->eventfd, (eventfd_t)1); -+ pthread_join(g->thr, NULL); -+ widget_destroy(g->widget); -+ window_destroy(g->window); -+ display_destroy(g->display); -+ free(g->data); -+ close(g->eventfd); -+ free(g); -+ global_graph=NULL; -+} -+ -+void util_get_cpu_usage(double *cpu_usage) -+{ -+ static FILE *fp = NULL; -+ char buf[256]; -+ uint64_t tot; -+ uint64_t u, n, s, i, w, x, y, z; -+ static uint64_t last_i = 0, last_total = 0; -+ -+ -+ if (!fp) { -+ if (!(fp = fopen("/proc/stat", "r"))) -+ fprintf(stderr, "Failed /proc/stat open: %s", strerror(errno)); -+ } -+ if (fp) { -+ while (1) { -+ rewind(fp); -+ fflush(fp); -+ if (!fgets(buf, sizeof(buf), fp)) { -+ fprintf(stderr, "failed /proc/stat read\n"); -+ } else { -+ sscanf(buf, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu", -+ &u, -+ &n, -+ &s, -+ &i, -+ &w, -+ &x, -+ &y, -+ &z -+ ); -+ if (last_total == 0) { -+ last_total = u+n+s+i+w+x+y+z; -+ last_i = i; -+ usleep(100000); -+ } else { -+ tot = u+n+s+i+w+x+y+z; -+ *cpu_usage = (1.0 - ((double)(i-last_i)/(double)(tot-last_total))); -+ last_i = i; -+ last_total = tot; -+ break; -+ } -+ } -+ } -+ } -+} -+ -+void *bar_graph_create(int argc, char *argv[], struct bar_graph_create_params *cp) -+{ -+ struct graph *g; -+ struct display *d; -+ struct timeval tv; -+ -+ if (cp->num_of_y_items > MAX_ITEMS) return NULL; -+ if (cp->num_of_text_items > MAX_ITEMS) return NULL; -+ -+ if (global_graph == NULL) { -+ fprintf(stderr, "graph not initialized invoke time_graph_create first\n"); -+ return NULL; -+ } -+ g=global_graph; -+ g->bar_graph_params = *cp; -+ if (cp->num_of_y_items) -+ memcpy(&g->bar_graph_y_config_array[0], cp->y_config_array, -+ sizeof(struct _bar_graph_y_config) * cp->num_of_y_items); -+ if (cp->num_of_text_items) -+ memcpy(&g->bar_graph_text_config_array[0], cp->text_config_array, -+ sizeof(struct _text_config) * cp->num_of_text_items); -+ -+ return g; -+} -+ -+void bar_graph_plot(void *ctx, double *y_values, const char *text_values[]) -+{ -+ struct graph *g = ctx; -+ int i; -+ pthread_mutex_lock(&g->mtx); -+ memcpy(g->bar_graph_y_values, y_values, g->bar_graph_params.num_of_y_items * sizeof(double)); -+ for (i=0;i<g->bar_graph_params.num_of_text_items; i++) { -+ strncpy(g->bar_graph_text_values[i], text_values[i], MAX_TEXT_SIZE); -+ g->bar_graph_text_values[i][MAX_TEXT_SIZE-1] = '\0'; -+ } -+ pthread_mutex_unlock(&g->mtx); -+ //eventfd_write(g->eventfd, (eventfd_t)2); -+} -+ -+void bar_graph_destroy(void *ctx) -+{ -+ printf("Nothing to be done for this call\n"); -+ return; -+} -+ -diff --git a/clients/time_bar_graph.h b/clients/time_bar_graph.h -new file mode 100644 -index 0000000..97ac05a ---- /dev/null -+++ b/clients/time_bar_graph.h -@@ -0,0 +1,93 @@ -+ -+#ifndef _BAR_GRAPH_H_ -+#define _BAR_GRAPH_H_ -+ -+#include <stdint.h> -+ -+struct _rgba { -+ double r, g, b, a; // Values between 0 and 1 -+}; -+ -+struct _coordinate { -+ uint32_t x, y; // Co-ordinates relative to top-left of the window -+}; -+ -+struct _rect { -+ struct _coordinate bottom_left, top_right; -+}; -+ -+struct _y_config { -+ struct _rgba line_color; // Line color -+ struct _rgba fill_color; // Fill color, 0 alpha => no fill -+}; -+ -+struct _text_config { -+ struct _rgba color; // Color for drawing the text, RGBA -+ struct _coordinate at; // where to draw the text -+ int fontsize; // Font size -+}; -+ -+struct time_graph_create_params { -+ char *title; -+ //const char *bg_image; -+ uint32_t width; -+ uint32_t height; -+ struct _rect draw_area; -+ uint32_t time_span; // Amount of time the graph has to span in milliseconds -+ uint32_t num_of_y_items; -+ struct _y_config *y_config_array; -+ uint32_t num_of_text_items; -+ struct _text_config *text_config_array; -+}; -+ -+ -+struct _bar_graph_y_config { -+ struct _rect region; // Region for the bar graph -+ struct _rgba line_color; // Color for drawing the line, RGBA -+ struct _rgba fill_color; // Fill under the line with color RGBA, 0 => no fill -+}; -+ -+struct bar_graph_create_params { -+ char *title; -+ //const char *bg_image; -+ uint32_t num_of_y_items; -+ struct _bar_graph_y_config *y_config_array; -+ uint32_t num_of_text_items; -+ struct _text_config *text_config_array; -+}; -+ -+/* Creates a time graph using create parameters */ -+void *bar_graph_create(int argc, char *argv[], struct bar_graph_create_params *cp); -+ -+void move_graph(void *ctx, struct time_graph_create_params *cp); -+ -+/* Plots a new set of y-values from the values in the array y_values. -+ The number of values must be equal to "num_of_y_items" from create params -+ y_values must be normalized between 0.0 to 1.0 -+*/ -+void bar_graph_plot(void *ctx, double *y_values, const char *text_values[]); -+ -+/* Destroy the graph */ -+void bar_graph_destroy(void *ctx); -+ -+ -+/* Creates a time graph using create parameters */ -+void *time_graph_create(int argc, char *argv[], struct time_graph_create_params *cp); -+ -+/* -+ * Plots a new set of points from the values in the array y_values. -+ * The number of values in the array y_values must be equal to "num_of_y_items" -+ * from create params -+ * y_values must be normalized between 0.0 to 1.0 -+ -+ * The number of values in the array text_values must be equal to "num_of_text_items" -+ * from create params -+*/ -+void time_graph_plot(void *ctx, double *y_values, const char *text_values[]); -+ -+/* Destroy the graph */ -+void time_graph_destroy(void *ctx); -+ -+void util_get_cpu_usage(double *cpu_usage); -+ -+#endif /* _BAR_GRAPH_H_ */ --- -1.9.1 - diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0003-weston-Fix-virtual-keyboard-display-issue-for-QT5-ap.patch b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0003-weston-Fix-virtual-keyboard-display-issue-for-QT5-ap.patch deleted file mode 100644 index 32901db99..000000000 --- a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0003-weston-Fix-virtual-keyboard-display-issue-for-QT5-ap.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 8034bc1862bbebb332e91917c6458ef8efb5b54e Mon Sep 17 00:00:00 2001 -From: Eric Ruei <e-ruei1@ti.com> -Date: Fri, 8 Mar 2019 18:49:07 -0500 -Subject: [PATCH] weston: Fix virtual keyboard display issue for QT5 - application - -The virtual keyboard does pop up as expected, however, it will never hide -even when the application is terminated. This problem is due to the order -of the text APIs( text_input_activate and test_input_show_input_panel) are -invoked in QT5 and a potential bug of the API implementation. The virtual -keyboard works as expected if the test_input_show_input_panel() is invoked -prior to the test_input_activate() as most of the weston sample applications -do. However, the problem will show up if that order is reversed and the reason -why is that the current_panel is not set in this case and hence this panel -cannot be hidden. - -It is required to set the current_panel to the text_input when the input_panel -becomes visible at the first time. - -Upstream status: Pending - -Signed-off-by: Eric Ruei <e-ruei1@ti.com> ---- - compositor/text-backend.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/compositor/text-backend.c b/compositor/text-backend.c -index 664c36f..b610dfb 100644 ---- a/compositor/text-backend.c -+++ b/compositor/text-backend.c -@@ -349,6 +349,7 @@ text_input_show_input_panel(struct wl_client *client, - text_input->surface); - wl_signal_emit(&ec->update_input_panel_signal, - &text_input->cursor_rectangle); -+ text_input->manager->current_text_input = text_input; - } - } - --- -1.9.1 - diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0004-weston-Fix-touch-screen-crash-issue.patch b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0004-weston-Fix-touch-screen-crash-issue.patch deleted file mode 100644 index 4849d5b64..000000000 --- a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0004-weston-Fix-touch-screen-crash-issue.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 60250e9dc57fe56148c8a24bba107bce8a873fb4 Mon Sep 17 00:00:00 2001 -From: Karthik Ramanan <a0393906@ti.com> -Date: Mon, 12 Mar 2018 10:56:28 +0530 -Subject: [PATCH 4/4] weston: Fix touch screen crash issue - -Touch screen operation causes the weston to crash with segment fault sometimes. -The crash occurs when the coordinate (x,y) passed to the weston input module -is outside the view window, hence the weston compositor is not able to pick -up a display view and there is no code to detect this condition at function -notify_touch(). - -Upstream status: pending - -Signed-off-by: Eric Ruei <e-ruei1@ti.com> -Signed-off-by: Karthik Ramanan <a0393906@ti.com> ---- - libweston/input.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/libweston/input.c b/libweston/input.c -index 4fedc55..bcb2f28 100644 ---- a/libweston/input.c -+++ b/libweston/input.c -@@ -2185,6 +2185,12 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id, - * until all touch points are up again. */ - if (touch->num_tp == 1) { - ev = weston_compositor_pick_view(ec, x, y, &sx, &sy); -+ if (!ev) -+ { -+ weston_log("notify_touch: weston_compositor_pick_view(%d, %d) failed to find a view!\n", -+ wl_fixed_to_int(x), wl_fixed_to_int(y)); -+ return; -+ } - weston_touch_set_focus(touch, ev); - } else if (!touch->focus) { - /* Unexpected condition: We have non-initial touch but --- -1.9.1 - diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0005-weston-drm-fix-dual-display-issue.patch b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0005-weston-drm-fix-dual-display-issue.patch deleted file mode 100644 index 9b06b81b3..000000000 --- a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0005-weston-drm-fix-dual-display-issue.patch +++ /dev/null @@ -1,79 +0,0 @@ -From db6f5ce008d9b8a4cc7db71659ce1d21d3d7f97f Mon Sep 17 00:00:00 2001 -From: Eric Ruei <e-ruei1@ti.com> -Date: Tue, 26 Mar 2019 13:32:31 -0400 -Subject: [PATCH 3/3] weston: drm: fix dual display issue - -This patch fixes the dual display issue by enhancing the primary plane -search algorithm to keep the plane which is connected to the crtc of -the output because the direct switching of active planes is not allowed. - -Upstream status: Pending - -Signed-off-by: Eric Ruei <e-ruei1@ti.com> ---- - libweston/compositor-drm.c | 17 ++++++++++++++++- - 1 file changed, 16 insertions(+), 1 deletion(-) - -diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c -index 3891176..fa694c3 100644 ---- a/libweston/compositor-drm.c -+++ b/libweston/compositor-drm.c -@@ -428,6 +428,7 @@ struct drm_plane { - - uint32_t possible_crtcs; - uint32_t plane_id; -+ uint32_t crtc_id; - uint32_t count_formats; - - struct drm_property_info props[WDRM_PLANE__COUNT]; -@@ -4073,6 +4074,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane, - if (kplane) { - plane->possible_crtcs = kplane->possible_crtcs; - plane->plane_id = kplane->plane_id; -+ plane->crtc_id = kplane->crtc_id; - - props = drmModeObjectGetProperties(b->drm.fd, kplane->plane_id, - DRM_MODE_OBJECT_PLANE); -@@ -4097,6 +4099,7 @@ drm_plane_create(struct drm_backend *b, const drmModePlane *kplane, - else { - plane->possible_crtcs = (1 << output->pipe); - plane->plane_id = 0; -+ plane->crtc_id = 0; - plane->count_formats = 1; - plane->formats[0].format = format; - plane->type = type; -@@ -4157,6 +4160,7 @@ drm_output_find_special_plane(struct drm_backend *b, struct drm_output *output, - enum wdrm_plane_type type) - { - struct drm_plane *plane; -+ struct drm_plane *plane2 = NULL; /* secondary plane */ - - if (!b->universal_planes) { - uint32_t format; -@@ -4204,11 +4208,22 @@ drm_output_find_special_plane(struct drm_backend *b, struct drm_output *output, - if (found_elsewhere) - continue; - -+ /* The output should keep the primary plane connected to its -+ * crtc since the direct switching of active plane is not -+ * allowed. */ -+ if ((type == WDRM_PLANE_TYPE_PRIMARY) && -+ (plane->crtc_id != output->crtc_id)) { -+ if (plane->crtc_id == 0) { -+ plane->possible_crtcs = (1 << output->pipe); -+ plane2 = plane; -+ } -+ continue; -+ } - plane->possible_crtcs = (1 << output->pipe); - return plane; - } - -- return NULL; -+ return plane2; - } - - /** --- -1.9.1 - diff --git a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston_8.0.0.bbappend b/meta-agl-bsp/meta-ti/recipes-arago/weston/weston_8.0.0.bbappend deleted file mode 100644 index 09f1cdc53..000000000 --- a/meta-agl-bsp/meta-ti/recipes-arago/weston/weston_8.0.0.bbappend +++ /dev/null @@ -1,13 +0,0 @@ -PACKAGECONFIG[kms] = "-Dbackend-drm=true,-Dbackend-drm=false,drm udev virtual/libgbm mtdev" - -PR:append = ".arago2" - -FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" - -# file://0005-weston-drm-fix-dual-display-issue.patch -SRC_URI += " \ - file://0003-weston-Fix-virtual-keyboard-display-issue-for-QT5-ap.patch \ - file://0004-weston-Fix-touch-screen-crash-issue.patch \ -" - -INHIBIT_PACKAGE_STRIP = "1" diff --git a/meta-agl-bsp/meta-ti/recipes-bsp/ti-sgx-ddk-km/ti-sgx-ddk-km/0001-Add-support-for-AGL-toolchain.patch b/meta-agl-bsp/meta-ti/recipes-bsp/ti-sgx-ddk-km/ti-sgx-ddk-km/0001-Add-support-for-AGL-toolchain.patch deleted file mode 100644 index 93aff157a..000000000 --- a/meta-agl-bsp/meta-ti/recipes-bsp/ti-sgx-ddk-km/ti-sgx-ddk-km/0001-Add-support-for-AGL-toolchain.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 11131a5e778d19c06eefbcf61447c6efbcee0613 Mon Sep 17 00:00:00 2001 -From: Paul Barker <paul.barker@sancloud.co.uk> -Date: Mon, 18 Nov 2019 08:47:41 +0000 -Subject: [PATCH] Add support for AGL toolchain - -We can use the pre-existing config for arm-linux-gnueabihf, we just need -to make sure our toolchain is matched against this and not -arm-linux-gnueabi. - -Signed-off-by: Paul Barker <paul.barker@sancloud.co.uk> ---- - eurasia_km/eurasiacon/build/linux2/config/compiler.mk | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/eurasia_km/eurasiacon/build/linux2/config/compiler.mk b/eurasia_km/eurasiacon/build/linux2/config/compiler.mk -index 2ba3e5e..03e86c5 100644 ---- a/eurasia_km/eurasiacon/build/linux2/config/compiler.mk -+++ b/eurasia_km/eurasiacon/build/linux2/config/compiler.mk -@@ -68,7 +68,7 @@ define calculate-compiler-preferred-target - ifneq ($$(filter aarch64-%,$$($(1)_compiler_preferred_target)),) - $(1)_compiler_preferred_target := aarch64-linux-gnu - endif -- ifneq ($$(filter arm-%-gnueabihf arm-oe-linux-gnueabi,$$($(1)_compiler_preferred_target)),) -+ ifneq ($$(filter arm-%-gnueabihf arm-oe-linux-gnueabi arm-agl-linux-gnueabi,$$($(1)_compiler_preferred_target)),) - $(1)_compiler_preferred_target := arm-linux-gnueabihf - endif - ifneq ($$(filter arm-%-gnueabi armv7a-cros-linux-gnueabi armv7hl-redhat-linux-gnueabi,$$($(1)_compiler_preferred_target)),) --- -2.17.1 - diff --git a/meta-agl-bsp/meta-ti/recipes-bsp/ti-sgx-ddk-km/ti-sgx-ddk-km_%.bbappend b/meta-agl-bsp/meta-ti/recipes-bsp/ti-sgx-ddk-km/ti-sgx-ddk-km_%.bbappend deleted file mode 100644 index 62f1947e5..000000000 --- a/meta-agl-bsp/meta-ti/recipes-bsp/ti-sgx-ddk-km/ti-sgx-ddk-km_%.bbappend +++ /dev/null @@ -1,3 +0,0 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" - -SRC_URI += "file://0001-Add-support-for-AGL-toolchain.patch" diff --git a/meta-agl-bsp/meta-ti/recipes-graphics/libgles/ti-sgx-ddk-um/pvr.service b/meta-agl-bsp/meta-ti/recipes-graphics/libgles/ti-sgx-ddk-um/pvr.service deleted file mode 100644 index 1acb94fd4..000000000 --- a/meta-agl-bsp/meta-ti/recipes-graphics/libgles/ti-sgx-ddk-um/pvr.service +++ /dev/null @@ -1,19 +0,0 @@ -[Unit] -Description=PVR service -SourcePath=/etc/ti-sgx/rc.pvr -DefaultDependencies=no -Before=psplash-start.service - -[Service] -Type=forking -Restart=no -TimeoutSec=5min -IgnoreSIGPIPE=no -KillMode=process -GuessMainPID=no -RemainAfterExit=yes -ExecStart=/etc/ti-sgx/rc.pvr start -ExecStop=/etc/ti-sgx/rc.pvr stop - -[Install] -WantedBy=sysinit.target diff --git a/meta-agl-bsp/meta-ti/recipes-graphics/libgles/ti-sgx-ddk-um_%.bbappend b/meta-agl-bsp/meta-ti/recipes-graphics/libgles/ti-sgx-ddk-um_%.bbappend deleted file mode 100644 index 3f497a1be..000000000 --- a/meta-agl-bsp/meta-ti/recipes-graphics/libgles/ti-sgx-ddk-um_%.bbappend +++ /dev/null @@ -1,18 +0,0 @@ -FILESEXTRAPATHS:append := ":${THISDIR}/${PN}" -FILES:${PN} += "/etc/ti-sgx/" - -SRC_URI:append = "\ - file://pvr.service \ -" - -inherit systemd - -SYSTEMD_PACKAGES = "${PN}" -SYSTEMD_SERVICE:${PN} = "pvr.service" - -do_install:append() { - install -d ${D}${systemd_system_unitdir} - install -m 0755 ${WORKDIR}/pvr.service ${D}${systemd_system_unitdir} - install -d ${D}/etc/ti-sgx - install -m 0755 ${D}/etc/init.d/rc.pvr ${D}/etc/ti-sgx -} diff --git a/meta-agl-bsp/meta-ti/recipes-graphics/mesa/mesa-gl_%.bbappend b/meta-agl-bsp/meta-ti/recipes-graphics/mesa/mesa-gl_%.bbappend deleted file mode 100644 index d12ab2be2..000000000 --- a/meta-agl-bsp/meta-ti/recipes-graphics/mesa/mesa-gl_%.bbappend +++ /dev/null @@ -1,7 +0,0 @@ -# Remove GBM support from Mesa -# TI Platforms provides own GBM library - -PACKAGES:remove = "libgbm" -PACKAGES:remove = "libgbm-dev" - -EXTRA_OECONF:remove = "--enable-gbm" diff --git a/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-mkimage-rpi4.bb b/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-mkimage-rpi4.bb index 43a7d639b..b857cb19f 100644 --- a/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-mkimage-rpi4.bb +++ b/meta-agl-bsp/virtualization-layer/recipes-extended/xen/xen-mkimage-rpi4.bb @@ -1,5 +1,5 @@ DESCRIPTION = "Xen hypervisor u-boot image" -LICENSE = "GPLv2" +LICENSE = "GPL-2.0-only" SECTION = "console/tools" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" diff --git a/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa/0001-virgl-virgl_driinfo.h.in-Disable-by-default-emulated.patch b/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa/0001-virgl-virgl_driinfo.h.in-Disable-by-default-emulated.patch new file mode 100644 index 000000000..8bc102c92 --- /dev/null +++ b/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa/0001-virgl-virgl_driinfo.h.in-Disable-by-default-emulated.patch @@ -0,0 +1,34 @@ +From 39dea63ebce2764c683c8c2eddbb10cf07a970c4 Mon Sep 17 00:00:00 2001 +From: Marius Vlad <marius.vlad@collabora.com> +Date: Mon, 19 Dec 2022 11:51:28 +0200 +Subject: [PATCH] virgl/virgl_driinfo.h.in: Disable by default emulated BGRA + and swizzling + +Workaround in place for virtio aarch64 to avoid graphical artefacts when +first time booting up on PVR host driver. + +Introduced with patch 'virgl: Always enable emulated BGRA and swizzling +unless specifically told not to' in mesa-20.3.0. + +Signed-off-by: Marius Vlad <marius.vlad@collabora.com> +--- + src/gallium/drivers/virgl/virgl_driinfo.h.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/gallium/drivers/virgl/virgl_driinfo.h.in b/src/gallium/drivers/virgl/virgl_driinfo.h.in +index f57e5880965..1c06f932c5c 100644 +--- a/src/gallium/drivers/virgl/virgl_driinfo.h.in ++++ b/src/gallium/drivers/virgl/virgl_driinfo.h.in +@@ -8,7 +8,7 @@ + // 5. Implement the tweak in virglrenderer + DRI_CONF_SECTION_MISCELLANEOUS + DRI_CONF_FORMAT_L8_SRGB_ENABLE_READBACK(false) +- DRI_CONF_GLES_EMULATE_BGRA(true) +- DRI_CONF_GLES_APPLY_BGRA_DEST_SWIZZLE(true) ++ DRI_CONF_GLES_EMULATE_BGRA(false) ++ DRI_CONF_GLES_APPLY_BGRA_DEST_SWIZZLE(false) + DRI_CONF_GLES_SAMPLES_PASSED_VALUE(1024, 1, 400000000) + DRI_CONF_SECTION_END +-- +2.35.1 + diff --git a/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa_24.%.bbappend b/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa_24.%.bbappend new file mode 100644 index 000000000..0a6606ebf --- /dev/null +++ b/meta-agl-bsp/virtualization-layer/recipes-graphics/mesa/mesa_24.%.bbappend @@ -0,0 +1,3 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" + +SRC_URI += "file://0001-virgl-virgl_driinfo.h.in-Disable-by-default-emulated.patch" diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto-dev.bbappend b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto-dev.bbappend new file mode 100644 index 000000000..5970414eb --- /dev/null +++ b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto-dev.bbappend @@ -0,0 +1,10 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/linux-yocto:" + +SRC_URI:append:virtio-all = " \ + git://gerrit.automotivelinux.org/gerrit/src/agl-yocto-kernel-meta.git;protocol=https;type=kmeta;name=agl-meta;destsuffix=agl-kernel-meta;branch=master \ + file://virtio-aarch64-${LINUX_KERNEL_TYPE}.scc \ +" + +SRCREV_agl-meta = "c5008f4ba9e1b9f11c1014b53477079e605ceab7" + +COMPATIBLE_MACHINE:virtio-aarch64 = "virtio-aarch64" diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-aarch64-standard.scc b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-aarch64-standard.scc index d675de474..2d1570e9f 100644 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-aarch64-standard.scc +++ b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-aarch64-standard.scc @@ -7,7 +7,7 @@ include ktypes/standard/standard.scc nopatch include arch/arm/aarch64.scc include cfg/8250.scc include cfg/virtio.scc -include virtio.scc +include bsp/virtio/agl-virtio.scc # enable the ability to run 32 bit apps include arch/arm/32bit-compat.scc diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-drm.cfg b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-drm.cfg new file mode 100644 index 000000000..2facc345e --- /dev/null +++ b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-drm.cfg @@ -0,0 +1,3 @@ +CONFIG_DRM=y +CONFIG_FB=y +CONFIG_DRM_FBDEV_EMULATION=y diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/arch/arm/aarch64.cfg b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/arch/arm/aarch64.cfg deleted file mode 100644 index 25381e133..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/arch/arm/aarch64.cfg +++ /dev/null @@ -1,29 +0,0 @@ -# SPDX-License-Identifier: MIT -# -# ARM64 -# -CONFIG_ARM64=y -CONFIG_64BIT=y - -# -# Bus support -# -CONFIG_ARM_AMBA=y - -# -# Non-8250 serial port support -# -CONFIG_SERIAL_AMBA_PL011=y -CONFIG_SERIAL_AMBA_PL011_CONSOLE=y - -# -# RTC -# -CONFIG_RTC_HCTOSYS=y -CONFIG_RTC_HCTOSYS_DEVICE="rtc0" - -# -# on-CPU RTC drivers -# -CONFIG_RTC_CLASS=y -CONFIG_RTC_DRV_PL031=y diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/arch/arm/aarch64.scc b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/arch/arm/aarch64.scc deleted file mode 100644 index 1de6faf9b..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/arch/arm/aarch64.scc +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-License-Identifier: MIT -kconf hardware aarch64.cfg diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-input-add-multi-touch-support.patch b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-input-add-multi-touch-support.patch deleted file mode 100644 index 59a9f9b5d..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-input-add-multi-touch-support.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 16c10bede8b3d8594279752bf53153491f3f944f Mon Sep 17 00:00:00 2001 -From: Mathias Crombez <mathias.crombez@faurecia.com> -Date: Fri, 15 Jan 2021 02:26:23 +0200 -Subject: [PATCH] virtio-input: add multi-touch support - -Without multi-touch slots allocated, ABS_MT_SLOT events will be lost by -input_handle_abs_event. - -Implementation is based on uinput_create_device. - -Signed-off-by: Mathias Crombez <mathias.crombez@faurecia.com> -Co-developed-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com> -Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com> -Link: https://lore.kernel.org/r/20210115002623.8576-1-vasyl.vavrychuk@opensynergy.com -Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -Reviewed-by: Gerd Hoffmann <kraxel@redhat.com> ---- - drivers/virtio/virtio_input.c | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/drivers/virtio/virtio_input.c b/drivers/virtio/virtio_input.c -index 244965c20d9b..ce51ae165943 100644 ---- a/drivers/virtio/virtio_input.c -+++ b/drivers/virtio/virtio_input.c -@@ -7,6 +7,7 @@ - - #include <uapi/linux/virtio_ids.h> - #include <uapi/linux/virtio_input.h> -+#include <linux/input/mt.h> - - struct virtio_input { - struct virtio_device *vdev; -@@ -219,7 +220,7 @@ static int virtinput_probe(struct virtio_device *vdev) - struct virtio_input *vi; - unsigned long flags; - size_t size; -- int abs, err; -+ int abs, err, nslots; - - if (!virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) - return -ENODEV; -@@ -304,6 +305,13 @@ static int virtinput_probe(struct virtio_device *vdev) - continue; - virtinput_cfg_abs(vi, abs); - } -+ -+ if (test_bit(ABS_MT_SLOT, vi->idev->absbit)) { -+ nslots = input_abs_get_max(vi->idev, ABS_MT_SLOT) + 1; -+ err = input_mt_init_slots(vi->idev, nslots, 0); -+ if (err) -+ goto err_mt_init_slots; -+ } - } - - virtio_device_ready(vdev); -@@ -319,6 +327,7 @@ static int virtinput_probe(struct virtio_device *vdev) - spin_lock_irqsave(&vi->lock, flags); - vi->ready = false; - spin_unlock_irqrestore(&vi->lock, flags); -+err_mt_init_slots: - input_free_device(vi->idev); - err_input_alloc: - vdev->config->del_vqs(vdev); --- -2.31.1 - diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0001-uapi-virtio_ids-add-a-sound-device-type-ID-from-OASI.patch b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0001-uapi-virtio_ids-add-a-sound-device-type-ID-from-OASI.patch deleted file mode 100644 index e303d10c7..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0001-uapi-virtio_ids-add-a-sound-device-type-ID-from-OASI.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 6afbb3650d7e02785030f1212c88b50d7296bb45 Mon Sep 17 00:00:00 2001 -From: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Date: Tue, 2 Mar 2021 17:47:01 +0100 -Subject: [PATCH] uapi: virtio_ids: add a sound device type ID from OASIS spec - -The OASIS virtio spec defines a sound device type ID that is not -present in the header yet. - -Signed-off-by: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Link: https://lore.kernel.org/r/20210302164709.3142702-2-anton.yakovlev@opensynergy.com -Signed-off-by: Takashi Iwai <tiwai@suse.de> -Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com> ---- - include/uapi/linux/virtio_ids.h | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/include/uapi/linux/virtio_ids.h b/include/uapi/linux/virtio_ids.h -index b052355ac7a3..bc740d6d2259 100644 ---- a/include/uapi/linux/virtio_ids.h -+++ b/include/uapi/linux/virtio_ids.h -@@ -45,6 +45,7 @@ - #define VIRTIO_ID_CRYPTO 20 /* virtio crypto */ - #define VIRTIO_ID_IOMMU 23 /* virtio IOMMU */ - #define VIRTIO_ID_MEM 24 /* virtio mem */ -+#define VIRTIO_ID_SOUND 25 /* virtio sound */ - #define VIRTIO_ID_FS 26 /* virtio filesystem */ - #define VIRTIO_ID_PMEM 27 /* virtio pmem */ - #define VIRTIO_ID_MAC80211_HWSIM 29 /* virtio mac80211-hwsim */ diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0002-ALSA-virtio-add-virtio-sound-driver.patch b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0002-ALSA-virtio-add-virtio-sound-driver.patch deleted file mode 100644 index e2f80442f..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0002-ALSA-virtio-add-virtio-sound-driver.patch +++ /dev/null @@ -1,849 +0,0 @@ -From a1cde5ccba57562aa77739b63b50586e6b197b52 Mon Sep 17 00:00:00 2001 -From: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Date: Tue, 2 Mar 2021 17:47:02 +0100 -Subject: [PATCH] ALSA: virtio: add virtio sound driver - -Introduce skeleton of the virtio sound driver. The driver implements -the virtio sound device specification, which has become part of the -virtio standard. - -Initial initialization of the device, virtqueues and creation of an -empty ALSA sound device. - -Signed-off-by: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Link: https://lore.kernel.org/r/20210302164709.3142702-3-anton.yakovlev@opensynergy.com -Signed-off-by: Takashi Iwai <tiwai@suse.de> -Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com> ---- - MAINTAINERS | 9 + - include/uapi/linux/virtio_snd.h | 334 ++++++++++++++++++++++++++++++++ - sound/Kconfig | 2 + - sound/Makefile | 3 +- - sound/virtio/Kconfig | 10 + - sound/virtio/Makefile | 7 + - sound/virtio/virtio_card.c | 324 +++++++++++++++++++++++++++++++ - sound/virtio/virtio_card.h | 65 +++++++ - 8 files changed, 753 insertions(+), 1 deletion(-) - create mode 100644 include/uapi/linux/virtio_snd.h - create mode 100644 sound/virtio/Kconfig - create mode 100644 sound/virtio/Makefile - create mode 100644 sound/virtio/virtio_card.c - create mode 100644 sound/virtio/virtio_card.h - -diff --git a/MAINTAINERS b/MAINTAINERS -index 407ae5c24566..49772b741967 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -18670,6 +18670,15 @@ W: https://virtio-mem.gitlab.io/ - F: drivers/virtio/virtio_mem.c - F: include/uapi/linux/virtio_mem.h - -+VIRTIO SOUND DRIVER -+M: Anton Yakovlev <anton.yakovlev@opensynergy.com> -+M: "Michael S. Tsirkin" <mst@redhat.com> -+L: virtualization@lists.linux-foundation.org -+L: alsa-devel@alsa-project.org (moderated for non-subscribers) -+S: Maintained -+F: include/uapi/linux/virtio_snd.h -+F: sound/virtio/* -+ - VIRTUAL BOX GUEST DEVICE DRIVER - M: Hans de Goede <hdegoede@redhat.com> - M: Arnd Bergmann <arnd@arndb.de> -diff --git a/include/uapi/linux/virtio_snd.h b/include/uapi/linux/virtio_snd.h -new file mode 100644 -index 000000000000..dfe49547a7b0 ---- /dev/null -+++ b/include/uapi/linux/virtio_snd.h -@@ -0,0 +1,334 @@ -+/* SPDX-License-Identifier: BSD-3-Clause */ -+/* -+ * Copyright (C) 2021 OpenSynergy GmbH -+ */ -+#ifndef VIRTIO_SND_IF_H -+#define VIRTIO_SND_IF_H -+ -+#include <linux/virtio_types.h> -+ -+/******************************************************************************* -+ * CONFIGURATION SPACE -+ */ -+struct virtio_snd_config { -+ /* # of available physical jacks */ -+ __le32 jacks; -+ /* # of available PCM streams */ -+ __le32 streams; -+ /* # of available channel maps */ -+ __le32 chmaps; -+}; -+ -+enum { -+ /* device virtqueue indexes */ -+ VIRTIO_SND_VQ_CONTROL = 0, -+ VIRTIO_SND_VQ_EVENT, -+ VIRTIO_SND_VQ_TX, -+ VIRTIO_SND_VQ_RX, -+ /* # of device virtqueues */ -+ VIRTIO_SND_VQ_MAX -+}; -+ -+/******************************************************************************* -+ * COMMON DEFINITIONS -+ */ -+ -+/* supported dataflow directions */ -+enum { -+ VIRTIO_SND_D_OUTPUT = 0, -+ VIRTIO_SND_D_INPUT -+}; -+ -+enum { -+ /* jack control request types */ -+ VIRTIO_SND_R_JACK_INFO = 1, -+ VIRTIO_SND_R_JACK_REMAP, -+ -+ /* PCM control request types */ -+ VIRTIO_SND_R_PCM_INFO = 0x0100, -+ VIRTIO_SND_R_PCM_SET_PARAMS, -+ VIRTIO_SND_R_PCM_PREPARE, -+ VIRTIO_SND_R_PCM_RELEASE, -+ VIRTIO_SND_R_PCM_START, -+ VIRTIO_SND_R_PCM_STOP, -+ -+ /* channel map control request types */ -+ VIRTIO_SND_R_CHMAP_INFO = 0x0200, -+ -+ /* jack event types */ -+ VIRTIO_SND_EVT_JACK_CONNECTED = 0x1000, -+ VIRTIO_SND_EVT_JACK_DISCONNECTED, -+ -+ /* PCM event types */ -+ VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED = 0x1100, -+ VIRTIO_SND_EVT_PCM_XRUN, -+ -+ /* common status codes */ -+ VIRTIO_SND_S_OK = 0x8000, -+ VIRTIO_SND_S_BAD_MSG, -+ VIRTIO_SND_S_NOT_SUPP, -+ VIRTIO_SND_S_IO_ERR -+}; -+ -+/* common header */ -+struct virtio_snd_hdr { -+ __le32 code; -+}; -+ -+/* event notification */ -+struct virtio_snd_event { -+ /* VIRTIO_SND_EVT_XXX */ -+ struct virtio_snd_hdr hdr; -+ /* optional event data */ -+ __le32 data; -+}; -+ -+/* common control request to query an item information */ -+struct virtio_snd_query_info { -+ /* VIRTIO_SND_R_XXX_INFO */ -+ struct virtio_snd_hdr hdr; -+ /* item start identifier */ -+ __le32 start_id; -+ /* item count to query */ -+ __le32 count; -+ /* item information size in bytes */ -+ __le32 size; -+}; -+ -+/* common item information header */ -+struct virtio_snd_info { -+ /* function group node id (High Definition Audio Specification 7.1.2) */ -+ __le32 hda_fn_nid; -+}; -+ -+/******************************************************************************* -+ * JACK CONTROL MESSAGES -+ */ -+struct virtio_snd_jack_hdr { -+ /* VIRTIO_SND_R_JACK_XXX */ -+ struct virtio_snd_hdr hdr; -+ /* 0 ... virtio_snd_config::jacks - 1 */ -+ __le32 jack_id; -+}; -+ -+/* supported jack features */ -+enum { -+ VIRTIO_SND_JACK_F_REMAP = 0 -+}; -+ -+struct virtio_snd_jack_info { -+ /* common header */ -+ struct virtio_snd_info hdr; -+ /* supported feature bit map (1 << VIRTIO_SND_JACK_F_XXX) */ -+ __le32 features; -+ /* pin configuration (High Definition Audio Specification 7.3.3.31) */ -+ __le32 hda_reg_defconf; -+ /* pin capabilities (High Definition Audio Specification 7.3.4.9) */ -+ __le32 hda_reg_caps; -+ /* current jack connection status (0: disconnected, 1: connected) */ -+ __u8 connected; -+ -+ __u8 padding[7]; -+}; -+ -+/* jack remapping control request */ -+struct virtio_snd_jack_remap { -+ /* .code = VIRTIO_SND_R_JACK_REMAP */ -+ struct virtio_snd_jack_hdr hdr; -+ /* selected association number */ -+ __le32 association; -+ /* selected sequence number */ -+ __le32 sequence; -+}; -+ -+/******************************************************************************* -+ * PCM CONTROL MESSAGES -+ */ -+struct virtio_snd_pcm_hdr { -+ /* VIRTIO_SND_R_PCM_XXX */ -+ struct virtio_snd_hdr hdr; -+ /* 0 ... virtio_snd_config::streams - 1 */ -+ __le32 stream_id; -+}; -+ -+/* supported PCM stream features */ -+enum { -+ VIRTIO_SND_PCM_F_SHMEM_HOST = 0, -+ VIRTIO_SND_PCM_F_SHMEM_GUEST, -+ VIRTIO_SND_PCM_F_MSG_POLLING, -+ VIRTIO_SND_PCM_F_EVT_SHMEM_PERIODS, -+ VIRTIO_SND_PCM_F_EVT_XRUNS -+}; -+ -+/* supported PCM sample formats */ -+enum { -+ /* analog formats (width / physical width) */ -+ VIRTIO_SND_PCM_FMT_IMA_ADPCM = 0, /* 4 / 4 bits */ -+ VIRTIO_SND_PCM_FMT_MU_LAW, /* 8 / 8 bits */ -+ VIRTIO_SND_PCM_FMT_A_LAW, /* 8 / 8 bits */ -+ VIRTIO_SND_PCM_FMT_S8, /* 8 / 8 bits */ -+ VIRTIO_SND_PCM_FMT_U8, /* 8 / 8 bits */ -+ VIRTIO_SND_PCM_FMT_S16, /* 16 / 16 bits */ -+ VIRTIO_SND_PCM_FMT_U16, /* 16 / 16 bits */ -+ VIRTIO_SND_PCM_FMT_S18_3, /* 18 / 24 bits */ -+ VIRTIO_SND_PCM_FMT_U18_3, /* 18 / 24 bits */ -+ VIRTIO_SND_PCM_FMT_S20_3, /* 20 / 24 bits */ -+ VIRTIO_SND_PCM_FMT_U20_3, /* 20 / 24 bits */ -+ VIRTIO_SND_PCM_FMT_S24_3, /* 24 / 24 bits */ -+ VIRTIO_SND_PCM_FMT_U24_3, /* 24 / 24 bits */ -+ VIRTIO_SND_PCM_FMT_S20, /* 20 / 32 bits */ -+ VIRTIO_SND_PCM_FMT_U20, /* 20 / 32 bits */ -+ VIRTIO_SND_PCM_FMT_S24, /* 24 / 32 bits */ -+ VIRTIO_SND_PCM_FMT_U24, /* 24 / 32 bits */ -+ VIRTIO_SND_PCM_FMT_S32, /* 32 / 32 bits */ -+ VIRTIO_SND_PCM_FMT_U32, /* 32 / 32 bits */ -+ VIRTIO_SND_PCM_FMT_FLOAT, /* 32 / 32 bits */ -+ VIRTIO_SND_PCM_FMT_FLOAT64, /* 64 / 64 bits */ -+ /* digital formats (width / physical width) */ -+ VIRTIO_SND_PCM_FMT_DSD_U8, /* 8 / 8 bits */ -+ VIRTIO_SND_PCM_FMT_DSD_U16, /* 16 / 16 bits */ -+ VIRTIO_SND_PCM_FMT_DSD_U32, /* 32 / 32 bits */ -+ VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME /* 32 / 32 bits */ -+}; -+ -+/* supported PCM frame rates */ -+enum { -+ VIRTIO_SND_PCM_RATE_5512 = 0, -+ VIRTIO_SND_PCM_RATE_8000, -+ VIRTIO_SND_PCM_RATE_11025, -+ VIRTIO_SND_PCM_RATE_16000, -+ VIRTIO_SND_PCM_RATE_22050, -+ VIRTIO_SND_PCM_RATE_32000, -+ VIRTIO_SND_PCM_RATE_44100, -+ VIRTIO_SND_PCM_RATE_48000, -+ VIRTIO_SND_PCM_RATE_64000, -+ VIRTIO_SND_PCM_RATE_88200, -+ VIRTIO_SND_PCM_RATE_96000, -+ VIRTIO_SND_PCM_RATE_176400, -+ VIRTIO_SND_PCM_RATE_192000, -+ VIRTIO_SND_PCM_RATE_384000 -+}; -+ -+struct virtio_snd_pcm_info { -+ /* common header */ -+ struct virtio_snd_info hdr; -+ /* supported feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */ -+ __le32 features; -+ /* supported sample format bit map (1 << VIRTIO_SND_PCM_FMT_XXX) */ -+ __le64 formats; -+ /* supported frame rate bit map (1 << VIRTIO_SND_PCM_RATE_XXX) */ -+ __le64 rates; -+ /* dataflow direction (VIRTIO_SND_D_XXX) */ -+ __u8 direction; -+ /* minimum # of supported channels */ -+ __u8 channels_min; -+ /* maximum # of supported channels */ -+ __u8 channels_max; -+ -+ __u8 padding[5]; -+}; -+ -+/* set PCM stream format */ -+struct virtio_snd_pcm_set_params { -+ /* .code = VIRTIO_SND_R_PCM_SET_PARAMS */ -+ struct virtio_snd_pcm_hdr hdr; -+ /* size of the hardware buffer */ -+ __le32 buffer_bytes; -+ /* size of the hardware period */ -+ __le32 period_bytes; -+ /* selected feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */ -+ __le32 features; -+ /* selected # of channels */ -+ __u8 channels; -+ /* selected sample format (VIRTIO_SND_PCM_FMT_XXX) */ -+ __u8 format; -+ /* selected frame rate (VIRTIO_SND_PCM_RATE_XXX) */ -+ __u8 rate; -+ -+ __u8 padding; -+}; -+ -+/******************************************************************************* -+ * PCM I/O MESSAGES -+ */ -+ -+/* I/O request header */ -+struct virtio_snd_pcm_xfer { -+ /* 0 ... virtio_snd_config::streams - 1 */ -+ __le32 stream_id; -+}; -+ -+/* I/O request status */ -+struct virtio_snd_pcm_status { -+ /* VIRTIO_SND_S_XXX */ -+ __le32 status; -+ /* current device latency */ -+ __le32 latency_bytes; -+}; -+ -+/******************************************************************************* -+ * CHANNEL MAP CONTROL MESSAGES -+ */ -+struct virtio_snd_chmap_hdr { -+ /* VIRTIO_SND_R_CHMAP_XXX */ -+ struct virtio_snd_hdr hdr; -+ /* 0 ... virtio_snd_config::chmaps - 1 */ -+ __le32 chmap_id; -+}; -+ -+/* standard channel position definition */ -+enum { -+ VIRTIO_SND_CHMAP_NONE = 0, /* undefined */ -+ VIRTIO_SND_CHMAP_NA, /* silent */ -+ VIRTIO_SND_CHMAP_MONO, /* mono stream */ -+ VIRTIO_SND_CHMAP_FL, /* front left */ -+ VIRTIO_SND_CHMAP_FR, /* front right */ -+ VIRTIO_SND_CHMAP_RL, /* rear left */ -+ VIRTIO_SND_CHMAP_RR, /* rear right */ -+ VIRTIO_SND_CHMAP_FC, /* front center */ -+ VIRTIO_SND_CHMAP_LFE, /* low frequency (LFE) */ -+ VIRTIO_SND_CHMAP_SL, /* side left */ -+ VIRTIO_SND_CHMAP_SR, /* side right */ -+ VIRTIO_SND_CHMAP_RC, /* rear center */ -+ VIRTIO_SND_CHMAP_FLC, /* front left center */ -+ VIRTIO_SND_CHMAP_FRC, /* front right center */ -+ VIRTIO_SND_CHMAP_RLC, /* rear left center */ -+ VIRTIO_SND_CHMAP_RRC, /* rear right center */ -+ VIRTIO_SND_CHMAP_FLW, /* front left wide */ -+ VIRTIO_SND_CHMAP_FRW, /* front right wide */ -+ VIRTIO_SND_CHMAP_FLH, /* front left high */ -+ VIRTIO_SND_CHMAP_FCH, /* front center high */ -+ VIRTIO_SND_CHMAP_FRH, /* front right high */ -+ VIRTIO_SND_CHMAP_TC, /* top center */ -+ VIRTIO_SND_CHMAP_TFL, /* top front left */ -+ VIRTIO_SND_CHMAP_TFR, /* top front right */ -+ VIRTIO_SND_CHMAP_TFC, /* top front center */ -+ VIRTIO_SND_CHMAP_TRL, /* top rear left */ -+ VIRTIO_SND_CHMAP_TRR, /* top rear right */ -+ VIRTIO_SND_CHMAP_TRC, /* top rear center */ -+ VIRTIO_SND_CHMAP_TFLC, /* top front left center */ -+ VIRTIO_SND_CHMAP_TFRC, /* top front right center */ -+ VIRTIO_SND_CHMAP_TSL, /* top side left */ -+ VIRTIO_SND_CHMAP_TSR, /* top side right */ -+ VIRTIO_SND_CHMAP_LLFE, /* left LFE */ -+ VIRTIO_SND_CHMAP_RLFE, /* right LFE */ -+ VIRTIO_SND_CHMAP_BC, /* bottom center */ -+ VIRTIO_SND_CHMAP_BLC, /* bottom left center */ -+ VIRTIO_SND_CHMAP_BRC /* bottom right center */ -+}; -+ -+/* maximum possible number of channels */ -+#define VIRTIO_SND_CHMAP_MAX_SIZE 18 -+ -+struct virtio_snd_chmap_info { -+ /* common header */ -+ struct virtio_snd_info hdr; -+ /* dataflow direction (VIRTIO_SND_D_XXX) */ -+ __u8 direction; -+ /* # of valid channel position values */ -+ __u8 channels; -+ /* channel position values (VIRTIO_SND_CHMAP_XXX) */ -+ __u8 positions[VIRTIO_SND_CHMAP_MAX_SIZE]; -+}; -+ -+#endif /* VIRTIO_SND_IF_H */ -diff --git a/sound/Kconfig b/sound/Kconfig -index 36785410fbe1..e56d96d2b11c 100644 ---- a/sound/Kconfig -+++ b/sound/Kconfig -@@ -99,6 +99,8 @@ source "sound/synth/Kconfig" - - source "sound/xen/Kconfig" - -+source "sound/virtio/Kconfig" -+ - endif # SND - - endif # !UML -diff --git a/sound/Makefile b/sound/Makefile -index 797ecdcd35e2..04ef04b1168f 100644 ---- a/sound/Makefile -+++ b/sound/Makefile -@@ -5,7 +5,8 @@ - obj-$(CONFIG_SOUND) += soundcore.o - obj-$(CONFIG_DMASOUND) += oss/dmasound/ - obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \ -- firewire/ sparc/ spi/ parisc/ pcmcia/ mips/ soc/ atmel/ hda/ x86/ xen/ -+ firewire/ sparc/ spi/ parisc/ pcmcia/ mips/ soc/ atmel/ hda/ x86/ xen/ \ -+ virtio/ - obj-$(CONFIG_SND_AOA) += aoa/ - - # This one must be compilable even if sound is configured out -diff --git a/sound/virtio/Kconfig b/sound/virtio/Kconfig -new file mode 100644 -index 000000000000..094cba24ee5b ---- /dev/null -+++ b/sound/virtio/Kconfig -@@ -0,0 +1,10 @@ -+# SPDX-License-Identifier: GPL-2.0+ -+# Sound card driver for virtio -+ -+config SND_VIRTIO -+ tristate "Virtio sound driver" -+ depends on VIRTIO -+ select SND_PCM -+ select SND_JACK -+ help -+ This is the virtual sound driver for virtio. Say Y or M. -diff --git a/sound/virtio/Makefile b/sound/virtio/Makefile -new file mode 100644 -index 000000000000..8c87ebb9982b ---- /dev/null -+++ b/sound/virtio/Makefile -@@ -0,0 +1,7 @@ -+# SPDX-License-Identifier: GPL-2.0+ -+ -+obj-$(CONFIG_SND_VIRTIO) += virtio_snd.o -+ -+virtio_snd-objs := \ -+ virtio_card.o -+ -diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c -new file mode 100644 -index 000000000000..5a37056858e9 ---- /dev/null -+++ b/sound/virtio/virtio_card.c -@@ -0,0 +1,324 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * virtio-snd: Virtio sound device -+ * Copyright (C) 2021 OpenSynergy GmbH -+ */ -+#include <linux/module.h> -+#include <linux/moduleparam.h> -+#include <linux/virtio_config.h> -+#include <sound/initval.h> -+#include <uapi/linux/virtio_ids.h> -+ -+#include "virtio_card.h" -+ -+static void virtsnd_remove(struct virtio_device *vdev); -+ -+/** -+ * virtsnd_event_send() - Add an event to the event queue. -+ * @vqueue: Underlying event virtqueue. -+ * @event: Event. -+ * @notify: Indicates whether or not to send a notification to the device. -+ * @gfp: Kernel flags for memory allocation. -+ * -+ * Context: Any context. -+ */ -+static void virtsnd_event_send(struct virtqueue *vqueue, -+ struct virtio_snd_event *event, bool notify, -+ gfp_t gfp) -+{ -+ struct scatterlist sg; -+ struct scatterlist *psgs[1] = { &sg }; -+ -+ /* reset event content */ -+ memset(event, 0, sizeof(*event)); -+ -+ sg_init_one(&sg, event, sizeof(*event)); -+ -+ if (virtqueue_add_sgs(vqueue, psgs, 0, 1, event, gfp) || !notify) -+ return; -+ -+ if (virtqueue_kick_prepare(vqueue)) -+ virtqueue_notify(vqueue); -+} -+ -+/** -+ * virtsnd_event_dispatch() - Dispatch an event from the device side. -+ * @snd: VirtIO sound device. -+ * @event: VirtIO sound event. -+ * -+ * Context: Any context. -+ */ -+static void virtsnd_event_dispatch(struct virtio_snd *snd, -+ struct virtio_snd_event *event) -+{ -+} -+ -+/** -+ * virtsnd_event_notify_cb() - Dispatch all reported events from the event queue. -+ * @vqueue: Underlying event virtqueue. -+ * -+ * This callback function is called upon a vring interrupt request from the -+ * device. -+ * -+ * Context: Interrupt context. -+ */ -+static void virtsnd_event_notify_cb(struct virtqueue *vqueue) -+{ -+ struct virtio_snd *snd = vqueue->vdev->priv; -+ struct virtio_snd_queue *queue = virtsnd_event_queue(snd); -+ struct virtio_snd_event *event; -+ u32 length; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&queue->lock, flags); -+ do { -+ virtqueue_disable_cb(vqueue); -+ while ((event = virtqueue_get_buf(vqueue, &length))) { -+ virtsnd_event_dispatch(snd, event); -+ virtsnd_event_send(vqueue, event, true, GFP_ATOMIC); -+ } -+ if (unlikely(virtqueue_is_broken(vqueue))) -+ break; -+ } while (!virtqueue_enable_cb(vqueue)); -+ spin_unlock_irqrestore(&queue->lock, flags); -+} -+ -+/** -+ * virtsnd_find_vqs() - Enumerate and initialize all virtqueues. -+ * @snd: VirtIO sound device. -+ * -+ * After calling this function, the event queue is disabled. -+ * -+ * Context: Any context. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_find_vqs(struct virtio_snd *snd) -+{ -+ struct virtio_device *vdev = snd->vdev; -+ static vq_callback_t *callbacks[VIRTIO_SND_VQ_MAX] = { -+ [VIRTIO_SND_VQ_EVENT] = virtsnd_event_notify_cb -+ }; -+ static const char *names[VIRTIO_SND_VQ_MAX] = { -+ [VIRTIO_SND_VQ_EVENT] = "virtsnd-event" -+ }; -+ struct virtqueue *vqs[VIRTIO_SND_VQ_MAX] = { 0 }; -+ unsigned int i; -+ unsigned int n; -+ int rc; -+ -+ rc = virtio_find_vqs(vdev, VIRTIO_SND_VQ_MAX, vqs, callbacks, names, -+ NULL); -+ if (rc) { -+ dev_err(&vdev->dev, "failed to initialize virtqueues\n"); -+ return rc; -+ } -+ -+ for (i = 0; i < VIRTIO_SND_VQ_MAX; ++i) -+ snd->queues[i].vqueue = vqs[i]; -+ -+ /* Allocate events and populate the event queue */ -+ virtqueue_disable_cb(vqs[VIRTIO_SND_VQ_EVENT]); -+ -+ n = virtqueue_get_vring_size(vqs[VIRTIO_SND_VQ_EVENT]); -+ -+ snd->event_msgs = kmalloc_array(n, sizeof(*snd->event_msgs), -+ GFP_KERNEL); -+ if (!snd->event_msgs) -+ return -ENOMEM; -+ -+ for (i = 0; i < n; ++i) -+ virtsnd_event_send(vqs[VIRTIO_SND_VQ_EVENT], -+ &snd->event_msgs[i], false, GFP_KERNEL); -+ -+ return 0; -+} -+ -+/** -+ * virtsnd_enable_event_vq() - Enable the event virtqueue. -+ * @snd: VirtIO sound device. -+ * -+ * Context: Any context. -+ */ -+static void virtsnd_enable_event_vq(struct virtio_snd *snd) -+{ -+ struct virtio_snd_queue *queue = virtsnd_event_queue(snd); -+ -+ if (!virtqueue_enable_cb(queue->vqueue)) -+ virtsnd_event_notify_cb(queue->vqueue); -+} -+ -+/** -+ * virtsnd_disable_event_vq() - Disable the event virtqueue. -+ * @snd: VirtIO sound device. -+ * -+ * Context: Any context. -+ */ -+static void virtsnd_disable_event_vq(struct virtio_snd *snd) -+{ -+ struct virtio_snd_queue *queue = virtsnd_event_queue(snd); -+ struct virtio_snd_event *event; -+ u32 length; -+ unsigned long flags; -+ -+ if (queue->vqueue) { -+ spin_lock_irqsave(&queue->lock, flags); -+ virtqueue_disable_cb(queue->vqueue); -+ while ((event = virtqueue_get_buf(queue->vqueue, &length))) -+ virtsnd_event_dispatch(snd, event); -+ spin_unlock_irqrestore(&queue->lock, flags); -+ } -+} -+ -+/** -+ * virtsnd_build_devs() - Read configuration and build ALSA devices. -+ * @snd: VirtIO sound device. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_build_devs(struct virtio_snd *snd) -+{ -+ struct virtio_device *vdev = snd->vdev; -+ struct device *dev = &vdev->dev; -+ int rc; -+ -+ rc = snd_card_new(dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, -+ THIS_MODULE, 0, &snd->card); -+ if (rc < 0) -+ return rc; -+ -+ snd->card->private_data = snd; -+ -+ strscpy(snd->card->driver, VIRTIO_SND_CARD_DRIVER, -+ sizeof(snd->card->driver)); -+ strscpy(snd->card->shortname, VIRTIO_SND_CARD_NAME, -+ sizeof(snd->card->shortname)); -+ if (dev->parent->bus) -+ snprintf(snd->card->longname, sizeof(snd->card->longname), -+ VIRTIO_SND_CARD_NAME " at %s/%s/%s", -+ dev->parent->bus->name, dev_name(dev->parent), -+ dev_name(dev)); -+ else -+ snprintf(snd->card->longname, sizeof(snd->card->longname), -+ VIRTIO_SND_CARD_NAME " at %s/%s", -+ dev_name(dev->parent), dev_name(dev)); -+ -+ return snd_card_register(snd->card); -+} -+ -+/** -+ * virtsnd_validate() - Validate if the device can be started. -+ * @vdev: VirtIO parent device. -+ * -+ * Context: Any context. -+ * Return: 0 on success, -EINVAL on failure. -+ */ -+static int virtsnd_validate(struct virtio_device *vdev) -+{ -+ if (!vdev->config->get) { -+ dev_err(&vdev->dev, "configuration access disabled\n"); -+ return -EINVAL; -+ } -+ -+ if (!virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) { -+ dev_err(&vdev->dev, -+ "device does not comply with spec version 1.x\n"); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+/** -+ * virtsnd_probe() - Create and initialize the device. -+ * @vdev: VirtIO parent device. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_probe(struct virtio_device *vdev) -+{ -+ struct virtio_snd *snd; -+ unsigned int i; -+ int rc; -+ -+ snd = devm_kzalloc(&vdev->dev, sizeof(*snd), GFP_KERNEL); -+ if (!snd) -+ return -ENOMEM; -+ -+ snd->vdev = vdev; -+ -+ vdev->priv = snd; -+ -+ for (i = 0; i < VIRTIO_SND_VQ_MAX; ++i) -+ spin_lock_init(&snd->queues[i].lock); -+ -+ rc = virtsnd_find_vqs(snd); -+ if (rc) -+ goto on_exit; -+ -+ virtio_device_ready(vdev); -+ -+ rc = virtsnd_build_devs(snd); -+ if (rc) -+ goto on_exit; -+ -+ virtsnd_enable_event_vq(snd); -+ -+on_exit: -+ if (rc) -+ virtsnd_remove(vdev); -+ -+ return rc; -+} -+ -+/** -+ * virtsnd_remove() - Remove VirtIO and ALSA devices. -+ * @vdev: VirtIO parent device. -+ * -+ * Context: Any context that permits to sleep. -+ */ -+static void virtsnd_remove(struct virtio_device *vdev) -+{ -+ struct virtio_snd *snd = vdev->priv; -+ -+ virtsnd_disable_event_vq(snd); -+ -+ if (snd->card) -+ snd_card_free(snd->card); -+ -+ vdev->config->del_vqs(vdev); -+ vdev->config->reset(vdev); -+ -+ kfree(snd->event_msgs); -+} -+ -+static const struct virtio_device_id id_table[] = { -+ { VIRTIO_ID_SOUND, VIRTIO_DEV_ANY_ID }, -+ { 0 }, -+}; -+ -+static struct virtio_driver virtsnd_driver = { -+ .driver.name = KBUILD_MODNAME, -+ .driver.owner = THIS_MODULE, -+ .id_table = id_table, -+ .validate = virtsnd_validate, -+ .probe = virtsnd_probe, -+ .remove = virtsnd_remove, -+}; -+ -+static int __init init(void) -+{ -+ return register_virtio_driver(&virtsnd_driver); -+} -+module_init(init); -+ -+static void __exit fini(void) -+{ -+ unregister_virtio_driver(&virtsnd_driver); -+} -+module_exit(fini); -+ -+MODULE_DEVICE_TABLE(virtio, id_table); -+MODULE_DESCRIPTION("Virtio sound card driver"); -+MODULE_LICENSE("GPL"); -diff --git a/sound/virtio/virtio_card.h b/sound/virtio/virtio_card.h -new file mode 100644 -index 000000000000..b903b1b12e90 ---- /dev/null -+++ b/sound/virtio/virtio_card.h -@@ -0,0 +1,65 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ -+/* -+ * virtio-snd: Virtio sound device -+ * Copyright (C) 2021 OpenSynergy GmbH -+ */ -+#ifndef VIRTIO_SND_CARD_H -+#define VIRTIO_SND_CARD_H -+ -+#include <linux/slab.h> -+#include <linux/virtio.h> -+#include <sound/core.h> -+#include <uapi/linux/virtio_snd.h> -+ -+#define VIRTIO_SND_CARD_DRIVER "virtio-snd" -+#define VIRTIO_SND_CARD_NAME "VirtIO SoundCard" -+ -+/** -+ * struct virtio_snd_queue - Virtqueue wrapper structure. -+ * @lock: Used to synchronize access to a virtqueue. -+ * @vqueue: Underlying virtqueue. -+ */ -+struct virtio_snd_queue { -+ spinlock_t lock; -+ struct virtqueue *vqueue; -+}; -+ -+/** -+ * struct virtio_snd - VirtIO sound card device. -+ * @vdev: Underlying virtio device. -+ * @queues: Virtqueue wrappers. -+ * @card: ALSA sound card. -+ * @event_msgs: Device events. -+ */ -+struct virtio_snd { -+ struct virtio_device *vdev; -+ struct virtio_snd_queue queues[VIRTIO_SND_VQ_MAX]; -+ struct snd_card *card; -+ struct virtio_snd_event *event_msgs; -+}; -+ -+static inline struct virtio_snd_queue * -+virtsnd_control_queue(struct virtio_snd *snd) -+{ -+ return &snd->queues[VIRTIO_SND_VQ_CONTROL]; -+} -+ -+static inline struct virtio_snd_queue * -+virtsnd_event_queue(struct virtio_snd *snd) -+{ -+ return &snd->queues[VIRTIO_SND_VQ_EVENT]; -+} -+ -+static inline struct virtio_snd_queue * -+virtsnd_tx_queue(struct virtio_snd *snd) -+{ -+ return &snd->queues[VIRTIO_SND_VQ_TX]; -+} -+ -+static inline struct virtio_snd_queue * -+virtsnd_rx_queue(struct virtio_snd *snd) -+{ -+ return &snd->queues[VIRTIO_SND_VQ_RX]; -+} -+ -+#endif /* VIRTIO_SND_CARD_H */ diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0003-ALSA-virtio-handling-control-messages.patch b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0003-ALSA-virtio-handling-control-messages.patch deleted file mode 100644 index 2ee988a4a..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0003-ALSA-virtio-handling-control-messages.patch +++ /dev/null @@ -1,528 +0,0 @@ -From d4c8a3a4b9de5a25b6963f3ae1b8a5cb32081de5 Mon Sep 17 00:00:00 2001 -From: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Date: Tue, 2 Mar 2021 17:47:03 +0100 -Subject: [PATCH] ALSA: virtio: handling control messages - -The control queue can be used by different parts of the driver to send -commands to the device. Control messages can be either synchronous or -asynchronous. The lifetime of a message is controlled by a reference -count. - -Introduce a module parameter to set the message completion timeout: - msg_timeout_ms [=1000] - -Signed-off-by: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Link: https://lore.kernel.org/r/20210302164709.3142702-4-anton.yakovlev@opensynergy.com -Signed-off-by: Takashi Iwai <tiwai@suse.de> -Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com> ---- - sound/virtio/Makefile | 3 +- - sound/virtio/virtio_card.c | 13 ++ - sound/virtio/virtio_card.h | 7 + - sound/virtio/virtio_ctl_msg.c | 310 ++++++++++++++++++++++++++++++++++ - sound/virtio/virtio_ctl_msg.h | 78 +++++++++ - 5 files changed, 410 insertions(+), 1 deletion(-) - create mode 100644 sound/virtio/virtio_ctl_msg.c - create mode 100644 sound/virtio/virtio_ctl_msg.h - -diff --git a/sound/virtio/Makefile b/sound/virtio/Makefile -index 8c87ebb9982b..dc551e637441 100644 ---- a/sound/virtio/Makefile -+++ b/sound/virtio/Makefile -@@ -3,5 +3,6 @@ - obj-$(CONFIG_SND_VIRTIO) += virtio_snd.o - - virtio_snd-objs := \ -- virtio_card.o -+ virtio_card.o \ -+ virtio_ctl_msg.o - -diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c -index 5a37056858e9..b757b2444078 100644 ---- a/sound/virtio/virtio_card.c -+++ b/sound/virtio/virtio_card.c -@@ -11,6 +11,10 @@ - - #include "virtio_card.h" - -+u32 virtsnd_msg_timeout_ms = MSEC_PER_SEC; -+module_param_named(msg_timeout_ms, virtsnd_msg_timeout_ms, uint, 0644); -+MODULE_PARM_DESC(msg_timeout_ms, "Message completion timeout in milliseconds"); -+ - static void virtsnd_remove(struct virtio_device *vdev); - - /** -@@ -96,9 +100,11 @@ static int virtsnd_find_vqs(struct virtio_snd *snd) - { - struct virtio_device *vdev = snd->vdev; - static vq_callback_t *callbacks[VIRTIO_SND_VQ_MAX] = { -+ [VIRTIO_SND_VQ_CONTROL] = virtsnd_ctl_notify_cb, - [VIRTIO_SND_VQ_EVENT] = virtsnd_event_notify_cb - }; - static const char *names[VIRTIO_SND_VQ_MAX] = { -+ [VIRTIO_SND_VQ_CONTROL] = "virtsnd-ctl", - [VIRTIO_SND_VQ_EVENT] = "virtsnd-event" - }; - struct virtqueue *vqs[VIRTIO_SND_VQ_MAX] = { 0 }; -@@ -226,6 +232,11 @@ static int virtsnd_validate(struct virtio_device *vdev) - return -EINVAL; - } - -+ if (!virtsnd_msg_timeout_ms) { -+ dev_err(&vdev->dev, "msg_timeout_ms value cannot be zero\n"); -+ return -EINVAL; -+ } -+ - return 0; - } - -@@ -247,6 +258,7 @@ static int virtsnd_probe(struct virtio_device *vdev) - return -ENOMEM; - - snd->vdev = vdev; -+ INIT_LIST_HEAD(&snd->ctl_msgs); - - vdev->priv = snd; - -@@ -283,6 +295,7 @@ static void virtsnd_remove(struct virtio_device *vdev) - struct virtio_snd *snd = vdev->priv; - - virtsnd_disable_event_vq(snd); -+ virtsnd_ctl_msg_cancel_all(snd); - - if (snd->card) - snd_card_free(snd->card); -diff --git a/sound/virtio/virtio_card.h b/sound/virtio/virtio_card.h -index b903b1b12e90..1e76eeff160f 100644 ---- a/sound/virtio/virtio_card.h -+++ b/sound/virtio/virtio_card.h -@@ -11,6 +11,8 @@ - #include <sound/core.h> - #include <uapi/linux/virtio_snd.h> - -+#include "virtio_ctl_msg.h" -+ - #define VIRTIO_SND_CARD_DRIVER "virtio-snd" - #define VIRTIO_SND_CARD_NAME "VirtIO SoundCard" - -@@ -29,15 +31,20 @@ struct virtio_snd_queue { - * @vdev: Underlying virtio device. - * @queues: Virtqueue wrappers. - * @card: ALSA sound card. -+ * @ctl_msgs: Pending control request list. - * @event_msgs: Device events. - */ - struct virtio_snd { - struct virtio_device *vdev; - struct virtio_snd_queue queues[VIRTIO_SND_VQ_MAX]; - struct snd_card *card; -+ struct list_head ctl_msgs; - struct virtio_snd_event *event_msgs; - }; - -+/* Message completion timeout in milliseconds (module parameter). */ -+extern u32 virtsnd_msg_timeout_ms; -+ - static inline struct virtio_snd_queue * - virtsnd_control_queue(struct virtio_snd *snd) - { -diff --git a/sound/virtio/virtio_ctl_msg.c b/sound/virtio/virtio_ctl_msg.c -new file mode 100644 -index 000000000000..26ff7e7cc041 ---- /dev/null -+++ b/sound/virtio/virtio_ctl_msg.c -@@ -0,0 +1,310 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * virtio-snd: Virtio sound device -+ * Copyright (C) 2021 OpenSynergy GmbH -+ */ -+#include <linux/moduleparam.h> -+#include <linux/virtio_config.h> -+ -+#include "virtio_card.h" -+ -+/** -+ * struct virtio_snd_msg - Control message. -+ * @sg_request: Scattergather list containing a device request (header). -+ * @sg_response: Scattergather list containing a device response (status). -+ * @list: Pending message list entry. -+ * @notify: Request completed notification. -+ * @ref_count: Reference count used to manage a message lifetime. -+ */ -+struct virtio_snd_msg { -+ struct scatterlist sg_request; -+ struct scatterlist sg_response; -+ struct list_head list; -+ struct completion notify; -+ refcount_t ref_count; -+}; -+ -+/** -+ * virtsnd_ctl_msg_ref() - Increment reference counter for the message. -+ * @msg: Control message. -+ * -+ * Context: Any context. -+ */ -+void virtsnd_ctl_msg_ref(struct virtio_snd_msg *msg) -+{ -+ refcount_inc(&msg->ref_count); -+} -+ -+/** -+ * virtsnd_ctl_msg_unref() - Decrement reference counter for the message. -+ * @msg: Control message. -+ * -+ * The message will be freed when the ref_count value is 0. -+ * -+ * Context: Any context. -+ */ -+void virtsnd_ctl_msg_unref(struct virtio_snd_msg *msg) -+{ -+ if (refcount_dec_and_test(&msg->ref_count)) -+ kfree(msg); -+} -+ -+/** -+ * virtsnd_ctl_msg_request() - Get a pointer to the request header. -+ * @msg: Control message. -+ * -+ * Context: Any context. -+ */ -+void *virtsnd_ctl_msg_request(struct virtio_snd_msg *msg) -+{ -+ return sg_virt(&msg->sg_request); -+} -+ -+/** -+ * virtsnd_ctl_msg_request() - Get a pointer to the response header. -+ * @msg: Control message. -+ * -+ * Context: Any context. -+ */ -+void *virtsnd_ctl_msg_response(struct virtio_snd_msg *msg) -+{ -+ return sg_virt(&msg->sg_response); -+} -+ -+/** -+ * virtsnd_ctl_msg_alloc() - Allocate and initialize a control message. -+ * @request_size: Size of request header. -+ * @response_size: Size of response header. -+ * @gfp: Kernel flags for memory allocation. -+ * -+ * The message will be automatically freed when the ref_count value is 0. -+ * -+ * Context: Any context. May sleep if @gfp flags permit. -+ * Return: Allocated message on success, NULL on failure. -+ */ -+struct virtio_snd_msg *virtsnd_ctl_msg_alloc(size_t request_size, -+ size_t response_size, gfp_t gfp) -+{ -+ struct virtio_snd_msg *msg; -+ -+ if (!request_size || !response_size) -+ return NULL; -+ -+ msg = kzalloc(sizeof(*msg) + request_size + response_size, gfp); -+ if (!msg) -+ return NULL; -+ -+ sg_init_one(&msg->sg_request, (u8 *)msg + sizeof(*msg), request_size); -+ sg_init_one(&msg->sg_response, (u8 *)msg + sizeof(*msg) + request_size, -+ response_size); -+ -+ INIT_LIST_HEAD(&msg->list); -+ init_completion(&msg->notify); -+ /* This reference is dropped in virtsnd_ctl_msg_complete(). */ -+ refcount_set(&msg->ref_count, 1); -+ -+ return msg; -+} -+ -+/** -+ * virtsnd_ctl_msg_send() - Send a control message. -+ * @snd: VirtIO sound device. -+ * @msg: Control message. -+ * @out_sgs: Additional sg-list to attach to the request header (may be NULL). -+ * @in_sgs: Additional sg-list to attach to the response header (may be NULL). -+ * @nowait: Flag indicating whether to wait for completion. -+ * -+ * Context: Any context. Takes and releases the control queue spinlock. -+ * May sleep if @nowait is false. -+ * Return: 0 on success, -errno on failure. -+ */ -+int virtsnd_ctl_msg_send(struct virtio_snd *snd, struct virtio_snd_msg *msg, -+ struct scatterlist *out_sgs, -+ struct scatterlist *in_sgs, bool nowait) -+{ -+ struct virtio_device *vdev = snd->vdev; -+ struct virtio_snd_queue *queue = virtsnd_control_queue(snd); -+ unsigned int js = msecs_to_jiffies(virtsnd_msg_timeout_ms); -+ struct virtio_snd_hdr *request = virtsnd_ctl_msg_request(msg); -+ struct virtio_snd_hdr *response = virtsnd_ctl_msg_response(msg); -+ unsigned int nouts = 0; -+ unsigned int nins = 0; -+ struct scatterlist *psgs[4]; -+ bool notify = false; -+ unsigned long flags; -+ int rc; -+ -+ virtsnd_ctl_msg_ref(msg); -+ -+ /* Set the default status in case the message was canceled. */ -+ response->code = cpu_to_le32(VIRTIO_SND_S_IO_ERR); -+ -+ psgs[nouts++] = &msg->sg_request; -+ if (out_sgs) -+ psgs[nouts++] = out_sgs; -+ -+ psgs[nouts + nins++] = &msg->sg_response; -+ if (in_sgs) -+ psgs[nouts + nins++] = in_sgs; -+ -+ spin_lock_irqsave(&queue->lock, flags); -+ rc = virtqueue_add_sgs(queue->vqueue, psgs, nouts, nins, msg, -+ GFP_ATOMIC); -+ if (!rc) { -+ notify = virtqueue_kick_prepare(queue->vqueue); -+ -+ list_add_tail(&msg->list, &snd->ctl_msgs); -+ } -+ spin_unlock_irqrestore(&queue->lock, flags); -+ -+ if (rc) { -+ dev_err(&vdev->dev, "failed to send control message (0x%08x)\n", -+ le32_to_cpu(request->code)); -+ -+ /* -+ * Since in this case virtsnd_ctl_msg_complete() will not be -+ * called, it is necessary to decrement the reference count. -+ */ -+ virtsnd_ctl_msg_unref(msg); -+ -+ goto on_exit; -+ } -+ -+ if (notify) -+ virtqueue_notify(queue->vqueue); -+ -+ if (nowait) -+ goto on_exit; -+ -+ rc = wait_for_completion_interruptible_timeout(&msg->notify, js); -+ if (rc <= 0) { -+ if (!rc) { -+ dev_err(&vdev->dev, -+ "control message (0x%08x) timeout\n", -+ le32_to_cpu(request->code)); -+ rc = -ETIMEDOUT; -+ } -+ -+ goto on_exit; -+ } -+ -+ switch (le32_to_cpu(response->code)) { -+ case VIRTIO_SND_S_OK: -+ rc = 0; -+ break; -+ case VIRTIO_SND_S_NOT_SUPP: -+ rc = -EOPNOTSUPP; -+ break; -+ case VIRTIO_SND_S_IO_ERR: -+ rc = -EIO; -+ break; -+ default: -+ rc = -EINVAL; -+ break; -+ } -+ -+on_exit: -+ virtsnd_ctl_msg_unref(msg); -+ -+ return rc; -+} -+ -+/** -+ * virtsnd_ctl_msg_complete() - Complete a control message. -+ * @msg: Control message. -+ * -+ * Context: Any context. Expects the control queue spinlock to be held by -+ * caller. -+ */ -+void virtsnd_ctl_msg_complete(struct virtio_snd_msg *msg) -+{ -+ list_del(&msg->list); -+ complete(&msg->notify); -+ -+ virtsnd_ctl_msg_unref(msg); -+} -+ -+/** -+ * virtsnd_ctl_msg_cancel_all() - Cancel all pending control messages. -+ * @snd: VirtIO sound device. -+ * -+ * Context: Any context. -+ */ -+void virtsnd_ctl_msg_cancel_all(struct virtio_snd *snd) -+{ -+ struct virtio_snd_queue *queue = virtsnd_control_queue(snd); -+ unsigned long flags; -+ -+ spin_lock_irqsave(&queue->lock, flags); -+ while (!list_empty(&snd->ctl_msgs)) { -+ struct virtio_snd_msg *msg = -+ list_first_entry(&snd->ctl_msgs, struct virtio_snd_msg, -+ list); -+ -+ virtsnd_ctl_msg_complete(msg); -+ } -+ spin_unlock_irqrestore(&queue->lock, flags); -+} -+ -+/** -+ * virtsnd_ctl_query_info() - Query the item configuration from the device. -+ * @snd: VirtIO sound device. -+ * @command: Control request code (VIRTIO_SND_R_XXX_INFO). -+ * @start_id: Item start identifier. -+ * @count: Item count to query. -+ * @size: Item information size in bytes. -+ * @info: Buffer for storing item information. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: 0 on success, -errno on failure. -+ */ -+int virtsnd_ctl_query_info(struct virtio_snd *snd, int command, int start_id, -+ int count, size_t size, void *info) -+{ -+ struct virtio_snd_msg *msg; -+ struct virtio_snd_query_info *query; -+ struct scatterlist sg; -+ -+ msg = virtsnd_ctl_msg_alloc(sizeof(*query), -+ sizeof(struct virtio_snd_hdr), GFP_KERNEL); -+ if (!msg) -+ return -ENOMEM; -+ -+ query = virtsnd_ctl_msg_request(msg); -+ query->hdr.code = cpu_to_le32(command); -+ query->start_id = cpu_to_le32(start_id); -+ query->count = cpu_to_le32(count); -+ query->size = cpu_to_le32(size); -+ -+ sg_init_one(&sg, info, count * size); -+ -+ return virtsnd_ctl_msg_send(snd, msg, NULL, &sg, false); -+} -+ -+/** -+ * virtsnd_ctl_notify_cb() - Process all completed control messages. -+ * @vqueue: Underlying control virtqueue. -+ * -+ * This callback function is called upon a vring interrupt request from the -+ * device. -+ * -+ * Context: Interrupt context. Takes and releases the control queue spinlock. -+ */ -+void virtsnd_ctl_notify_cb(struct virtqueue *vqueue) -+{ -+ struct virtio_snd *snd = vqueue->vdev->priv; -+ struct virtio_snd_queue *queue = virtsnd_control_queue(snd); -+ struct virtio_snd_msg *msg; -+ u32 length; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&queue->lock, flags); -+ do { -+ virtqueue_disable_cb(vqueue); -+ while ((msg = virtqueue_get_buf(vqueue, &length))) -+ virtsnd_ctl_msg_complete(msg); -+ if (unlikely(virtqueue_is_broken(vqueue))) -+ break; -+ } while (!virtqueue_enable_cb(vqueue)); -+ spin_unlock_irqrestore(&queue->lock, flags); -+} -diff --git a/sound/virtio/virtio_ctl_msg.h b/sound/virtio/virtio_ctl_msg.h -new file mode 100644 -index 000000000000..7f4db044f28e ---- /dev/null -+++ b/sound/virtio/virtio_ctl_msg.h -@@ -0,0 +1,78 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ -+/* -+ * virtio-snd: Virtio sound device -+ * Copyright (C) 2021 OpenSynergy GmbH -+ */ -+#ifndef VIRTIO_SND_MSG_H -+#define VIRTIO_SND_MSG_H -+ -+#include <linux/atomic.h> -+#include <linux/virtio.h> -+ -+struct virtio_snd; -+struct virtio_snd_msg; -+ -+void virtsnd_ctl_msg_ref(struct virtio_snd_msg *msg); -+ -+void virtsnd_ctl_msg_unref(struct virtio_snd_msg *msg); -+ -+void *virtsnd_ctl_msg_request(struct virtio_snd_msg *msg); -+ -+void *virtsnd_ctl_msg_response(struct virtio_snd_msg *msg); -+ -+struct virtio_snd_msg *virtsnd_ctl_msg_alloc(size_t request_size, -+ size_t response_size, gfp_t gfp); -+ -+int virtsnd_ctl_msg_send(struct virtio_snd *snd, struct virtio_snd_msg *msg, -+ struct scatterlist *out_sgs, -+ struct scatterlist *in_sgs, bool nowait); -+ -+/** -+ * virtsnd_ctl_msg_send_sync() - Simplified sending of synchronous message. -+ * @snd: VirtIO sound device. -+ * @msg: Control message. -+ * -+ * After returning from this function, the message will be deleted. If message -+ * content is still needed, the caller must additionally to -+ * virtsnd_ctl_msg_ref/unref() it. -+ * -+ * The msg_timeout_ms module parameter defines the message completion timeout. -+ * If the message is not completed within this time, the function will return an -+ * error. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: 0 on success, -errno on failure. -+ * -+ * The return value is a message status code (VIRTIO_SND_S_XXX) converted to an -+ * appropriate -errno value. -+ */ -+static inline int virtsnd_ctl_msg_send_sync(struct virtio_snd *snd, -+ struct virtio_snd_msg *msg) -+{ -+ return virtsnd_ctl_msg_send(snd, msg, NULL, NULL, false); -+} -+ -+/** -+ * virtsnd_ctl_msg_send_async() - Simplified sending of asynchronous message. -+ * @snd: VirtIO sound device. -+ * @msg: Control message. -+ * -+ * Context: Any context. -+ * Return: 0 on success, -errno on failure. -+ */ -+static inline int virtsnd_ctl_msg_send_async(struct virtio_snd *snd, -+ struct virtio_snd_msg *msg) -+{ -+ return virtsnd_ctl_msg_send(snd, msg, NULL, NULL, true); -+} -+ -+void virtsnd_ctl_msg_cancel_all(struct virtio_snd *snd); -+ -+void virtsnd_ctl_msg_complete(struct virtio_snd_msg *msg); -+ -+int virtsnd_ctl_query_info(struct virtio_snd *snd, int command, int start_id, -+ int count, size_t size, void *info); -+ -+void virtsnd_ctl_notify_cb(struct virtqueue *vqueue); -+ -+#endif /* VIRTIO_SND_MSG_H */ diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0004-ALSA-virtio-build-PCM-devices-and-substream-hardware.patch b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0004-ALSA-virtio-build-PCM-devices-and-substream-hardware.patch deleted file mode 100644 index 27ae9a865..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0004-ALSA-virtio-build-PCM-devices-and-substream-hardware.patch +++ /dev/null @@ -1,703 +0,0 @@ -From 12e4e501f9662a02e61acb5966fdceeffb0ff16d Mon Sep 17 00:00:00 2001 -From: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Date: Tue, 2 Mar 2021 17:47:04 +0100 -Subject: [PATCH] ALSA: virtio: build PCM devices and substream hardware - descriptors - -Like the HDA specification, the virtio sound device specification links -PCM substreams, jacks and PCM channel maps into functional groups. For -each discovered group, a PCM device is created, the number of which -coincides with the group number. - -Introduce the module parameters for setting the hardware buffer -parameters: - pcm_buffer_ms [=160] - pcm_periods_min [=2] - pcm_periods_max [=16] - pcm_period_ms_min [=10] - pcm_period_ms_max [=80] - -Signed-off-by: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Link: https://lore.kernel.org/r/20210302164709.3142702-5-anton.yakovlev@opensynergy.com -Signed-off-by: Takashi Iwai <tiwai@suse.de> -Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com> ---- - sound/virtio/Makefile | 3 +- - sound/virtio/virtio_card.c | 18 ++ - sound/virtio/virtio_card.h | 10 + - sound/virtio/virtio_pcm.c | 479 +++++++++++++++++++++++++++++++++++++ - sound/virtio/virtio_pcm.h | 72 ++++++ - 5 files changed, 581 insertions(+), 1 deletion(-) - create mode 100644 sound/virtio/virtio_pcm.c - create mode 100644 sound/virtio/virtio_pcm.h - -diff --git a/sound/virtio/Makefile b/sound/virtio/Makefile -index dc551e637441..69162a545a41 100644 ---- a/sound/virtio/Makefile -+++ b/sound/virtio/Makefile -@@ -4,5 +4,6 @@ obj-$(CONFIG_SND_VIRTIO) += virtio_snd.o - - virtio_snd-objs := \ - virtio_card.o \ -- virtio_ctl_msg.o -+ virtio_ctl_msg.o \ -+ virtio_pcm.o - -diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c -index b757b2444078..11c76ee311b7 100644 ---- a/sound/virtio/virtio_card.c -+++ b/sound/virtio/virtio_card.c -@@ -209,6 +209,16 @@ static int virtsnd_build_devs(struct virtio_snd *snd) - VIRTIO_SND_CARD_NAME " at %s/%s", - dev_name(dev->parent), dev_name(dev)); - -+ rc = virtsnd_pcm_parse_cfg(snd); -+ if (rc) -+ return rc; -+ -+ if (snd->nsubstreams) { -+ rc = virtsnd_pcm_build_devs(snd); -+ if (rc) -+ return rc; -+ } -+ - return snd_card_register(snd->card); - } - -@@ -237,6 +247,9 @@ static int virtsnd_validate(struct virtio_device *vdev) - return -EINVAL; - } - -+ if (virtsnd_pcm_validate(vdev)) -+ return -EINVAL; -+ - return 0; - } - -@@ -259,6 +272,7 @@ static int virtsnd_probe(struct virtio_device *vdev) - - snd->vdev = vdev; - INIT_LIST_HEAD(&snd->ctl_msgs); -+ INIT_LIST_HEAD(&snd->pcm_list); - - vdev->priv = snd; - -@@ -293,6 +307,7 @@ static int virtsnd_probe(struct virtio_device *vdev) - static void virtsnd_remove(struct virtio_device *vdev) - { - struct virtio_snd *snd = vdev->priv; -+ unsigned int i; - - virtsnd_disable_event_vq(snd); - virtsnd_ctl_msg_cancel_all(snd); -@@ -303,6 +318,9 @@ static void virtsnd_remove(struct virtio_device *vdev) - vdev->config->del_vqs(vdev); - vdev->config->reset(vdev); - -+ for (i = 0; snd->substreams && i < snd->nsubstreams; ++i) -+ cancel_work_sync(&snd->substreams[i].elapsed_period); -+ - kfree(snd->event_msgs); - } - -diff --git a/sound/virtio/virtio_card.h b/sound/virtio/virtio_card.h -index 1e76eeff160f..77a1b7255370 100644 ---- a/sound/virtio/virtio_card.h -+++ b/sound/virtio/virtio_card.h -@@ -12,9 +12,13 @@ - #include <uapi/linux/virtio_snd.h> - - #include "virtio_ctl_msg.h" -+#include "virtio_pcm.h" - - #define VIRTIO_SND_CARD_DRIVER "virtio-snd" - #define VIRTIO_SND_CARD_NAME "VirtIO SoundCard" -+#define VIRTIO_SND_PCM_NAME "VirtIO PCM" -+ -+struct virtio_pcm_substream; - - /** - * struct virtio_snd_queue - Virtqueue wrapper structure. -@@ -33,6 +37,9 @@ struct virtio_snd_queue { - * @card: ALSA sound card. - * @ctl_msgs: Pending control request list. - * @event_msgs: Device events. -+ * @pcm_list: VirtIO PCM device list. -+ * @substreams: VirtIO PCM substreams. -+ * @nsubstreams: Number of PCM substreams. - */ - struct virtio_snd { - struct virtio_device *vdev; -@@ -40,6 +47,9 @@ struct virtio_snd { - struct snd_card *card; - struct list_head ctl_msgs; - struct virtio_snd_event *event_msgs; -+ struct list_head pcm_list; -+ struct virtio_pcm_substream *substreams; -+ u32 nsubstreams; - }; - - /* Message completion timeout in milliseconds (module parameter). */ -diff --git a/sound/virtio/virtio_pcm.c b/sound/virtio/virtio_pcm.c -new file mode 100644 -index 000000000000..e16567e2e214 ---- /dev/null -+++ b/sound/virtio/virtio_pcm.c -@@ -0,0 +1,479 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * virtio-snd: Virtio sound device -+ * Copyright (C) 2021 OpenSynergy GmbH -+ */ -+#include <linux/moduleparam.h> -+#include <linux/virtio_config.h> -+ -+#include "virtio_card.h" -+ -+static u32 pcm_buffer_ms = 160; -+module_param(pcm_buffer_ms, uint, 0644); -+MODULE_PARM_DESC(pcm_buffer_ms, "PCM substream buffer time in milliseconds"); -+ -+static u32 pcm_periods_min = 2; -+module_param(pcm_periods_min, uint, 0644); -+MODULE_PARM_DESC(pcm_periods_min, "Minimum number of PCM periods"); -+ -+static u32 pcm_periods_max = 16; -+module_param(pcm_periods_max, uint, 0644); -+MODULE_PARM_DESC(pcm_periods_max, "Maximum number of PCM periods"); -+ -+static u32 pcm_period_ms_min = 10; -+module_param(pcm_period_ms_min, uint, 0644); -+MODULE_PARM_DESC(pcm_period_ms_min, "Minimum PCM period time in milliseconds"); -+ -+static u32 pcm_period_ms_max = 80; -+module_param(pcm_period_ms_max, uint, 0644); -+MODULE_PARM_DESC(pcm_period_ms_max, "Maximum PCM period time in milliseconds"); -+ -+/* Map for converting VirtIO format to ALSA format. */ -+static const snd_pcm_format_t g_v2a_format_map[] = { -+ [VIRTIO_SND_PCM_FMT_IMA_ADPCM] = SNDRV_PCM_FORMAT_IMA_ADPCM, -+ [VIRTIO_SND_PCM_FMT_MU_LAW] = SNDRV_PCM_FORMAT_MU_LAW, -+ [VIRTIO_SND_PCM_FMT_A_LAW] = SNDRV_PCM_FORMAT_A_LAW, -+ [VIRTIO_SND_PCM_FMT_S8] = SNDRV_PCM_FORMAT_S8, -+ [VIRTIO_SND_PCM_FMT_U8] = SNDRV_PCM_FORMAT_U8, -+ [VIRTIO_SND_PCM_FMT_S16] = SNDRV_PCM_FORMAT_S16_LE, -+ [VIRTIO_SND_PCM_FMT_U16] = SNDRV_PCM_FORMAT_U16_LE, -+ [VIRTIO_SND_PCM_FMT_S18_3] = SNDRV_PCM_FORMAT_S18_3LE, -+ [VIRTIO_SND_PCM_FMT_U18_3] = SNDRV_PCM_FORMAT_U18_3LE, -+ [VIRTIO_SND_PCM_FMT_S20_3] = SNDRV_PCM_FORMAT_S20_3LE, -+ [VIRTIO_SND_PCM_FMT_U20_3] = SNDRV_PCM_FORMAT_U20_3LE, -+ [VIRTIO_SND_PCM_FMT_S24_3] = SNDRV_PCM_FORMAT_S24_3LE, -+ [VIRTIO_SND_PCM_FMT_U24_3] = SNDRV_PCM_FORMAT_U24_3LE, -+ [VIRTIO_SND_PCM_FMT_S20] = SNDRV_PCM_FORMAT_S20_LE, -+ [VIRTIO_SND_PCM_FMT_U20] = SNDRV_PCM_FORMAT_U20_LE, -+ [VIRTIO_SND_PCM_FMT_S24] = SNDRV_PCM_FORMAT_S24_LE, -+ [VIRTIO_SND_PCM_FMT_U24] = SNDRV_PCM_FORMAT_U24_LE, -+ [VIRTIO_SND_PCM_FMT_S32] = SNDRV_PCM_FORMAT_S32_LE, -+ [VIRTIO_SND_PCM_FMT_U32] = SNDRV_PCM_FORMAT_U32_LE, -+ [VIRTIO_SND_PCM_FMT_FLOAT] = SNDRV_PCM_FORMAT_FLOAT_LE, -+ [VIRTIO_SND_PCM_FMT_FLOAT64] = SNDRV_PCM_FORMAT_FLOAT64_LE, -+ [VIRTIO_SND_PCM_FMT_DSD_U8] = SNDRV_PCM_FORMAT_DSD_U8, -+ [VIRTIO_SND_PCM_FMT_DSD_U16] = SNDRV_PCM_FORMAT_DSD_U16_LE, -+ [VIRTIO_SND_PCM_FMT_DSD_U32] = SNDRV_PCM_FORMAT_DSD_U32_LE, -+ [VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME] = -+ SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE -+}; -+ -+/* Map for converting VirtIO frame rate to ALSA frame rate. */ -+struct virtsnd_v2a_rate { -+ unsigned int alsa_bit; -+ unsigned int rate; -+}; -+ -+static const struct virtsnd_v2a_rate g_v2a_rate_map[] = { -+ [VIRTIO_SND_PCM_RATE_5512] = { SNDRV_PCM_RATE_5512, 5512 }, -+ [VIRTIO_SND_PCM_RATE_8000] = { SNDRV_PCM_RATE_8000, 8000 }, -+ [VIRTIO_SND_PCM_RATE_11025] = { SNDRV_PCM_RATE_11025, 11025 }, -+ [VIRTIO_SND_PCM_RATE_16000] = { SNDRV_PCM_RATE_16000, 16000 }, -+ [VIRTIO_SND_PCM_RATE_22050] = { SNDRV_PCM_RATE_22050, 22050 }, -+ [VIRTIO_SND_PCM_RATE_32000] = { SNDRV_PCM_RATE_32000, 32000 }, -+ [VIRTIO_SND_PCM_RATE_44100] = { SNDRV_PCM_RATE_44100, 44100 }, -+ [VIRTIO_SND_PCM_RATE_48000] = { SNDRV_PCM_RATE_48000, 48000 }, -+ [VIRTIO_SND_PCM_RATE_64000] = { SNDRV_PCM_RATE_64000, 64000 }, -+ [VIRTIO_SND_PCM_RATE_88200] = { SNDRV_PCM_RATE_88200, 88200 }, -+ [VIRTIO_SND_PCM_RATE_96000] = { SNDRV_PCM_RATE_96000, 96000 }, -+ [VIRTIO_SND_PCM_RATE_176400] = { SNDRV_PCM_RATE_176400, 176400 }, -+ [VIRTIO_SND_PCM_RATE_192000] = { SNDRV_PCM_RATE_192000, 192000 } -+}; -+ -+/** -+ * virtsnd_pcm_build_hw() - Parse substream config and build HW descriptor. -+ * @vss: VirtIO substream. -+ * @info: VirtIO substream information entry. -+ * -+ * Context: Any context. -+ * Return: 0 on success, -EINVAL if configuration is invalid. -+ */ -+static int virtsnd_pcm_build_hw(struct virtio_pcm_substream *vss, -+ struct virtio_snd_pcm_info *info) -+{ -+ struct virtio_device *vdev = vss->snd->vdev; -+ unsigned int i; -+ u64 values; -+ size_t sample_max = 0; -+ size_t sample_min = 0; -+ -+ vss->features = le32_to_cpu(info->features); -+ -+ /* -+ * TODO: set SNDRV_PCM_INFO_{BATCH,BLOCK_TRANSFER} if device supports -+ * only message-based transport. -+ */ -+ vss->hw.info = -+ SNDRV_PCM_INFO_MMAP | -+ SNDRV_PCM_INFO_MMAP_VALID | -+ SNDRV_PCM_INFO_BATCH | -+ SNDRV_PCM_INFO_BLOCK_TRANSFER | -+ SNDRV_PCM_INFO_INTERLEAVED | -+ SNDRV_PCM_INFO_PAUSE; -+ -+ if (!info->channels_min || info->channels_min > info->channels_max) { -+ dev_err(&vdev->dev, -+ "SID %u: invalid channel range [%u %u]\n", -+ vss->sid, info->channels_min, info->channels_max); -+ return -EINVAL; -+ } -+ -+ vss->hw.channels_min = info->channels_min; -+ vss->hw.channels_max = info->channels_max; -+ -+ values = le64_to_cpu(info->formats); -+ -+ vss->hw.formats = 0; -+ -+ for (i = 0; i < ARRAY_SIZE(g_v2a_format_map); ++i) -+ if (values & (1ULL << i)) { -+ snd_pcm_format_t alsa_fmt = g_v2a_format_map[i]; -+ int bytes = snd_pcm_format_physical_width(alsa_fmt) / 8; -+ -+ if (!sample_min || sample_min > bytes) -+ sample_min = bytes; -+ -+ if (sample_max < bytes) -+ sample_max = bytes; -+ -+ vss->hw.formats |= pcm_format_to_bits(alsa_fmt); -+ } -+ -+ if (!vss->hw.formats) { -+ dev_err(&vdev->dev, -+ "SID %u: no supported PCM sample formats found\n", -+ vss->sid); -+ return -EINVAL; -+ } -+ -+ values = le64_to_cpu(info->rates); -+ -+ vss->hw.rates = 0; -+ -+ for (i = 0; i < ARRAY_SIZE(g_v2a_rate_map); ++i) -+ if (values & (1ULL << i)) { -+ if (!vss->hw.rate_min || -+ vss->hw.rate_min > g_v2a_rate_map[i].rate) -+ vss->hw.rate_min = g_v2a_rate_map[i].rate; -+ -+ if (vss->hw.rate_max < g_v2a_rate_map[i].rate) -+ vss->hw.rate_max = g_v2a_rate_map[i].rate; -+ -+ vss->hw.rates |= g_v2a_rate_map[i].alsa_bit; -+ } -+ -+ if (!vss->hw.rates) { -+ dev_err(&vdev->dev, -+ "SID %u: no supported PCM frame rates found\n", -+ vss->sid); -+ return -EINVAL; -+ } -+ -+ vss->hw.periods_min = pcm_periods_min; -+ vss->hw.periods_max = pcm_periods_max; -+ -+ /* -+ * We must ensure that there is enough space in the buffer to store -+ * pcm_buffer_ms ms for the combination (Cmax, Smax, Rmax), where: -+ * Cmax = maximum supported number of channels, -+ * Smax = maximum supported sample size in bytes, -+ * Rmax = maximum supported frame rate. -+ */ -+ vss->hw.buffer_bytes_max = -+ PAGE_ALIGN(sample_max * vss->hw.channels_max * pcm_buffer_ms * -+ (vss->hw.rate_max / MSEC_PER_SEC)); -+ -+ /* -+ * We must ensure that the minimum period size is enough to store -+ * pcm_period_ms_min ms for the combination (Cmin, Smin, Rmin), where: -+ * Cmin = minimum supported number of channels, -+ * Smin = minimum supported sample size in bytes, -+ * Rmin = minimum supported frame rate. -+ */ -+ vss->hw.period_bytes_min = -+ sample_min * vss->hw.channels_min * pcm_period_ms_min * -+ (vss->hw.rate_min / MSEC_PER_SEC); -+ -+ /* -+ * We must ensure that the maximum period size is enough to store -+ * pcm_period_ms_max ms for the combination (Cmax, Smax, Rmax). -+ */ -+ vss->hw.period_bytes_max = -+ sample_max * vss->hw.channels_max * pcm_period_ms_max * -+ (vss->hw.rate_max / MSEC_PER_SEC); -+ -+ return 0; -+} -+ -+/** -+ * virtsnd_pcm_find() - Find the PCM device for the specified node ID. -+ * @snd: VirtIO sound device. -+ * @nid: Function node ID. -+ * -+ * Context: Any context. -+ * Return: a pointer to the PCM device or ERR_PTR(-ENOENT). -+ */ -+struct virtio_pcm *virtsnd_pcm_find(struct virtio_snd *snd, u32 nid) -+{ -+ struct virtio_pcm *vpcm; -+ -+ list_for_each_entry(vpcm, &snd->pcm_list, list) -+ if (vpcm->nid == nid) -+ return vpcm; -+ -+ return ERR_PTR(-ENOENT); -+} -+ -+/** -+ * virtsnd_pcm_find_or_create() - Find or create the PCM device for the -+ * specified node ID. -+ * @snd: VirtIO sound device. -+ * @nid: Function node ID. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: a pointer to the PCM device or ERR_PTR(-errno). -+ */ -+struct virtio_pcm *virtsnd_pcm_find_or_create(struct virtio_snd *snd, u32 nid) -+{ -+ struct virtio_device *vdev = snd->vdev; -+ struct virtio_pcm *vpcm; -+ -+ vpcm = virtsnd_pcm_find(snd, nid); -+ if (!IS_ERR(vpcm)) -+ return vpcm; -+ -+ vpcm = devm_kzalloc(&vdev->dev, sizeof(*vpcm), GFP_KERNEL); -+ if (!vpcm) -+ return ERR_PTR(-ENOMEM); -+ -+ vpcm->nid = nid; -+ list_add_tail(&vpcm->list, &snd->pcm_list); -+ -+ return vpcm; -+} -+ -+/** -+ * virtsnd_pcm_validate() - Validate if the device can be started. -+ * @vdev: VirtIO parent device. -+ * -+ * Context: Any context. -+ * Return: 0 on success, -EINVAL on failure. -+ */ -+int virtsnd_pcm_validate(struct virtio_device *vdev) -+{ -+ if (pcm_periods_min < 2 || pcm_periods_min > pcm_periods_max) { -+ dev_err(&vdev->dev, -+ "invalid range [%u %u] of the number of PCM periods\n", -+ pcm_periods_min, pcm_periods_max); -+ return -EINVAL; -+ } -+ -+ if (!pcm_period_ms_min || pcm_period_ms_min > pcm_period_ms_max) { -+ dev_err(&vdev->dev, -+ "invalid range [%u %u] of the size of the PCM period\n", -+ pcm_period_ms_min, pcm_period_ms_max); -+ return -EINVAL; -+ } -+ -+ if (pcm_buffer_ms < pcm_periods_min * pcm_period_ms_min) { -+ dev_err(&vdev->dev, -+ "pcm_buffer_ms(=%u) value cannot be < %u ms\n", -+ pcm_buffer_ms, pcm_periods_min * pcm_period_ms_min); -+ return -EINVAL; -+ } -+ -+ if (pcm_period_ms_max > pcm_buffer_ms / 2) { -+ dev_err(&vdev->dev, -+ "pcm_period_ms_max(=%u) value cannot be > %u ms\n", -+ pcm_period_ms_max, pcm_buffer_ms / 2); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+/** -+ * virtsnd_pcm_period_elapsed() - Kernel work function to handle the elapsed -+ * period state. -+ * @work: Elapsed period work. -+ * -+ * The main purpose of this function is to call snd_pcm_period_elapsed() in -+ * a process context, not in an interrupt context. This is necessary because PCM -+ * devices operate in non-atomic mode. -+ * -+ * Context: Process context. -+ */ -+static void virtsnd_pcm_period_elapsed(struct work_struct *work) -+{ -+ struct virtio_pcm_substream *vss = -+ container_of(work, struct virtio_pcm_substream, elapsed_period); -+ -+ snd_pcm_period_elapsed(vss->substream); -+} -+ -+/** -+ * virtsnd_pcm_parse_cfg() - Parse the stream configuration. -+ * @snd: VirtIO sound device. -+ * -+ * This function is called during initial device initialization. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: 0 on success, -errno on failure. -+ */ -+int virtsnd_pcm_parse_cfg(struct virtio_snd *snd) -+{ -+ struct virtio_device *vdev = snd->vdev; -+ struct virtio_snd_pcm_info *info; -+ u32 i; -+ int rc; -+ -+ virtio_cread_le(vdev, struct virtio_snd_config, streams, -+ &snd->nsubstreams); -+ if (!snd->nsubstreams) -+ return 0; -+ -+ snd->substreams = devm_kcalloc(&vdev->dev, snd->nsubstreams, -+ sizeof(*snd->substreams), GFP_KERNEL); -+ if (!snd->substreams) -+ return -ENOMEM; -+ -+ info = kcalloc(snd->nsubstreams, sizeof(*info), GFP_KERNEL); -+ if (!info) -+ return -ENOMEM; -+ -+ rc = virtsnd_ctl_query_info(snd, VIRTIO_SND_R_PCM_INFO, 0, -+ snd->nsubstreams, sizeof(*info), info); -+ if (rc) -+ goto on_exit; -+ -+ for (i = 0; i < snd->nsubstreams; ++i) { -+ struct virtio_pcm_substream *vss = &snd->substreams[i]; -+ struct virtio_pcm *vpcm; -+ -+ vss->snd = snd; -+ vss->sid = i; -+ INIT_WORK(&vss->elapsed_period, virtsnd_pcm_period_elapsed); -+ -+ rc = virtsnd_pcm_build_hw(vss, &info[i]); -+ if (rc) -+ goto on_exit; -+ -+ vss->nid = le32_to_cpu(info[i].hdr.hda_fn_nid); -+ -+ vpcm = virtsnd_pcm_find_or_create(snd, vss->nid); -+ if (IS_ERR(vpcm)) { -+ rc = PTR_ERR(vpcm); -+ goto on_exit; -+ } -+ -+ switch (info[i].direction) { -+ case VIRTIO_SND_D_OUTPUT: -+ vss->direction = SNDRV_PCM_STREAM_PLAYBACK; -+ break; -+ case VIRTIO_SND_D_INPUT: -+ vss->direction = SNDRV_PCM_STREAM_CAPTURE; -+ break; -+ default: -+ dev_err(&vdev->dev, "SID %u: unknown direction (%u)\n", -+ vss->sid, info[i].direction); -+ rc = -EINVAL; -+ goto on_exit; -+ } -+ -+ vpcm->streams[vss->direction].nsubstreams++; -+ } -+ -+on_exit: -+ kfree(info); -+ -+ return rc; -+} -+ -+/** -+ * virtsnd_pcm_build_devs() - Build ALSA PCM devices. -+ * @snd: VirtIO sound device. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: 0 on success, -errno on failure. -+ */ -+int virtsnd_pcm_build_devs(struct virtio_snd *snd) -+{ -+ struct virtio_device *vdev = snd->vdev; -+ struct virtio_pcm *vpcm; -+ u32 i; -+ int rc; -+ -+ list_for_each_entry(vpcm, &snd->pcm_list, list) { -+ unsigned int npbs = -+ vpcm->streams[SNDRV_PCM_STREAM_PLAYBACK].nsubstreams; -+ unsigned int ncps = -+ vpcm->streams[SNDRV_PCM_STREAM_CAPTURE].nsubstreams; -+ -+ if (!npbs && !ncps) -+ continue; -+ -+ rc = snd_pcm_new(snd->card, VIRTIO_SND_CARD_DRIVER, vpcm->nid, -+ npbs, ncps, &vpcm->pcm); -+ if (rc) { -+ dev_err(&vdev->dev, "snd_pcm_new[%u] failed: %d\n", -+ vpcm->nid, rc); -+ return rc; -+ } -+ -+ vpcm->pcm->info_flags = 0; -+ vpcm->pcm->dev_class = SNDRV_PCM_CLASS_GENERIC; -+ vpcm->pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX; -+ snprintf(vpcm->pcm->name, sizeof(vpcm->pcm->name), -+ VIRTIO_SND_PCM_NAME " %u", vpcm->pcm->device); -+ vpcm->pcm->private_data = vpcm; -+ vpcm->pcm->nonatomic = true; -+ -+ for (i = 0; i < ARRAY_SIZE(vpcm->streams); ++i) { -+ struct virtio_pcm_stream *stream = &vpcm->streams[i]; -+ -+ if (!stream->nsubstreams) -+ continue; -+ -+ stream->substreams = -+ devm_kcalloc(&vdev->dev, stream->nsubstreams, -+ sizeof(*stream->substreams), -+ GFP_KERNEL); -+ if (!stream->substreams) -+ return -ENOMEM; -+ -+ stream->nsubstreams = 0; -+ } -+ } -+ -+ for (i = 0; i < snd->nsubstreams; ++i) { -+ struct virtio_pcm_stream *vs; -+ struct virtio_pcm_substream *vss = &snd->substreams[i]; -+ -+ vpcm = virtsnd_pcm_find(snd, vss->nid); -+ if (IS_ERR(vpcm)) -+ return PTR_ERR(vpcm); -+ -+ vs = &vpcm->streams[vss->direction]; -+ vs->substreams[vs->nsubstreams++] = vss; -+ } -+ -+ list_for_each_entry(vpcm, &snd->pcm_list, list) { -+ for (i = 0; i < ARRAY_SIZE(vpcm->streams); ++i) { -+ struct virtio_pcm_stream *vs = &vpcm->streams[i]; -+ struct snd_pcm_str *ks = &vpcm->pcm->streams[i]; -+ struct snd_pcm_substream *kss; -+ -+ if (!vs->nsubstreams) -+ continue; -+ -+ for (kss = ks->substream; kss; kss = kss->next) -+ vs->substreams[kss->number]->substream = kss; -+ } -+ -+ snd_pcm_set_managed_buffer_all(vpcm->pcm, -+ SNDRV_DMA_TYPE_VMALLOC, NULL, -+ 0, 0); -+ } -+ -+ return 0; -+} -diff --git a/sound/virtio/virtio_pcm.h b/sound/virtio/virtio_pcm.h -new file mode 100644 -index 000000000000..84f2f3f14f48 ---- /dev/null -+++ b/sound/virtio/virtio_pcm.h -@@ -0,0 +1,72 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ -+/* -+ * virtio-snd: Virtio sound device -+ * Copyright (C) 2021 OpenSynergy GmbH -+ */ -+#ifndef VIRTIO_SND_PCM_H -+#define VIRTIO_SND_PCM_H -+ -+#include <linux/atomic.h> -+#include <linux/virtio_config.h> -+#include <sound/pcm.h> -+ -+struct virtio_pcm; -+struct virtio_pcm_msg; -+ -+/** -+ * struct virtio_pcm_substream - VirtIO PCM substream. -+ * @snd: VirtIO sound device. -+ * @nid: Function group node identifier. -+ * @sid: Stream identifier. -+ * @direction: Stream data flow direction (SNDRV_PCM_STREAM_XXX). -+ * @features: Stream VirtIO feature bit map (1 << VIRTIO_SND_PCM_F_XXX). -+ * @substream: Kernel ALSA substream. -+ * @hw: Kernel ALSA substream hardware descriptor. -+ * @elapsed_period: Kernel work to handle the elapsed period state. -+ */ -+struct virtio_pcm_substream { -+ struct virtio_snd *snd; -+ u32 nid; -+ u32 sid; -+ u32 direction; -+ u32 features; -+ struct snd_pcm_substream *substream; -+ struct snd_pcm_hardware hw; -+ struct work_struct elapsed_period; -+}; -+ -+/** -+ * struct virtio_pcm_stream - VirtIO PCM stream. -+ * @substreams: VirtIO substreams belonging to the stream. -+ * @nsubstreams: Number of substreams. -+ */ -+struct virtio_pcm_stream { -+ struct virtio_pcm_substream **substreams; -+ u32 nsubstreams; -+}; -+ -+/** -+ * struct virtio_pcm - VirtIO PCM device. -+ * @list: VirtIO PCM list entry. -+ * @nid: Function group node identifier. -+ * @pcm: Kernel PCM device. -+ * @streams: VirtIO PCM streams (playback and capture). -+ */ -+struct virtio_pcm { -+ struct list_head list; -+ u32 nid; -+ struct snd_pcm *pcm; -+ struct virtio_pcm_stream streams[SNDRV_PCM_STREAM_LAST + 1]; -+}; -+ -+int virtsnd_pcm_validate(struct virtio_device *vdev); -+ -+int virtsnd_pcm_parse_cfg(struct virtio_snd *snd); -+ -+int virtsnd_pcm_build_devs(struct virtio_snd *snd); -+ -+struct virtio_pcm *virtsnd_pcm_find(struct virtio_snd *snd, u32 nid); -+ -+struct virtio_pcm *virtsnd_pcm_find_or_create(struct virtio_snd *snd, u32 nid); -+ -+#endif /* VIRTIO_SND_PCM_H */ diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0005-ALSA-virtio-handling-control-and-I-O-messages-for-th.patch b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0005-ALSA-virtio-handling-control-and-I-O-messages-for-th.patch deleted file mode 100644 index 3a63a530b..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0005-ALSA-virtio-handling-control-and-I-O-messages-for-th.patch +++ /dev/null @@ -1,645 +0,0 @@ -From e60175c8c7a51861c6f31af4cf99b95f3da7a59f Mon Sep 17 00:00:00 2001 -From: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Date: Tue, 2 Mar 2021 17:47:05 +0100 -Subject: [PATCH] ALSA: virtio: handling control and I/O messages for the PCM - device - -The driver implements a message-based transport for I/O substream -operations. Before the start of the substream, the hardware buffer is -sliced into I/O messages, the number of which is equal to the current -number of periods. The size of each message is equal to the current -size of one period. - -I/O messages are organized in an ordered queue. The completion of the -I/O message indicates an elapsed period (the only exception is the end -of the stream for the capture substream). Upon completion, the message -is automatically re-added to the end of the queue. - -Signed-off-by: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Link: https://lore.kernel.org/r/20210302164709.3142702-6-anton.yakovlev@opensynergy.com -Signed-off-by: Takashi Iwai <tiwai@suse.de> -Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com> ---- - sound/virtio/Makefile | 3 +- - sound/virtio/virtio_card.c | 22 +- - sound/virtio/virtio_card.h | 9 + - sound/virtio/virtio_pcm.c | 32 +++ - sound/virtio/virtio_pcm.h | 40 ++++ - sound/virtio/virtio_pcm_msg.c | 414 ++++++++++++++++++++++++++++++++++ - 6 files changed, 515 insertions(+), 5 deletions(-) - create mode 100644 sound/virtio/virtio_pcm_msg.c - -diff --git a/sound/virtio/Makefile b/sound/virtio/Makefile -index 69162a545a41..626af3cc3ed7 100644 ---- a/sound/virtio/Makefile -+++ b/sound/virtio/Makefile -@@ -5,5 +5,6 @@ obj-$(CONFIG_SND_VIRTIO) += virtio_snd.o - virtio_snd-objs := \ - virtio_card.o \ - virtio_ctl_msg.o \ -- virtio_pcm.o -+ virtio_pcm.o \ -+ virtio_pcm_msg.o - -diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c -index 11c76ee311b7..57b9b7f3a9c0 100644 ---- a/sound/virtio/virtio_card.c -+++ b/sound/virtio/virtio_card.c -@@ -55,6 +55,12 @@ static void virtsnd_event_send(struct virtqueue *vqueue, - static void virtsnd_event_dispatch(struct virtio_snd *snd, - struct virtio_snd_event *event) - { -+ switch (le32_to_cpu(event->hdr.code)) { -+ case VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED: -+ case VIRTIO_SND_EVT_PCM_XRUN: -+ virtsnd_pcm_event(snd, event); -+ break; -+ } - } - - /** -@@ -101,11 +107,15 @@ static int virtsnd_find_vqs(struct virtio_snd *snd) - struct virtio_device *vdev = snd->vdev; - static vq_callback_t *callbacks[VIRTIO_SND_VQ_MAX] = { - [VIRTIO_SND_VQ_CONTROL] = virtsnd_ctl_notify_cb, -- [VIRTIO_SND_VQ_EVENT] = virtsnd_event_notify_cb -+ [VIRTIO_SND_VQ_EVENT] = virtsnd_event_notify_cb, -+ [VIRTIO_SND_VQ_TX] = virtsnd_pcm_tx_notify_cb, -+ [VIRTIO_SND_VQ_RX] = virtsnd_pcm_rx_notify_cb - }; - static const char *names[VIRTIO_SND_VQ_MAX] = { - [VIRTIO_SND_VQ_CONTROL] = "virtsnd-ctl", -- [VIRTIO_SND_VQ_EVENT] = "virtsnd-event" -+ [VIRTIO_SND_VQ_EVENT] = "virtsnd-event", -+ [VIRTIO_SND_VQ_TX] = "virtsnd-tx", -+ [VIRTIO_SND_VQ_RX] = "virtsnd-rx" - }; - struct virtqueue *vqs[VIRTIO_SND_VQ_MAX] = { 0 }; - unsigned int i; -@@ -318,8 +328,12 @@ static void virtsnd_remove(struct virtio_device *vdev) - vdev->config->del_vqs(vdev); - vdev->config->reset(vdev); - -- for (i = 0; snd->substreams && i < snd->nsubstreams; ++i) -- cancel_work_sync(&snd->substreams[i].elapsed_period); -+ for (i = 0; snd->substreams && i < snd->nsubstreams; ++i) { -+ struct virtio_pcm_substream *vss = &snd->substreams[i]; -+ -+ cancel_work_sync(&vss->elapsed_period); -+ virtsnd_pcm_msg_free(vss); -+ } - - kfree(snd->event_msgs); - } -diff --git a/sound/virtio/virtio_card.h b/sound/virtio/virtio_card.h -index 77a1b7255370..c43f9744d362 100644 ---- a/sound/virtio/virtio_card.h -+++ b/sound/virtio/virtio_card.h -@@ -79,4 +79,13 @@ virtsnd_rx_queue(struct virtio_snd *snd) - return &snd->queues[VIRTIO_SND_VQ_RX]; - } - -+static inline struct virtio_snd_queue * -+virtsnd_pcm_queue(struct virtio_pcm_substream *vss) -+{ -+ if (vss->direction == SNDRV_PCM_STREAM_PLAYBACK) -+ return virtsnd_tx_queue(vss->snd); -+ else -+ return virtsnd_rx_queue(vss->snd); -+} -+ - #endif /* VIRTIO_SND_CARD_H */ -diff --git a/sound/virtio/virtio_pcm.c b/sound/virtio/virtio_pcm.c -index e16567e2e214..2dcd763efa29 100644 ---- a/sound/virtio/virtio_pcm.c -+++ b/sound/virtio/virtio_pcm.c -@@ -353,6 +353,8 @@ int virtsnd_pcm_parse_cfg(struct virtio_snd *snd) - vss->snd = snd; - vss->sid = i; - INIT_WORK(&vss->elapsed_period, virtsnd_pcm_period_elapsed); -+ init_waitqueue_head(&vss->msg_empty); -+ spin_lock_init(&vss->lock); - - rc = virtsnd_pcm_build_hw(vss, &info[i]); - if (rc) -@@ -477,3 +479,33 @@ int virtsnd_pcm_build_devs(struct virtio_snd *snd) - - return 0; - } -+ -+/** -+ * virtsnd_pcm_event() - Handle the PCM device event notification. -+ * @snd: VirtIO sound device. -+ * @event: VirtIO sound event. -+ * -+ * Context: Interrupt context. -+ */ -+void virtsnd_pcm_event(struct virtio_snd *snd, struct virtio_snd_event *event) -+{ -+ struct virtio_pcm_substream *vss; -+ u32 sid = le32_to_cpu(event->data); -+ -+ if (sid >= snd->nsubstreams) -+ return; -+ -+ vss = &snd->substreams[sid]; -+ -+ switch (le32_to_cpu(event->hdr.code)) { -+ case VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED: -+ /* TODO: deal with shmem elapsed period */ -+ break; -+ case VIRTIO_SND_EVT_PCM_XRUN: -+ spin_lock(&vss->lock); -+ if (vss->xfer_enabled) -+ vss->xfer_xrun = true; -+ spin_unlock(&vss->lock); -+ break; -+ } -+} -diff --git a/sound/virtio/virtio_pcm.h b/sound/virtio/virtio_pcm.h -index 84f2f3f14f48..6722f1139666 100644 ---- a/sound/virtio/virtio_pcm.h -+++ b/sound/virtio/virtio_pcm.h -@@ -23,6 +23,17 @@ struct virtio_pcm_msg; - * @substream: Kernel ALSA substream. - * @hw: Kernel ALSA substream hardware descriptor. - * @elapsed_period: Kernel work to handle the elapsed period state. -+ * @lock: Spinlock that protects fields shared by interrupt handlers and -+ * substream operators. -+ * @buffer_bytes: Current buffer size in bytes. -+ * @hw_ptr: Substream hardware pointer value in bytes [0 ... buffer_bytes). -+ * @xfer_enabled: Data transfer state (0 - off, 1 - on). -+ * @xfer_xrun: Data underflow/overflow state (0 - no xrun, 1 - xrun). -+ * @msgs: Allocated I/O messages. -+ * @nmsgs: Number of allocated I/O messages. -+ * @msg_last_enqueued: Index of the last I/O message added to the virtqueue. -+ * @msg_count: Number of pending I/O messages in the virtqueue. -+ * @msg_empty: Notify when msg_count is zero. - */ - struct virtio_pcm_substream { - struct virtio_snd *snd; -@@ -33,6 +44,16 @@ struct virtio_pcm_substream { - struct snd_pcm_substream *substream; - struct snd_pcm_hardware hw; - struct work_struct elapsed_period; -+ spinlock_t lock; -+ size_t buffer_bytes; -+ size_t hw_ptr; -+ bool xfer_enabled; -+ bool xfer_xrun; -+ struct virtio_pcm_msg **msgs; -+ unsigned int nmsgs; -+ int msg_last_enqueued; -+ unsigned int msg_count; -+ wait_queue_head_t msg_empty; - }; - - /** -@@ -65,8 +86,27 @@ int virtsnd_pcm_parse_cfg(struct virtio_snd *snd); - - int virtsnd_pcm_build_devs(struct virtio_snd *snd); - -+void virtsnd_pcm_event(struct virtio_snd *snd, struct virtio_snd_event *event); -+ -+void virtsnd_pcm_tx_notify_cb(struct virtqueue *vqueue); -+ -+void virtsnd_pcm_rx_notify_cb(struct virtqueue *vqueue); -+ - struct virtio_pcm *virtsnd_pcm_find(struct virtio_snd *snd, u32 nid); - - struct virtio_pcm *virtsnd_pcm_find_or_create(struct virtio_snd *snd, u32 nid); - -+struct virtio_snd_msg * -+virtsnd_pcm_ctl_msg_alloc(struct virtio_pcm_substream *vss, -+ unsigned int command, gfp_t gfp); -+ -+int virtsnd_pcm_msg_alloc(struct virtio_pcm_substream *vss, -+ unsigned int periods, unsigned int period_bytes); -+ -+void virtsnd_pcm_msg_free(struct virtio_pcm_substream *vss); -+ -+int virtsnd_pcm_msg_send(struct virtio_pcm_substream *vss); -+ -+unsigned int virtsnd_pcm_msg_pending_num(struct virtio_pcm_substream *vss); -+ - #endif /* VIRTIO_SND_PCM_H */ -diff --git a/sound/virtio/virtio_pcm_msg.c b/sound/virtio/virtio_pcm_msg.c -new file mode 100644 -index 000000000000..f88c8f29cbd8 ---- /dev/null -+++ b/sound/virtio/virtio_pcm_msg.c -@@ -0,0 +1,414 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * virtio-snd: Virtio sound device -+ * Copyright (C) 2021 OpenSynergy GmbH -+ */ -+#include <sound/pcm_params.h> -+ -+#include "virtio_card.h" -+ -+/** -+ * struct virtio_pcm_msg - VirtIO I/O message. -+ * @substream: VirtIO PCM substream. -+ * @xfer: Request header payload. -+ * @status: Response header payload. -+ * @length: Data length in bytes. -+ * @sgs: Payload scatter-gather table. -+ */ -+struct virtio_pcm_msg { -+ struct virtio_pcm_substream *substream; -+ struct virtio_snd_pcm_xfer xfer; -+ struct virtio_snd_pcm_status status; -+ size_t length; -+ struct scatterlist sgs[0]; -+}; -+ -+/** -+ * enum pcm_msg_sg_index - Index values for the virtio_pcm_msg->sgs field in -+ * an I/O message. -+ * @PCM_MSG_SG_XFER: Element containing a virtio_snd_pcm_xfer structure. -+ * @PCM_MSG_SG_STATUS: Element containing a virtio_snd_pcm_status structure. -+ * @PCM_MSG_SG_DATA: The first element containing a data buffer. -+ */ -+enum pcm_msg_sg_index { -+ PCM_MSG_SG_XFER = 0, -+ PCM_MSG_SG_STATUS, -+ PCM_MSG_SG_DATA -+}; -+ -+/** -+ * virtsnd_pcm_sg_num() - Count the number of sg-elements required to represent -+ * vmalloc'ed buffer. -+ * @data: Pointer to vmalloc'ed buffer. -+ * @length: Buffer size. -+ * -+ * Context: Any context. -+ * Return: Number of physically contiguous parts in the @data. -+ */ -+static int virtsnd_pcm_sg_num(u8 *data, unsigned int length) -+{ -+ phys_addr_t sg_address; -+ unsigned int sg_length; -+ int num = 0; -+ -+ while (length) { -+ struct page *pg = vmalloc_to_page(data); -+ phys_addr_t pg_address = page_to_phys(pg); -+ size_t pg_length; -+ -+ pg_length = PAGE_SIZE - offset_in_page(data); -+ if (pg_length > length) -+ pg_length = length; -+ -+ if (!num || sg_address + sg_length != pg_address) { -+ sg_address = pg_address; -+ sg_length = pg_length; -+ num++; -+ } else { -+ sg_length += pg_length; -+ } -+ -+ data += pg_length; -+ length -= pg_length; -+ } -+ -+ return num; -+} -+ -+/** -+ * virtsnd_pcm_sg_from() - Build sg-list from vmalloc'ed buffer. -+ * @sgs: Preallocated sg-list to populate. -+ * @nsgs: The maximum number of elements in the @sgs. -+ * @data: Pointer to vmalloc'ed buffer. -+ * @length: Buffer size. -+ * -+ * Splits the buffer into physically contiguous parts and makes an sg-list of -+ * such parts. -+ * -+ * Context: Any context. -+ */ -+static void virtsnd_pcm_sg_from(struct scatterlist *sgs, int nsgs, u8 *data, -+ unsigned int length) -+{ -+ int idx = -1; -+ -+ while (length) { -+ struct page *pg = vmalloc_to_page(data); -+ size_t pg_length; -+ -+ pg_length = PAGE_SIZE - offset_in_page(data); -+ if (pg_length > length) -+ pg_length = length; -+ -+ if (idx == -1 || -+ sg_phys(&sgs[idx]) + sgs[idx].length != page_to_phys(pg)) { -+ if (idx + 1 == nsgs) -+ break; -+ sg_set_page(&sgs[++idx], pg, pg_length, -+ offset_in_page(data)); -+ } else { -+ sgs[idx].length += pg_length; -+ } -+ -+ data += pg_length; -+ length -= pg_length; -+ } -+ -+ sg_mark_end(&sgs[idx]); -+} -+ -+/** -+ * virtsnd_pcm_msg_alloc() - Allocate I/O messages. -+ * @vss: VirtIO PCM substream. -+ * @periods: Current number of periods. -+ * @period_bytes: Current period size in bytes. -+ * -+ * The function slices the buffer into @periods parts (each with the size of -+ * @period_bytes), and creates @periods corresponding I/O messages. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: 0 on success, -ENOMEM on failure. -+ */ -+int virtsnd_pcm_msg_alloc(struct virtio_pcm_substream *vss, -+ unsigned int periods, unsigned int period_bytes) -+{ -+ struct snd_pcm_runtime *runtime = vss->substream->runtime; -+ unsigned int i; -+ -+ vss->msgs = kcalloc(periods, sizeof(*vss->msgs), GFP_KERNEL); -+ if (!vss->msgs) -+ return -ENOMEM; -+ -+ vss->nmsgs = periods; -+ -+ for (i = 0; i < periods; ++i) { -+ u8 *data = runtime->dma_area + period_bytes * i; -+ int sg_num = virtsnd_pcm_sg_num(data, period_bytes); -+ struct virtio_pcm_msg *msg; -+ -+ msg = kzalloc(sizeof(*msg) + sizeof(*msg->sgs) * (sg_num + 2), -+ GFP_KERNEL); -+ if (!msg) -+ return -ENOMEM; -+ -+ msg->substream = vss; -+ sg_init_one(&msg->sgs[PCM_MSG_SG_XFER], &msg->xfer, -+ sizeof(msg->xfer)); -+ sg_init_one(&msg->sgs[PCM_MSG_SG_STATUS], &msg->status, -+ sizeof(msg->status)); -+ msg->length = period_bytes; -+ virtsnd_pcm_sg_from(&msg->sgs[PCM_MSG_SG_DATA], sg_num, data, -+ period_bytes); -+ -+ vss->msgs[i] = msg; -+ } -+ -+ return 0; -+} -+ -+/** -+ * virtsnd_pcm_msg_free() - Free all allocated I/O messages. -+ * @vss: VirtIO PCM substream. -+ * -+ * Context: Any context. -+ */ -+void virtsnd_pcm_msg_free(struct virtio_pcm_substream *vss) -+{ -+ unsigned int i; -+ -+ for (i = 0; vss->msgs && i < vss->nmsgs; ++i) -+ kfree(vss->msgs[i]); -+ kfree(vss->msgs); -+ -+ vss->msgs = NULL; -+ vss->nmsgs = 0; -+} -+ -+/** -+ * virtsnd_pcm_msg_send() - Send asynchronous I/O messages. -+ * @vss: VirtIO PCM substream. -+ * -+ * All messages are organized in an ordered circular list. Each time the -+ * function is called, all currently non-enqueued messages are added to the -+ * virtqueue. For this, the function keeps track of two values: -+ * -+ * msg_last_enqueued = index of the last enqueued message, -+ * msg_count = # of pending messages in the virtqueue. -+ * -+ * Context: Any context. Expects the tx/rx queue and the VirtIO substream -+ * spinlocks to be held by caller. -+ * Return: 0 on success, -errno on failure. -+ */ -+int virtsnd_pcm_msg_send(struct virtio_pcm_substream *vss) -+{ -+ struct snd_pcm_runtime *runtime = vss->substream->runtime; -+ struct virtio_snd *snd = vss->snd; -+ struct virtio_device *vdev = snd->vdev; -+ struct virtqueue *vqueue = virtsnd_pcm_queue(vss)->vqueue; -+ int i; -+ int n; -+ bool notify = false; -+ -+ i = (vss->msg_last_enqueued + 1) % runtime->periods; -+ n = runtime->periods - vss->msg_count; -+ -+ for (; n; --n, i = (i + 1) % runtime->periods) { -+ struct virtio_pcm_msg *msg = vss->msgs[i]; -+ struct scatterlist *psgs[] = { -+ &msg->sgs[PCM_MSG_SG_XFER], -+ &msg->sgs[PCM_MSG_SG_DATA], -+ &msg->sgs[PCM_MSG_SG_STATUS] -+ }; -+ int rc; -+ -+ msg->xfer.stream_id = cpu_to_le32(vss->sid); -+ memset(&msg->status, 0, sizeof(msg->status)); -+ -+ if (vss->direction == SNDRV_PCM_STREAM_PLAYBACK) -+ rc = virtqueue_add_sgs(vqueue, psgs, 2, 1, msg, -+ GFP_ATOMIC); -+ else -+ rc = virtqueue_add_sgs(vqueue, psgs, 1, 2, msg, -+ GFP_ATOMIC); -+ -+ if (rc) { -+ dev_err(&vdev->dev, -+ "SID %u: failed to send I/O message\n", -+ vss->sid); -+ return rc; -+ } -+ -+ vss->msg_last_enqueued = i; -+ vss->msg_count++; -+ } -+ -+ if (!(vss->features & (1U << VIRTIO_SND_PCM_F_MSG_POLLING))) -+ notify = virtqueue_kick_prepare(vqueue); -+ -+ if (notify) -+ virtqueue_notify(vqueue); -+ -+ return 0; -+} -+ -+/** -+ * virtsnd_pcm_msg_pending_num() - Returns the number of pending I/O messages. -+ * @vss: VirtIO substream. -+ * -+ * Context: Any context. -+ * Return: Number of messages. -+ */ -+unsigned int virtsnd_pcm_msg_pending_num(struct virtio_pcm_substream *vss) -+{ -+ unsigned int num; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&vss->lock, flags); -+ num = vss->msg_count; -+ spin_unlock_irqrestore(&vss->lock, flags); -+ -+ return num; -+} -+ -+/** -+ * virtsnd_pcm_msg_complete() - Complete an I/O message. -+ * @msg: I/O message. -+ * @written_bytes: Number of bytes written to the message. -+ * -+ * Completion of the message means the elapsed period. If transmission is -+ * allowed, then each completed message is immediately placed back at the end -+ * of the queue. -+ * -+ * For the playback substream, @written_bytes is equal to sizeof(msg->status). -+ * -+ * For the capture substream, @written_bytes is equal to sizeof(msg->status) -+ * plus the number of captured bytes. -+ * -+ * Context: Interrupt context. Takes and releases the VirtIO substream spinlock. -+ */ -+static void virtsnd_pcm_msg_complete(struct virtio_pcm_msg *msg, -+ size_t written_bytes) -+{ -+ struct virtio_pcm_substream *vss = msg->substream; -+ -+ /* -+ * hw_ptr always indicates the buffer position of the first I/O message -+ * in the virtqueue. Therefore, on each completion of an I/O message, -+ * the hw_ptr value is unconditionally advanced. -+ */ -+ spin_lock(&vss->lock); -+ /* -+ * If the capture substream returned an incorrect status, then just -+ * increase the hw_ptr by the message size. -+ */ -+ if (vss->direction == SNDRV_PCM_STREAM_PLAYBACK || -+ written_bytes <= sizeof(msg->status)) -+ vss->hw_ptr += msg->length; -+ else -+ vss->hw_ptr += written_bytes - sizeof(msg->status); -+ -+ if (vss->hw_ptr >= vss->buffer_bytes) -+ vss->hw_ptr -= vss->buffer_bytes; -+ -+ vss->xfer_xrun = false; -+ vss->msg_count--; -+ -+ if (vss->xfer_enabled) { -+ struct snd_pcm_runtime *runtime = vss->substream->runtime; -+ -+ runtime->delay = -+ bytes_to_frames(runtime, -+ le32_to_cpu(msg->status.latency_bytes)); -+ -+ schedule_work(&vss->elapsed_period); -+ -+ virtsnd_pcm_msg_send(vss); -+ } else if (!vss->msg_count) { -+ wake_up_all(&vss->msg_empty); -+ } -+ spin_unlock(&vss->lock); -+} -+ -+/** -+ * virtsnd_pcm_notify_cb() - Process all completed I/O messages. -+ * @queue: Underlying tx/rx virtqueue. -+ * -+ * Context: Interrupt context. Takes and releases the tx/rx queue spinlock. -+ */ -+static inline void virtsnd_pcm_notify_cb(struct virtio_snd_queue *queue) -+{ -+ struct virtio_pcm_msg *msg; -+ u32 written_bytes; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&queue->lock, flags); -+ do { -+ virtqueue_disable_cb(queue->vqueue); -+ while ((msg = virtqueue_get_buf(queue->vqueue, &written_bytes))) -+ virtsnd_pcm_msg_complete(msg, written_bytes); -+ if (unlikely(virtqueue_is_broken(queue->vqueue))) -+ break; -+ } while (!virtqueue_enable_cb(queue->vqueue)); -+ spin_unlock_irqrestore(&queue->lock, flags); -+} -+ -+/** -+ * virtsnd_pcm_tx_notify_cb() - Process all completed TX messages. -+ * @vqueue: Underlying tx virtqueue. -+ * -+ * Context: Interrupt context. -+ */ -+void virtsnd_pcm_tx_notify_cb(struct virtqueue *vqueue) -+{ -+ struct virtio_snd *snd = vqueue->vdev->priv; -+ -+ virtsnd_pcm_notify_cb(virtsnd_tx_queue(snd)); -+} -+ -+/** -+ * virtsnd_pcm_rx_notify_cb() - Process all completed RX messages. -+ * @vqueue: Underlying rx virtqueue. -+ * -+ * Context: Interrupt context. -+ */ -+void virtsnd_pcm_rx_notify_cb(struct virtqueue *vqueue) -+{ -+ struct virtio_snd *snd = vqueue->vdev->priv; -+ -+ virtsnd_pcm_notify_cb(virtsnd_rx_queue(snd)); -+} -+ -+/** -+ * virtsnd_pcm_ctl_msg_alloc() - Allocate and initialize the PCM device control -+ * message for the specified substream. -+ * @vss: VirtIO PCM substream. -+ * @command: Control request code (VIRTIO_SND_R_PCM_XXX). -+ * @gfp: Kernel flags for memory allocation. -+ * -+ * Context: Any context. May sleep if @gfp flags permit. -+ * Return: Allocated message on success, NULL on failure. -+ */ -+struct virtio_snd_msg * -+virtsnd_pcm_ctl_msg_alloc(struct virtio_pcm_substream *vss, -+ unsigned int command, gfp_t gfp) -+{ -+ size_t request_size = sizeof(struct virtio_snd_pcm_hdr); -+ size_t response_size = sizeof(struct virtio_snd_hdr); -+ struct virtio_snd_msg *msg; -+ -+ switch (command) { -+ case VIRTIO_SND_R_PCM_SET_PARAMS: -+ request_size = sizeof(struct virtio_snd_pcm_set_params); -+ break; -+ } -+ -+ msg = virtsnd_ctl_msg_alloc(request_size, response_size, gfp); -+ if (msg) { -+ struct virtio_snd_pcm_hdr *hdr = virtsnd_ctl_msg_request(msg); -+ -+ hdr->hdr.code = cpu_to_le32(command); -+ hdr->stream_id = cpu_to_le32(vss->sid); -+ } -+ -+ return msg; -+} diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0006-ALSA-virtio-PCM-substream-operators.patch b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0006-ALSA-virtio-PCM-substream-operators.patch deleted file mode 100644 index 9196b34e4..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0006-ALSA-virtio-PCM-substream-operators.patch +++ /dev/null @@ -1,525 +0,0 @@ -From 93c313dc4fc78b077bb0911afe3a77ffa845ad58 Mon Sep 17 00:00:00 2001 -From: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Date: Tue, 2 Mar 2021 17:47:06 +0100 -Subject: [PATCH] ALSA: virtio: PCM substream operators - -Introduce the operators required for the operation of substreams. - -Signed-off-by: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Link: https://lore.kernel.org/r/20210302164709.3142702-7-anton.yakovlev@opensynergy.com -Signed-off-by: Takashi Iwai <tiwai@suse.de> -Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com> ---- - sound/virtio/Makefile | 3 +- - sound/virtio/virtio_pcm.c | 2 + - sound/virtio/virtio_pcm.h | 5 + - sound/virtio/virtio_pcm_ops.c | 445 ++++++++++++++++++++++++++++++++++ - 4 files changed, 454 insertions(+), 1 deletion(-) - create mode 100644 sound/virtio/virtio_pcm_ops.c - -diff --git a/sound/virtio/Makefile b/sound/virtio/Makefile -index 626af3cc3ed7..34493226793f 100644 ---- a/sound/virtio/Makefile -+++ b/sound/virtio/Makefile -@@ -6,5 +6,6 @@ virtio_snd-objs := \ - virtio_card.o \ - virtio_ctl_msg.o \ - virtio_pcm.o \ -- virtio_pcm_msg.o -+ virtio_pcm_msg.o \ -+ virtio_pcm_ops.o - -diff --git a/sound/virtio/virtio_pcm.c b/sound/virtio/virtio_pcm.c -index 2dcd763efa29..c10d91fff2fb 100644 ---- a/sound/virtio/virtio_pcm.c -+++ b/sound/virtio/virtio_pcm.c -@@ -470,6 +470,8 @@ int virtsnd_pcm_build_devs(struct virtio_snd *snd) - - for (kss = ks->substream; kss; kss = kss->next) - vs->substreams[kss->number]->substream = kss; -+ -+ snd_pcm_set_ops(vpcm->pcm, i, &virtsnd_pcm_ops); - } - - snd_pcm_set_managed_buffer_all(vpcm->pcm, -diff --git a/sound/virtio/virtio_pcm.h b/sound/virtio/virtio_pcm.h -index 6722f1139666..efd0228746cf 100644 ---- a/sound/virtio/virtio_pcm.h -+++ b/sound/virtio/virtio_pcm.h -@@ -29,6 +29,8 @@ struct virtio_pcm_msg; - * @hw_ptr: Substream hardware pointer value in bytes [0 ... buffer_bytes). - * @xfer_enabled: Data transfer state (0 - off, 1 - on). - * @xfer_xrun: Data underflow/overflow state (0 - no xrun, 1 - xrun). -+ * @stopped: True if the substream is stopped and must be released on the device -+ * side. - * @msgs: Allocated I/O messages. - * @nmsgs: Number of allocated I/O messages. - * @msg_last_enqueued: Index of the last I/O message added to the virtqueue. -@@ -49,6 +51,7 @@ struct virtio_pcm_substream { - size_t hw_ptr; - bool xfer_enabled; - bool xfer_xrun; -+ bool stopped; - struct virtio_pcm_msg **msgs; - unsigned int nmsgs; - int msg_last_enqueued; -@@ -80,6 +83,8 @@ struct virtio_pcm { - struct virtio_pcm_stream streams[SNDRV_PCM_STREAM_LAST + 1]; - }; - -+extern const struct snd_pcm_ops virtsnd_pcm_ops; -+ - int virtsnd_pcm_validate(struct virtio_device *vdev); - - int virtsnd_pcm_parse_cfg(struct virtio_snd *snd); -diff --git a/sound/virtio/virtio_pcm_ops.c b/sound/virtio/virtio_pcm_ops.c -new file mode 100644 -index 000000000000..0682a2df6c8c ---- /dev/null -+++ b/sound/virtio/virtio_pcm_ops.c -@@ -0,0 +1,445 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * virtio-snd: Virtio sound device -+ * Copyright (C) 2021 OpenSynergy GmbH -+ */ -+#include <sound/pcm_params.h> -+ -+#include "virtio_card.h" -+ -+/* -+ * I/O messages lifetime -+ * --------------------- -+ * -+ * Allocation: -+ * Messages are initially allocated in the ops->hw_params() after the size and -+ * number of periods have been successfully negotiated. -+ * -+ * Freeing: -+ * Messages can be safely freed after the queue has been successfully flushed -+ * (RELEASE command in the ops->sync_stop()) and the ops->hw_free() has been -+ * called. -+ * -+ * When the substream stops, the ops->sync_stop() waits until the device has -+ * completed all pending messages. This wait can be interrupted either by a -+ * signal or due to a timeout. In this case, the device can still access -+ * messages even after calling ops->hw_free(). It can also issue an interrupt, -+ * and the interrupt handler will also try to access message structures. -+ * -+ * Therefore, freeing of already allocated messages occurs: -+ * -+ * - in ops->hw_params(), if this operator was called several times in a row, -+ * or if ops->hw_free() failed to free messages previously; -+ * -+ * - in ops->hw_free(), if the queue has been successfully flushed; -+ * -+ * - in dev->release(). -+ */ -+ -+/* Map for converting ALSA format to VirtIO format. */ -+struct virtsnd_a2v_format { -+ snd_pcm_format_t alsa_bit; -+ unsigned int vio_bit; -+}; -+ -+static const struct virtsnd_a2v_format g_a2v_format_map[] = { -+ { SNDRV_PCM_FORMAT_IMA_ADPCM, VIRTIO_SND_PCM_FMT_IMA_ADPCM }, -+ { SNDRV_PCM_FORMAT_MU_LAW, VIRTIO_SND_PCM_FMT_MU_LAW }, -+ { SNDRV_PCM_FORMAT_A_LAW, VIRTIO_SND_PCM_FMT_A_LAW }, -+ { SNDRV_PCM_FORMAT_S8, VIRTIO_SND_PCM_FMT_S8 }, -+ { SNDRV_PCM_FORMAT_U8, VIRTIO_SND_PCM_FMT_U8 }, -+ { SNDRV_PCM_FORMAT_S16_LE, VIRTIO_SND_PCM_FMT_S16 }, -+ { SNDRV_PCM_FORMAT_U16_LE, VIRTIO_SND_PCM_FMT_U16 }, -+ { SNDRV_PCM_FORMAT_S18_3LE, VIRTIO_SND_PCM_FMT_S18_3 }, -+ { SNDRV_PCM_FORMAT_U18_3LE, VIRTIO_SND_PCM_FMT_U18_3 }, -+ { SNDRV_PCM_FORMAT_S20_3LE, VIRTIO_SND_PCM_FMT_S20_3 }, -+ { SNDRV_PCM_FORMAT_U20_3LE, VIRTIO_SND_PCM_FMT_U20_3 }, -+ { SNDRV_PCM_FORMAT_S24_3LE, VIRTIO_SND_PCM_FMT_S24_3 }, -+ { SNDRV_PCM_FORMAT_U24_3LE, VIRTIO_SND_PCM_FMT_U24_3 }, -+ { SNDRV_PCM_FORMAT_S20_LE, VIRTIO_SND_PCM_FMT_S20 }, -+ { SNDRV_PCM_FORMAT_U20_LE, VIRTIO_SND_PCM_FMT_U20 }, -+ { SNDRV_PCM_FORMAT_S24_LE, VIRTIO_SND_PCM_FMT_S24 }, -+ { SNDRV_PCM_FORMAT_U24_LE, VIRTIO_SND_PCM_FMT_U24 }, -+ { SNDRV_PCM_FORMAT_S32_LE, VIRTIO_SND_PCM_FMT_S32 }, -+ { SNDRV_PCM_FORMAT_U32_LE, VIRTIO_SND_PCM_FMT_U32 }, -+ { SNDRV_PCM_FORMAT_FLOAT_LE, VIRTIO_SND_PCM_FMT_FLOAT }, -+ { SNDRV_PCM_FORMAT_FLOAT64_LE, VIRTIO_SND_PCM_FMT_FLOAT64 }, -+ { SNDRV_PCM_FORMAT_DSD_U8, VIRTIO_SND_PCM_FMT_DSD_U8 }, -+ { SNDRV_PCM_FORMAT_DSD_U16_LE, VIRTIO_SND_PCM_FMT_DSD_U16 }, -+ { SNDRV_PCM_FORMAT_DSD_U32_LE, VIRTIO_SND_PCM_FMT_DSD_U32 }, -+ { SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE, -+ VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME } -+}; -+ -+/* Map for converting ALSA frame rate to VirtIO frame rate. */ -+struct virtsnd_a2v_rate { -+ unsigned int rate; -+ unsigned int vio_bit; -+}; -+ -+static const struct virtsnd_a2v_rate g_a2v_rate_map[] = { -+ { 5512, VIRTIO_SND_PCM_RATE_5512 }, -+ { 8000, VIRTIO_SND_PCM_RATE_8000 }, -+ { 11025, VIRTIO_SND_PCM_RATE_11025 }, -+ { 16000, VIRTIO_SND_PCM_RATE_16000 }, -+ { 22050, VIRTIO_SND_PCM_RATE_22050 }, -+ { 32000, VIRTIO_SND_PCM_RATE_32000 }, -+ { 44100, VIRTIO_SND_PCM_RATE_44100 }, -+ { 48000, VIRTIO_SND_PCM_RATE_48000 }, -+ { 64000, VIRTIO_SND_PCM_RATE_64000 }, -+ { 88200, VIRTIO_SND_PCM_RATE_88200 }, -+ { 96000, VIRTIO_SND_PCM_RATE_96000 }, -+ { 176400, VIRTIO_SND_PCM_RATE_176400 }, -+ { 192000, VIRTIO_SND_PCM_RATE_192000 } -+}; -+ -+static int virtsnd_pcm_sync_stop(struct snd_pcm_substream *substream); -+ -+/** -+ * virtsnd_pcm_open() - Open the PCM substream. -+ * @substream: Kernel ALSA substream. -+ * -+ * Context: Process context. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_pcm_open(struct snd_pcm_substream *substream) -+{ -+ struct virtio_pcm *vpcm = snd_pcm_substream_chip(substream); -+ struct virtio_pcm_stream *vs = &vpcm->streams[substream->stream]; -+ struct virtio_pcm_substream *vss = vs->substreams[substream->number]; -+ -+ substream->runtime->hw = vss->hw; -+ substream->private_data = vss; -+ -+ snd_pcm_hw_constraint_integer(substream->runtime, -+ SNDRV_PCM_HW_PARAM_PERIODS); -+ -+ vss->stopped = !!virtsnd_pcm_msg_pending_num(vss); -+ -+ /* -+ * If the substream has already been used, then the I/O queue may be in -+ * an invalid state. Just in case, we do a check and try to return the -+ * queue to its original state, if necessary. -+ */ -+ return virtsnd_pcm_sync_stop(substream); -+} -+ -+/** -+ * virtsnd_pcm_close() - Close the PCM substream. -+ * @substream: Kernel ALSA substream. -+ * -+ * Context: Process context. -+ * Return: 0. -+ */ -+static int virtsnd_pcm_close(struct snd_pcm_substream *substream) -+{ -+ return 0; -+} -+ -+/** -+ * virtsnd_pcm_dev_set_params() - Set the parameters of the PCM substream on -+ * the device side. -+ * @vss: VirtIO PCM substream. -+ * @buffer_bytes: Size of the hardware buffer. -+ * @period_bytes: Size of the hardware period. -+ * @channels: Selected number of channels. -+ * @format: Selected sample format (SNDRV_PCM_FORMAT_XXX). -+ * @rate: Selected frame rate. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_pcm_dev_set_params(struct virtio_pcm_substream *vss, -+ unsigned int buffer_bytes, -+ unsigned int period_bytes, -+ unsigned int channels, -+ snd_pcm_format_t format, -+ unsigned int rate) -+{ -+ struct virtio_snd_msg *msg; -+ struct virtio_snd_pcm_set_params *request; -+ unsigned int i; -+ int vformat = -1; -+ int vrate = -1; -+ -+ for (i = 0; i < ARRAY_SIZE(g_a2v_format_map); ++i) -+ if (g_a2v_format_map[i].alsa_bit == format) { -+ vformat = g_a2v_format_map[i].vio_bit; -+ -+ break; -+ } -+ -+ for (i = 0; i < ARRAY_SIZE(g_a2v_rate_map); ++i) -+ if (g_a2v_rate_map[i].rate == rate) { -+ vrate = g_a2v_rate_map[i].vio_bit; -+ -+ break; -+ } -+ -+ if (vformat == -1 || vrate == -1) -+ return -EINVAL; -+ -+ msg = virtsnd_pcm_ctl_msg_alloc(vss, VIRTIO_SND_R_PCM_SET_PARAMS, -+ GFP_KERNEL); -+ if (!msg) -+ return -ENOMEM; -+ -+ request = virtsnd_ctl_msg_request(msg); -+ request->buffer_bytes = cpu_to_le32(buffer_bytes); -+ request->period_bytes = cpu_to_le32(period_bytes); -+ request->channels = channels; -+ request->format = vformat; -+ request->rate = vrate; -+ -+ if (vss->features & (1U << VIRTIO_SND_PCM_F_MSG_POLLING)) -+ request->features |= -+ cpu_to_le32(1U << VIRTIO_SND_PCM_F_MSG_POLLING); -+ -+ if (vss->features & (1U << VIRTIO_SND_PCM_F_EVT_XRUNS)) -+ request->features |= -+ cpu_to_le32(1U << VIRTIO_SND_PCM_F_EVT_XRUNS); -+ -+ return virtsnd_ctl_msg_send_sync(vss->snd, msg); -+} -+ -+/** -+ * virtsnd_pcm_hw_params() - Set the parameters of the PCM substream. -+ * @substream: Kernel ALSA substream. -+ * @hw_params: Hardware parameters. -+ * -+ * Context: Process context. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_pcm_hw_params(struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *hw_params) -+{ -+ struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream); -+ struct virtio_device *vdev = vss->snd->vdev; -+ int rc; -+ -+ if (virtsnd_pcm_msg_pending_num(vss)) { -+ dev_err(&vdev->dev, "SID %u: invalid I/O queue state\n", -+ vss->sid); -+ return -EBADFD; -+ } -+ -+ rc = virtsnd_pcm_dev_set_params(vss, params_buffer_bytes(hw_params), -+ params_period_bytes(hw_params), -+ params_channels(hw_params), -+ params_format(hw_params), -+ params_rate(hw_params)); -+ if (rc) -+ return rc; -+ -+ /* -+ * Free previously allocated messages if ops->hw_params() is called -+ * several times in a row, or if ops->hw_free() failed to free messages. -+ */ -+ virtsnd_pcm_msg_free(vss); -+ -+ return virtsnd_pcm_msg_alloc(vss, params_periods(hw_params), -+ params_period_bytes(hw_params)); -+} -+ -+/** -+ * virtsnd_pcm_hw_free() - Reset the parameters of the PCM substream. -+ * @substream: Kernel ALSA substream. -+ * -+ * Context: Process context. -+ * Return: 0 -+ */ -+static int virtsnd_pcm_hw_free(struct snd_pcm_substream *substream) -+{ -+ struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream); -+ -+ /* If the queue is flushed, we can safely free the messages here. */ -+ if (!virtsnd_pcm_msg_pending_num(vss)) -+ virtsnd_pcm_msg_free(vss); -+ -+ return 0; -+} -+ -+/** -+ * virtsnd_pcm_prepare() - Prepare the PCM substream. -+ * @substream: Kernel ALSA substream. -+ * -+ * Context: Process context. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_pcm_prepare(struct snd_pcm_substream *substream) -+{ -+ struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream); -+ struct virtio_device *vdev = vss->snd->vdev; -+ struct virtio_snd_msg *msg; -+ -+ if (virtsnd_pcm_msg_pending_num(vss)) { -+ dev_err(&vdev->dev, "SID %u: invalid I/O queue state\n", -+ vss->sid); -+ return -EBADFD; -+ } -+ -+ vss->buffer_bytes = snd_pcm_lib_buffer_bytes(substream); -+ vss->hw_ptr = 0; -+ vss->xfer_xrun = false; -+ vss->msg_last_enqueued = -1; -+ vss->msg_count = 0; -+ -+ msg = virtsnd_pcm_ctl_msg_alloc(vss, VIRTIO_SND_R_PCM_PREPARE, -+ GFP_KERNEL); -+ if (!msg) -+ return -ENOMEM; -+ -+ return virtsnd_ctl_msg_send_sync(vss->snd, msg); -+} -+ -+/** -+ * virtsnd_pcm_trigger() - Process command for the PCM substream. -+ * @substream: Kernel ALSA substream. -+ * @command: Substream command (SNDRV_PCM_TRIGGER_XXX). -+ * -+ * Context: Any context. Takes and releases the VirtIO substream spinlock. -+ * May take and release the tx/rx queue spinlock. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_pcm_trigger(struct snd_pcm_substream *substream, int command) -+{ -+ struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream); -+ struct virtio_snd *snd = vss->snd; -+ struct virtio_snd_queue *queue; -+ struct virtio_snd_msg *msg; -+ unsigned long flags; -+ int rc; -+ -+ switch (command) { -+ case SNDRV_PCM_TRIGGER_START: -+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: -+ queue = virtsnd_pcm_queue(vss); -+ -+ spin_lock_irqsave(&queue->lock, flags); -+ spin_lock(&vss->lock); -+ rc = virtsnd_pcm_msg_send(vss); -+ if (!rc) -+ vss->xfer_enabled = true; -+ spin_unlock(&vss->lock); -+ spin_unlock_irqrestore(&queue->lock, flags); -+ if (rc) -+ return rc; -+ -+ msg = virtsnd_pcm_ctl_msg_alloc(vss, VIRTIO_SND_R_PCM_START, -+ GFP_KERNEL); -+ if (!msg) { -+ spin_lock_irqsave(&vss->lock, flags); -+ vss->xfer_enabled = false; -+ spin_unlock_irqrestore(&vss->lock, flags); -+ -+ return -ENOMEM; -+ } -+ -+ return virtsnd_ctl_msg_send_sync(snd, msg); -+ case SNDRV_PCM_TRIGGER_STOP: -+ vss->stopped = true; -+ fallthrough; -+ case SNDRV_PCM_TRIGGER_PAUSE_PUSH: -+ spin_lock_irqsave(&vss->lock, flags); -+ vss->xfer_enabled = false; -+ spin_unlock_irqrestore(&vss->lock, flags); -+ -+ msg = virtsnd_pcm_ctl_msg_alloc(vss, VIRTIO_SND_R_PCM_STOP, -+ GFP_KERNEL); -+ if (!msg) -+ return -ENOMEM; -+ -+ return virtsnd_ctl_msg_send_sync(snd, msg); -+ default: -+ return -EINVAL; -+ } -+} -+ -+/** -+ * virtsnd_pcm_sync_stop() - Synchronous PCM substream stop. -+ * @substream: Kernel ALSA substream. -+ * -+ * The function can be called both from the upper level or from the driver -+ * itself. -+ * -+ * Context: Process context. Takes and releases the VirtIO substream spinlock. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_pcm_sync_stop(struct snd_pcm_substream *substream) -+{ -+ struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream); -+ struct virtio_snd *snd = vss->snd; -+ struct virtio_snd_msg *msg; -+ unsigned int js = msecs_to_jiffies(virtsnd_msg_timeout_ms); -+ int rc; -+ -+ cancel_work_sync(&vss->elapsed_period); -+ -+ if (!vss->stopped) -+ return 0; -+ -+ msg = virtsnd_pcm_ctl_msg_alloc(vss, VIRTIO_SND_R_PCM_RELEASE, -+ GFP_KERNEL); -+ if (!msg) -+ return -ENOMEM; -+ -+ rc = virtsnd_ctl_msg_send_sync(snd, msg); -+ if (rc) -+ return rc; -+ -+ /* -+ * The spec states that upon receipt of the RELEASE command "the device -+ * MUST complete all pending I/O messages for the specified stream ID". -+ * Thus, we consider the absence of I/O messages in the queue as an -+ * indication that the substream has been released. -+ */ -+ rc = wait_event_interruptible_timeout(vss->msg_empty, -+ !virtsnd_pcm_msg_pending_num(vss), -+ js); -+ if (rc <= 0) { -+ dev_warn(&snd->vdev->dev, "SID %u: failed to flush I/O queue\n", -+ vss->sid); -+ -+ return !rc ? -ETIMEDOUT : rc; -+ } -+ -+ vss->stopped = false; -+ -+ return 0; -+} -+ -+/** -+ * virtsnd_pcm_pointer() - Get the current hardware position for the PCM -+ * substream. -+ * @substream: Kernel ALSA substream. -+ * -+ * Context: Any context. Takes and releases the VirtIO substream spinlock. -+ * Return: Hardware position in frames inside [0 ... buffer_size) range. -+ */ -+static snd_pcm_uframes_t -+virtsnd_pcm_pointer(struct snd_pcm_substream *substream) -+{ -+ struct virtio_pcm_substream *vss = snd_pcm_substream_chip(substream); -+ snd_pcm_uframes_t hw_ptr = SNDRV_PCM_POS_XRUN; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&vss->lock, flags); -+ if (!vss->xfer_xrun) -+ hw_ptr = bytes_to_frames(substream->runtime, vss->hw_ptr); -+ spin_unlock_irqrestore(&vss->lock, flags); -+ -+ return hw_ptr; -+} -+ -+/* PCM substream operators map. */ -+const struct snd_pcm_ops virtsnd_pcm_ops = { -+ .open = virtsnd_pcm_open, -+ .close = virtsnd_pcm_close, -+ .ioctl = snd_pcm_lib_ioctl, -+ .hw_params = virtsnd_pcm_hw_params, -+ .hw_free = virtsnd_pcm_hw_free, -+ .prepare = virtsnd_pcm_prepare, -+ .trigger = virtsnd_pcm_trigger, -+ .sync_stop = virtsnd_pcm_sync_stop, -+ .pointer = virtsnd_pcm_pointer, -+}; diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0007-ALSA-virtio-introduce-jack-support.patch b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0007-ALSA-virtio-introduce-jack-support.patch deleted file mode 100644 index af30421e0..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0007-ALSA-virtio-introduce-jack-support.patch +++ /dev/null @@ -1,351 +0,0 @@ -From 07692f250a96382b38daa2b7e2b96689f64d7a40 Mon Sep 17 00:00:00 2001 -From: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Date: Tue, 2 Mar 2021 17:47:07 +0100 -Subject: [PATCH] ALSA: virtio: introduce jack support - -Enumerate all available jacks and create ALSA controls. - -At the moment jacks have a simple implementation and can only be used -to receive notifications about a plugged in/out device. - -Signed-off-by: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Link: https://lore.kernel.org/r/20210302164709.3142702-8-anton.yakovlev@opensynergy.com -Signed-off-by: Takashi Iwai <tiwai@suse.de> -Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com> ---- - sound/virtio/Makefile | 1 + - sound/virtio/virtio_card.c | 14 +++ - sound/virtio/virtio_card.h | 12 ++ - sound/virtio/virtio_jack.c | 233 +++++++++++++++++++++++++++++++++++++ - 4 files changed, 260 insertions(+) - create mode 100644 sound/virtio/virtio_jack.c - -diff --git a/sound/virtio/Makefile b/sound/virtio/Makefile -index 34493226793f..09f485291285 100644 ---- a/sound/virtio/Makefile -+++ b/sound/virtio/Makefile -@@ -5,6 +5,7 @@ obj-$(CONFIG_SND_VIRTIO) += virtio_snd.o - virtio_snd-objs := \ - virtio_card.o \ - virtio_ctl_msg.o \ -+ virtio_jack.o \ - virtio_pcm.o \ - virtio_pcm_msg.o \ - virtio_pcm_ops.o -diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c -index 57b9b7f3a9c0..89bd66c1256e 100644 ---- a/sound/virtio/virtio_card.c -+++ b/sound/virtio/virtio_card.c -@@ -56,6 +56,10 @@ static void virtsnd_event_dispatch(struct virtio_snd *snd, - struct virtio_snd_event *event) - { - switch (le32_to_cpu(event->hdr.code)) { -+ case VIRTIO_SND_EVT_JACK_CONNECTED: -+ case VIRTIO_SND_EVT_JACK_DISCONNECTED: -+ virtsnd_jack_event(snd, event); -+ break; - case VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED: - case VIRTIO_SND_EVT_PCM_XRUN: - virtsnd_pcm_event(snd, event); -@@ -219,10 +223,20 @@ static int virtsnd_build_devs(struct virtio_snd *snd) - VIRTIO_SND_CARD_NAME " at %s/%s", - dev_name(dev->parent), dev_name(dev)); - -+ rc = virtsnd_jack_parse_cfg(snd); -+ if (rc) -+ return rc; -+ - rc = virtsnd_pcm_parse_cfg(snd); - if (rc) - return rc; - -+ if (snd->njacks) { -+ rc = virtsnd_jack_build_devs(snd); -+ if (rc) -+ return rc; -+ } -+ - if (snd->nsubstreams) { - rc = virtsnd_pcm_build_devs(snd); - if (rc) -diff --git a/sound/virtio/virtio_card.h b/sound/virtio/virtio_card.h -index c43f9744d362..f154313c79fd 100644 ---- a/sound/virtio/virtio_card.h -+++ b/sound/virtio/virtio_card.h -@@ -18,6 +18,7 @@ - #define VIRTIO_SND_CARD_NAME "VirtIO SoundCard" - #define VIRTIO_SND_PCM_NAME "VirtIO PCM" - -+struct virtio_jack; - struct virtio_pcm_substream; - - /** -@@ -38,6 +39,8 @@ struct virtio_snd_queue { - * @ctl_msgs: Pending control request list. - * @event_msgs: Device events. - * @pcm_list: VirtIO PCM device list. -+ * @jacks: VirtIO jacks. -+ * @njacks: Number of jacks. - * @substreams: VirtIO PCM substreams. - * @nsubstreams: Number of PCM substreams. - */ -@@ -48,6 +51,8 @@ struct virtio_snd { - struct list_head ctl_msgs; - struct virtio_snd_event *event_msgs; - struct list_head pcm_list; -+ struct virtio_jack *jacks; -+ u32 njacks; - struct virtio_pcm_substream *substreams; - u32 nsubstreams; - }; -@@ -88,4 +93,11 @@ virtsnd_pcm_queue(struct virtio_pcm_substream *vss) - return virtsnd_rx_queue(vss->snd); - } - -+int virtsnd_jack_parse_cfg(struct virtio_snd *snd); -+ -+int virtsnd_jack_build_devs(struct virtio_snd *snd); -+ -+void virtsnd_jack_event(struct virtio_snd *snd, -+ struct virtio_snd_event *event); -+ - #endif /* VIRTIO_SND_CARD_H */ -diff --git a/sound/virtio/virtio_jack.c b/sound/virtio/virtio_jack.c -new file mode 100644 -index 000000000000..c69f1dcdcc84 ---- /dev/null -+++ b/sound/virtio/virtio_jack.c -@@ -0,0 +1,233 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * virtio-snd: Virtio sound device -+ * Copyright (C) 2021 OpenSynergy GmbH -+ */ -+#include <linux/virtio_config.h> -+#include <sound/jack.h> -+#include <sound/hda_verbs.h> -+ -+#include "virtio_card.h" -+ -+/** -+ * DOC: Implementation Status -+ * -+ * At the moment jacks have a simple implementation and can only be used to -+ * receive notifications about a plugged in/out device. -+ * -+ * VIRTIO_SND_R_JACK_REMAP -+ * is not supported -+ */ -+ -+/** -+ * struct virtio_jack - VirtIO jack. -+ * @jack: Kernel jack control. -+ * @nid: Functional group node identifier. -+ * @features: Jack virtio feature bit map (1 << VIRTIO_SND_JACK_F_XXX). -+ * @defconf: Pin default configuration value. -+ * @caps: Pin capabilities value. -+ * @connected: Current jack connection status. -+ * @type: Kernel jack type (SND_JACK_XXX). -+ */ -+struct virtio_jack { -+ struct snd_jack *jack; -+ u32 nid; -+ u32 features; -+ u32 defconf; -+ u32 caps; -+ bool connected; -+ int type; -+}; -+ -+/** -+ * virtsnd_jack_get_label() - Get the name string for the jack. -+ * @vjack: VirtIO jack. -+ * -+ * Returns the jack name based on the default pin configuration value (see HDA -+ * specification). -+ * -+ * Context: Any context. -+ * Return: Name string. -+ */ -+static const char *virtsnd_jack_get_label(struct virtio_jack *vjack) -+{ -+ unsigned int defconf = vjack->defconf; -+ unsigned int device = -+ (defconf & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT; -+ unsigned int location = -+ (defconf & AC_DEFCFG_LOCATION) >> AC_DEFCFG_LOCATION_SHIFT; -+ -+ switch (device) { -+ case AC_JACK_LINE_OUT: -+ return "Line Out"; -+ case AC_JACK_SPEAKER: -+ return "Speaker"; -+ case AC_JACK_HP_OUT: -+ return "Headphone"; -+ case AC_JACK_CD: -+ return "CD"; -+ case AC_JACK_SPDIF_OUT: -+ case AC_JACK_DIG_OTHER_OUT: -+ if (location == AC_JACK_LOC_HDMI) -+ return "HDMI Out"; -+ else -+ return "SPDIF Out"; -+ case AC_JACK_LINE_IN: -+ return "Line"; -+ case AC_JACK_AUX: -+ return "Aux"; -+ case AC_JACK_MIC_IN: -+ return "Mic"; -+ case AC_JACK_SPDIF_IN: -+ return "SPDIF In"; -+ case AC_JACK_DIG_OTHER_IN: -+ return "Digital In"; -+ default: -+ return "Misc"; -+ } -+} -+ -+/** -+ * virtsnd_jack_get_type() - Get the type for the jack. -+ * @vjack: VirtIO jack. -+ * -+ * Returns the jack type based on the default pin configuration value (see HDA -+ * specification). -+ * -+ * Context: Any context. -+ * Return: SND_JACK_XXX value. -+ */ -+static int virtsnd_jack_get_type(struct virtio_jack *vjack) -+{ -+ unsigned int defconf = vjack->defconf; -+ unsigned int device = -+ (defconf & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT; -+ -+ switch (device) { -+ case AC_JACK_LINE_OUT: -+ case AC_JACK_SPEAKER: -+ return SND_JACK_LINEOUT; -+ case AC_JACK_HP_OUT: -+ return SND_JACK_HEADPHONE; -+ case AC_JACK_SPDIF_OUT: -+ case AC_JACK_DIG_OTHER_OUT: -+ return SND_JACK_AVOUT; -+ case AC_JACK_MIC_IN: -+ return SND_JACK_MICROPHONE; -+ default: -+ return SND_JACK_LINEIN; -+ } -+} -+ -+/** -+ * virtsnd_jack_parse_cfg() - Parse the jack configuration. -+ * @snd: VirtIO sound device. -+ * -+ * This function is called during initial device initialization. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: 0 on success, -errno on failure. -+ */ -+int virtsnd_jack_parse_cfg(struct virtio_snd *snd) -+{ -+ struct virtio_device *vdev = snd->vdev; -+ struct virtio_snd_jack_info *info; -+ u32 i; -+ int rc; -+ -+ virtio_cread_le(vdev, struct virtio_snd_config, jacks, &snd->njacks); -+ if (!snd->njacks) -+ return 0; -+ -+ snd->jacks = devm_kcalloc(&vdev->dev, snd->njacks, sizeof(*snd->jacks), -+ GFP_KERNEL); -+ if (!snd->jacks) -+ return -ENOMEM; -+ -+ info = kcalloc(snd->njacks, sizeof(*info), GFP_KERNEL); -+ if (!info) -+ return -ENOMEM; -+ -+ rc = virtsnd_ctl_query_info(snd, VIRTIO_SND_R_JACK_INFO, 0, snd->njacks, -+ sizeof(*info), info); -+ if (rc) -+ goto on_exit; -+ -+ for (i = 0; i < snd->njacks; ++i) { -+ struct virtio_jack *vjack = &snd->jacks[i]; -+ -+ vjack->nid = le32_to_cpu(info[i].hdr.hda_fn_nid); -+ vjack->features = le32_to_cpu(info[i].features); -+ vjack->defconf = le32_to_cpu(info[i].hda_reg_defconf); -+ vjack->caps = le32_to_cpu(info[i].hda_reg_caps); -+ vjack->connected = info[i].connected; -+ } -+ -+on_exit: -+ kfree(info); -+ -+ return rc; -+} -+ -+/** -+ * virtsnd_jack_build_devs() - Build ALSA controls for jacks. -+ * @snd: VirtIO sound device. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: 0 on success, -errno on failure. -+ */ -+int virtsnd_jack_build_devs(struct virtio_snd *snd) -+{ -+ u32 i; -+ int rc; -+ -+ for (i = 0; i < snd->njacks; ++i) { -+ struct virtio_jack *vjack = &snd->jacks[i]; -+ -+ vjack->type = virtsnd_jack_get_type(vjack); -+ -+ rc = snd_jack_new(snd->card, virtsnd_jack_get_label(vjack), -+ vjack->type, &vjack->jack, true, true); -+ if (rc) -+ return rc; -+ -+ if (vjack->jack) -+ vjack->jack->private_data = vjack; -+ -+ snd_jack_report(vjack->jack, -+ vjack->connected ? vjack->type : 0); -+ } -+ -+ return 0; -+} -+ -+/** -+ * virtsnd_jack_event() - Handle the jack event notification. -+ * @snd: VirtIO sound device. -+ * @event: VirtIO sound event. -+ * -+ * Context: Interrupt context. -+ */ -+void virtsnd_jack_event(struct virtio_snd *snd, struct virtio_snd_event *event) -+{ -+ u32 jack_id = le32_to_cpu(event->data); -+ struct virtio_jack *vjack; -+ -+ if (jack_id >= snd->njacks) -+ return; -+ -+ vjack = &snd->jacks[jack_id]; -+ -+ switch (le32_to_cpu(event->hdr.code)) { -+ case VIRTIO_SND_EVT_JACK_CONNECTED: -+ vjack->connected = true; -+ break; -+ case VIRTIO_SND_EVT_JACK_DISCONNECTED: -+ vjack->connected = false; -+ break; -+ default: -+ return; -+ } -+ -+ snd_jack_report(vjack->jack, vjack->connected ? vjack->type : 0); -+} diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0008-ALSA-virtio-introduce-PCM-channel-map-support.patch b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0008-ALSA-virtio-introduce-PCM-channel-map-support.patch deleted file mode 100644 index d27ddb435..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0008-ALSA-virtio-introduce-PCM-channel-map-support.patch +++ /dev/null @@ -1,335 +0,0 @@ -From 861932797d59b807b4fcc8a2e12dafbddd5ca4d9 Mon Sep 17 00:00:00 2001 -From: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Date: Tue, 2 Mar 2021 17:47:08 +0100 -Subject: [PATCH] ALSA: virtio: introduce PCM channel map support - -Enumerate all available PCM channel maps and create ALSA controls. - -Signed-off-by: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Link: https://lore.kernel.org/r/20210302164709.3142702-9-anton.yakovlev@opensynergy.com -Signed-off-by: Takashi Iwai <tiwai@suse.de> -Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com> ---- - sound/virtio/Makefile | 1 + - sound/virtio/virtio_card.c | 10 ++ - sound/virtio/virtio_card.h | 8 ++ - sound/virtio/virtio_chmap.c | 219 ++++++++++++++++++++++++++++++++++++ - sound/virtio/virtio_pcm.h | 4 + - 5 files changed, 242 insertions(+) - create mode 100644 sound/virtio/virtio_chmap.c - -diff --git a/sound/virtio/Makefile b/sound/virtio/Makefile -index 09f485291285..2742bddb8874 100644 ---- a/sound/virtio/Makefile -+++ b/sound/virtio/Makefile -@@ -4,6 +4,7 @@ obj-$(CONFIG_SND_VIRTIO) += virtio_snd.o - - virtio_snd-objs := \ - virtio_card.o \ -+ virtio_chmap.o \ - virtio_ctl_msg.o \ - virtio_jack.o \ - virtio_pcm.o \ -diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c -index 89bd66c1256e..1c03fcc41c3b 100644 ---- a/sound/virtio/virtio_card.c -+++ b/sound/virtio/virtio_card.c -@@ -231,6 +231,10 @@ static int virtsnd_build_devs(struct virtio_snd *snd) - if (rc) - return rc; - -+ rc = virtsnd_chmap_parse_cfg(snd); -+ if (rc) -+ return rc; -+ - if (snd->njacks) { - rc = virtsnd_jack_build_devs(snd); - if (rc) -@@ -243,6 +247,12 @@ static int virtsnd_build_devs(struct virtio_snd *snd) - return rc; - } - -+ if (snd->nchmaps) { -+ rc = virtsnd_chmap_build_devs(snd); -+ if (rc) -+ return rc; -+ } -+ - return snd_card_register(snd->card); - } - -diff --git a/sound/virtio/virtio_card.h b/sound/virtio/virtio_card.h -index f154313c79fd..86ef3941895e 100644 ---- a/sound/virtio/virtio_card.h -+++ b/sound/virtio/virtio_card.h -@@ -43,6 +43,8 @@ struct virtio_snd_queue { - * @njacks: Number of jacks. - * @substreams: VirtIO PCM substreams. - * @nsubstreams: Number of PCM substreams. -+ * @chmaps: VirtIO channel maps. -+ * @nchmaps: Number of channel maps. - */ - struct virtio_snd { - struct virtio_device *vdev; -@@ -55,6 +57,8 @@ struct virtio_snd { - u32 njacks; - struct virtio_pcm_substream *substreams; - u32 nsubstreams; -+ struct virtio_snd_chmap_info *chmaps; -+ u32 nchmaps; - }; - - /* Message completion timeout in milliseconds (module parameter). */ -@@ -100,4 +104,8 @@ int virtsnd_jack_build_devs(struct virtio_snd *snd); - void virtsnd_jack_event(struct virtio_snd *snd, - struct virtio_snd_event *event); - -+int virtsnd_chmap_parse_cfg(struct virtio_snd *snd); -+ -+int virtsnd_chmap_build_devs(struct virtio_snd *snd); -+ - #endif /* VIRTIO_SND_CARD_H */ -diff --git a/sound/virtio/virtio_chmap.c b/sound/virtio/virtio_chmap.c -new file mode 100644 -index 000000000000..5bc924933a59 ---- /dev/null -+++ b/sound/virtio/virtio_chmap.c -@@ -0,0 +1,219 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * virtio-snd: Virtio sound device -+ * Copyright (C) 2021 OpenSynergy GmbH -+ */ -+#include <linux/virtio_config.h> -+ -+#include "virtio_card.h" -+ -+/* VirtIO->ALSA channel position map */ -+static const u8 g_v2a_position_map[] = { -+ [VIRTIO_SND_CHMAP_NONE] = SNDRV_CHMAP_UNKNOWN, -+ [VIRTIO_SND_CHMAP_NA] = SNDRV_CHMAP_NA, -+ [VIRTIO_SND_CHMAP_MONO] = SNDRV_CHMAP_MONO, -+ [VIRTIO_SND_CHMAP_FL] = SNDRV_CHMAP_FL, -+ [VIRTIO_SND_CHMAP_FR] = SNDRV_CHMAP_FR, -+ [VIRTIO_SND_CHMAP_RL] = SNDRV_CHMAP_RL, -+ [VIRTIO_SND_CHMAP_RR] = SNDRV_CHMAP_RR, -+ [VIRTIO_SND_CHMAP_FC] = SNDRV_CHMAP_FC, -+ [VIRTIO_SND_CHMAP_LFE] = SNDRV_CHMAP_LFE, -+ [VIRTIO_SND_CHMAP_SL] = SNDRV_CHMAP_SL, -+ [VIRTIO_SND_CHMAP_SR] = SNDRV_CHMAP_SR, -+ [VIRTIO_SND_CHMAP_RC] = SNDRV_CHMAP_RC, -+ [VIRTIO_SND_CHMAP_FLC] = SNDRV_CHMAP_FLC, -+ [VIRTIO_SND_CHMAP_FRC] = SNDRV_CHMAP_FRC, -+ [VIRTIO_SND_CHMAP_RLC] = SNDRV_CHMAP_RLC, -+ [VIRTIO_SND_CHMAP_RRC] = SNDRV_CHMAP_RRC, -+ [VIRTIO_SND_CHMAP_FLW] = SNDRV_CHMAP_FLW, -+ [VIRTIO_SND_CHMAP_FRW] = SNDRV_CHMAP_FRW, -+ [VIRTIO_SND_CHMAP_FLH] = SNDRV_CHMAP_FLH, -+ [VIRTIO_SND_CHMAP_FCH] = SNDRV_CHMAP_FCH, -+ [VIRTIO_SND_CHMAP_FRH] = SNDRV_CHMAP_FRH, -+ [VIRTIO_SND_CHMAP_TC] = SNDRV_CHMAP_TC, -+ [VIRTIO_SND_CHMAP_TFL] = SNDRV_CHMAP_TFL, -+ [VIRTIO_SND_CHMAP_TFR] = SNDRV_CHMAP_TFR, -+ [VIRTIO_SND_CHMAP_TFC] = SNDRV_CHMAP_TFC, -+ [VIRTIO_SND_CHMAP_TRL] = SNDRV_CHMAP_TRL, -+ [VIRTIO_SND_CHMAP_TRR] = SNDRV_CHMAP_TRR, -+ [VIRTIO_SND_CHMAP_TRC] = SNDRV_CHMAP_TRC, -+ [VIRTIO_SND_CHMAP_TFLC] = SNDRV_CHMAP_TFLC, -+ [VIRTIO_SND_CHMAP_TFRC] = SNDRV_CHMAP_TFRC, -+ [VIRTIO_SND_CHMAP_TSL] = SNDRV_CHMAP_TSL, -+ [VIRTIO_SND_CHMAP_TSR] = SNDRV_CHMAP_TSR, -+ [VIRTIO_SND_CHMAP_LLFE] = SNDRV_CHMAP_LLFE, -+ [VIRTIO_SND_CHMAP_RLFE] = SNDRV_CHMAP_RLFE, -+ [VIRTIO_SND_CHMAP_BC] = SNDRV_CHMAP_BC, -+ [VIRTIO_SND_CHMAP_BLC] = SNDRV_CHMAP_BLC, -+ [VIRTIO_SND_CHMAP_BRC] = SNDRV_CHMAP_BRC -+}; -+ -+/** -+ * virtsnd_chmap_parse_cfg() - Parse the channel map configuration. -+ * @snd: VirtIO sound device. -+ * -+ * This function is called during initial device initialization. -+ * -+ * Context: Any context that permits to sleep. -+ * Return: 0 on success, -errno on failure. -+ */ -+int virtsnd_chmap_parse_cfg(struct virtio_snd *snd) -+{ -+ struct virtio_device *vdev = snd->vdev; -+ u32 i; -+ int rc; -+ -+ virtio_cread_le(vdev, struct virtio_snd_config, chmaps, &snd->nchmaps); -+ if (!snd->nchmaps) -+ return 0; -+ -+ snd->chmaps = devm_kcalloc(&vdev->dev, snd->nchmaps, -+ sizeof(*snd->chmaps), GFP_KERNEL); -+ if (!snd->chmaps) -+ return -ENOMEM; -+ -+ rc = virtsnd_ctl_query_info(snd, VIRTIO_SND_R_CHMAP_INFO, 0, -+ snd->nchmaps, sizeof(*snd->chmaps), -+ snd->chmaps); -+ if (rc) -+ return rc; -+ -+ /* Count the number of channel maps per each PCM device/stream. */ -+ for (i = 0; i < snd->nchmaps; ++i) { -+ struct virtio_snd_chmap_info *info = &snd->chmaps[i]; -+ u32 nid = le32_to_cpu(info->hdr.hda_fn_nid); -+ struct virtio_pcm *vpcm; -+ struct virtio_pcm_stream *vs; -+ -+ vpcm = virtsnd_pcm_find_or_create(snd, nid); -+ if (IS_ERR(vpcm)) -+ return PTR_ERR(vpcm); -+ -+ switch (info->direction) { -+ case VIRTIO_SND_D_OUTPUT: -+ vs = &vpcm->streams[SNDRV_PCM_STREAM_PLAYBACK]; -+ break; -+ case VIRTIO_SND_D_INPUT: -+ vs = &vpcm->streams[SNDRV_PCM_STREAM_CAPTURE]; -+ break; -+ default: -+ dev_err(&vdev->dev, -+ "chmap #%u: unknown direction (%u)\n", i, -+ info->direction); -+ return -EINVAL; -+ } -+ -+ vs->nchmaps++; -+ } -+ -+ return 0; -+} -+ -+/** -+ * virtsnd_chmap_add_ctls() - Create an ALSA control for channel maps. -+ * @pcm: ALSA PCM device. -+ * @direction: PCM stream direction (SNDRV_PCM_STREAM_XXX). -+ * @vs: VirtIO PCM stream. -+ * -+ * Context: Any context. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_chmap_add_ctls(struct snd_pcm *pcm, int direction, -+ struct virtio_pcm_stream *vs) -+{ -+ u32 i; -+ int max_channels = 0; -+ -+ for (i = 0; i < vs->nchmaps; i++) -+ if (max_channels < vs->chmaps[i].channels) -+ max_channels = vs->chmaps[i].channels; -+ -+ return snd_pcm_add_chmap_ctls(pcm, direction, vs->chmaps, max_channels, -+ 0, NULL); -+} -+ -+/** -+ * virtsnd_chmap_build_devs() - Build ALSA controls for channel maps. -+ * @snd: VirtIO sound device. -+ * -+ * Context: Any context. -+ * Return: 0 on success, -errno on failure. -+ */ -+int virtsnd_chmap_build_devs(struct virtio_snd *snd) -+{ -+ struct virtio_device *vdev = snd->vdev; -+ struct virtio_pcm *vpcm; -+ struct virtio_pcm_stream *vs; -+ u32 i; -+ int rc; -+ -+ /* Allocate channel map elements per each PCM device/stream. */ -+ list_for_each_entry(vpcm, &snd->pcm_list, list) { -+ for (i = 0; i < ARRAY_SIZE(vpcm->streams); ++i) { -+ vs = &vpcm->streams[i]; -+ -+ if (!vs->nchmaps) -+ continue; -+ -+ vs->chmaps = devm_kcalloc(&vdev->dev, vs->nchmaps + 1, -+ sizeof(*vs->chmaps), -+ GFP_KERNEL); -+ if (!vs->chmaps) -+ return -ENOMEM; -+ -+ vs->nchmaps = 0; -+ } -+ } -+ -+ /* Initialize channel maps per each PCM device/stream. */ -+ for (i = 0; i < snd->nchmaps; ++i) { -+ struct virtio_snd_chmap_info *info = &snd->chmaps[i]; -+ unsigned int channels = info->channels; -+ unsigned int ch; -+ struct snd_pcm_chmap_elem *chmap; -+ -+ vpcm = virtsnd_pcm_find(snd, le32_to_cpu(info->hdr.hda_fn_nid)); -+ if (IS_ERR(vpcm)) -+ return PTR_ERR(vpcm); -+ -+ if (info->direction == VIRTIO_SND_D_OUTPUT) -+ vs = &vpcm->streams[SNDRV_PCM_STREAM_PLAYBACK]; -+ else -+ vs = &vpcm->streams[SNDRV_PCM_STREAM_CAPTURE]; -+ -+ chmap = &vs->chmaps[vs->nchmaps++]; -+ -+ if (channels > ARRAY_SIZE(chmap->map)) -+ channels = ARRAY_SIZE(chmap->map); -+ -+ chmap->channels = channels; -+ -+ for (ch = 0; ch < channels; ++ch) { -+ u8 position = info->positions[ch]; -+ -+ if (position >= ARRAY_SIZE(g_v2a_position_map)) -+ return -EINVAL; -+ -+ chmap->map[ch] = g_v2a_position_map[position]; -+ } -+ } -+ -+ /* Create an ALSA control per each PCM device/stream. */ -+ list_for_each_entry(vpcm, &snd->pcm_list, list) { -+ if (!vpcm->pcm) -+ continue; -+ -+ for (i = 0; i < ARRAY_SIZE(vpcm->streams); ++i) { -+ vs = &vpcm->streams[i]; -+ -+ if (!vs->nchmaps) -+ continue; -+ -+ rc = virtsnd_chmap_add_ctls(vpcm->pcm, i, vs); -+ if (rc) -+ return rc; -+ } -+ } -+ -+ return 0; -+} -diff --git a/sound/virtio/virtio_pcm.h b/sound/virtio/virtio_pcm.h -index efd0228746cf..1353fdc9bd69 100644 ---- a/sound/virtio/virtio_pcm.h -+++ b/sound/virtio/virtio_pcm.h -@@ -63,10 +63,14 @@ struct virtio_pcm_substream { - * struct virtio_pcm_stream - VirtIO PCM stream. - * @substreams: VirtIO substreams belonging to the stream. - * @nsubstreams: Number of substreams. -+ * @chmaps: Kernel channel maps belonging to the stream. -+ * @nchmaps: Number of channel maps. - */ - struct virtio_pcm_stream { - struct virtio_pcm_substream **substreams; - u32 nsubstreams; -+ struct snd_pcm_chmap_elem *chmaps; -+ u32 nchmaps; - }; - - /** diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0009-ALSA-virtio-introduce-device-suspend-resume-support.patch b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0009-ALSA-virtio-introduce-device-suspend-resume-support.patch deleted file mode 100644 index b7d278fd0..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/0009-ALSA-virtio-introduce-device-suspend-resume-support.patch +++ /dev/null @@ -1,174 +0,0 @@ -From b173fb2a0eb0067fc665ba48f9b2b8b5f991c078 Mon Sep 17 00:00:00 2001 -From: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Date: Tue, 2 Mar 2021 17:47:09 +0100 -Subject: [PATCH] ALSA: virtio: introduce device suspend/resume support - -All running PCM substreams are stopped on device suspend and restarted -on device resume. - -Signed-off-by: Anton Yakovlev <anton.yakovlev@opensynergy.com> -Link: https://lore.kernel.org/r/20210302164709.3142702-10-anton.yakovlev@opensynergy.com -Signed-off-by: Takashi Iwai <tiwai@suse.de> -Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com> ---- - sound/virtio/virtio_card.c | 56 +++++++++++++++++++++++++++++++++++ - sound/virtio/virtio_pcm.h | 3 ++ - sound/virtio/virtio_pcm_ops.c | 33 ++++++++++++++++----- - 3 files changed, 85 insertions(+), 7 deletions(-) - -diff --git a/sound/virtio/virtio_card.c b/sound/virtio/virtio_card.c -index 1c03fcc41c3b..ae9128063917 100644 ---- a/sound/virtio/virtio_card.c -+++ b/sound/virtio/virtio_card.c -@@ -362,6 +362,58 @@ static void virtsnd_remove(struct virtio_device *vdev) - kfree(snd->event_msgs); - } - -+#ifdef CONFIG_PM_SLEEP -+/** -+ * virtsnd_freeze() - Suspend device. -+ * @vdev: VirtIO parent device. -+ * -+ * Context: Any context. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_freeze(struct virtio_device *vdev) -+{ -+ struct virtio_snd *snd = vdev->priv; -+ unsigned int i; -+ -+ virtsnd_disable_event_vq(snd); -+ virtsnd_ctl_msg_cancel_all(snd); -+ -+ vdev->config->del_vqs(vdev); -+ vdev->config->reset(vdev); -+ -+ for (i = 0; i < snd->nsubstreams; ++i) -+ cancel_work_sync(&snd->substreams[i].elapsed_period); -+ -+ kfree(snd->event_msgs); -+ snd->event_msgs = NULL; -+ -+ return 0; -+} -+ -+/** -+ * virtsnd_restore() - Resume device. -+ * @vdev: VirtIO parent device. -+ * -+ * Context: Any context. -+ * Return: 0 on success, -errno on failure. -+ */ -+static int virtsnd_restore(struct virtio_device *vdev) -+{ -+ struct virtio_snd *snd = vdev->priv; -+ int rc; -+ -+ rc = virtsnd_find_vqs(snd); -+ if (rc) -+ return rc; -+ -+ virtio_device_ready(vdev); -+ -+ virtsnd_enable_event_vq(snd); -+ -+ return 0; -+} -+#endif /* CONFIG_PM_SLEEP */ -+ - static const struct virtio_device_id id_table[] = { - { VIRTIO_ID_SOUND, VIRTIO_DEV_ANY_ID }, - { 0 }, -@@ -374,6 +426,10 @@ static struct virtio_driver virtsnd_driver = { - .validate = virtsnd_validate, - .probe = virtsnd_probe, - .remove = virtsnd_remove, -+#ifdef CONFIG_PM_SLEEP -+ .freeze = virtsnd_freeze, -+ .restore = virtsnd_restore, -+#endif - }; - - static int __init init(void) -diff --git a/sound/virtio/virtio_pcm.h b/sound/virtio/virtio_pcm.h -index 1353fdc9bd69..062eb8e8f2cf 100644 ---- a/sound/virtio/virtio_pcm.h -+++ b/sound/virtio/virtio_pcm.h -@@ -31,6 +31,8 @@ struct virtio_pcm_msg; - * @xfer_xrun: Data underflow/overflow state (0 - no xrun, 1 - xrun). - * @stopped: True if the substream is stopped and must be released on the device - * side. -+ * @suspended: True if the substream is suspended and must be reconfigured on -+ * the device side at resume. - * @msgs: Allocated I/O messages. - * @nmsgs: Number of allocated I/O messages. - * @msg_last_enqueued: Index of the last I/O message added to the virtqueue. -@@ -52,6 +54,7 @@ struct virtio_pcm_substream { - bool xfer_enabled; - bool xfer_xrun; - bool stopped; -+ bool suspended; - struct virtio_pcm_msg **msgs; - unsigned int nmsgs; - int msg_last_enqueued; -diff --git a/sound/virtio/virtio_pcm_ops.c b/sound/virtio/virtio_pcm_ops.c -index 0682a2df6c8c..f8bfb87624be 100644 ---- a/sound/virtio/virtio_pcm_ops.c -+++ b/sound/virtio/virtio_pcm_ops.c -@@ -115,6 +115,7 @@ static int virtsnd_pcm_open(struct snd_pcm_substream *substream) - SNDRV_PCM_HW_PARAM_PERIODS); - - vss->stopped = !!virtsnd_pcm_msg_pending_num(vss); -+ vss->suspended = false; - - /* - * If the substream has already been used, then the I/O queue may be in -@@ -272,16 +273,31 @@ static int virtsnd_pcm_prepare(struct snd_pcm_substream *substream) - struct virtio_device *vdev = vss->snd->vdev; - struct virtio_snd_msg *msg; - -- if (virtsnd_pcm_msg_pending_num(vss)) { -- dev_err(&vdev->dev, "SID %u: invalid I/O queue state\n", -- vss->sid); -- return -EBADFD; -+ if (!vss->suspended) { -+ if (virtsnd_pcm_msg_pending_num(vss)) { -+ dev_err(&vdev->dev, "SID %u: invalid I/O queue state\n", -+ vss->sid); -+ return -EBADFD; -+ } -+ -+ vss->buffer_bytes = snd_pcm_lib_buffer_bytes(substream); -+ vss->hw_ptr = 0; -+ vss->msg_last_enqueued = -1; -+ } else { -+ struct snd_pcm_runtime *runtime = substream->runtime; -+ unsigned int buffer_bytes = snd_pcm_lib_buffer_bytes(substream); -+ unsigned int period_bytes = snd_pcm_lib_period_bytes(substream); -+ int rc; -+ -+ rc = virtsnd_pcm_dev_set_params(vss, buffer_bytes, period_bytes, -+ runtime->channels, -+ runtime->format, runtime->rate); -+ if (rc) -+ return rc; - } - -- vss->buffer_bytes = snd_pcm_lib_buffer_bytes(substream); -- vss->hw_ptr = 0; - vss->xfer_xrun = false; -- vss->msg_last_enqueued = -1; -+ vss->suspended = false; - vss->msg_count = 0; - - msg = virtsnd_pcm_ctl_msg_alloc(vss, VIRTIO_SND_R_PCM_PREPARE, -@@ -336,6 +352,9 @@ static int virtsnd_pcm_trigger(struct snd_pcm_substream *substream, int command) - } - - return virtsnd_ctl_msg_send_sync(snd, msg); -+ case SNDRV_PCM_TRIGGER_SUSPEND: -+ vss->suspended = true; -+ fallthrough; - case SNDRV_PCM_TRIGGER_STOP: - vss->stopped = true; - fallthrough; diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/virtio-snd.cfg b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/virtio-snd.cfg deleted file mode 100644 index 35c5134a0..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/virtio-snd.cfg +++ /dev/null @@ -1,5 +0,0 @@ -CONFIG_SND_TIMER=y -CONFIG_SND_PCM=y -CONFIG_SND_JACK=y -CONFIG_SND_JACK_INPUT_DEV=y -CONFIG_SND_VIRTIO=y
\ No newline at end of file diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/virtio-snd.scc b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/virtio-snd.scc deleted file mode 100644 index ba7b4ceb6..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio-snd/virtio-snd.scc +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-License-Identifier: MIT -kconf hardware virtio-snd.cfg -patch 0001-uapi-virtio_ids-add-a-sound-device-type-ID-from-OASI.patch -patch 0002-ALSA-virtio-add-virtio-sound-driver.patch -patch 0003-ALSA-virtio-handling-control-messages.patch -patch 0004-ALSA-virtio-build-PCM-devices-and-substream-hardware.patch -patch 0005-ALSA-virtio-handling-control-and-I-O-messages-for-th.patch -patch 0006-ALSA-virtio-PCM-substream-operators.patch -patch 0007-ALSA-virtio-introduce-jack-support.patch -patch 0008-ALSA-virtio-introduce-PCM-channel-map-support.patch -patch 0009-ALSA-virtio-introduce-device-suspend-resume-support.patch diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio.cfg b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio.cfg deleted file mode 100644 index b8b36e7ad..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio.cfg +++ /dev/null @@ -1,16 +0,0 @@ -# SPDX-License-Identifier: MIT - -# TODO: upstream to yocto-kernel-cache/cfg/8250.cfg -CONFIG_SERIAL_OF_PLATFORM=y - -# Remove since PCI is not enabled -# CONFIG_SERIAL_8250_PCI is not set - -# TODO: upstream to yocto-kernel-cache/cfg/virtio.cfg -CONFIG_VSOCKETS=y -CONFIG_VSOCKETS_DIAG=y -CONFIG_VIRTIO_VSOCKETS=y -CONFIG_VIRTIO_VSOCKETS_COMMON=y - -# Needed for CONFIG_DRM_VIRTIO_GPU -CONFIG_DRM=y diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio.scc b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio.scc deleted file mode 100644 index 755cde94e..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-kmeta/bsp/virtio/virtio.scc +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: MIT -kconf hardware virtio.cfg -patch virtio-input-add-multi-touch-support.patch - -include virtio-snd/virtio-snd.scc diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-pci.cfg b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-pci.cfg new file mode 100644 index 000000000..bbcaca312 --- /dev/null +++ b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto/virtio-pci.cfg @@ -0,0 +1,3 @@ +CONFIG_PCI=y +CONFIG_VIRTIO_PCI=y +CONFIG_PCI_HOST_GENERIC=y diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_%.bbappend b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_%.bbappend deleted file mode 100644 index 0f255cddb..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_%.bbappend +++ /dev/null @@ -1,8 +0,0 @@ -FILESEXTRAPATHS:prepend := "${THISDIR}/linux-yocto:" - -SRC_URI:append:virtio-all = " \ - file://virtio-kmeta;type=kmeta;destsuffix=virtio-kmeta \ - file://virtio-kmeta/bsp/virtio/virtio-aarch64-${LINUX_KERNEL_TYPE}.scc \ -" - -COMPATIBLE_MACHINE_virtio-aarch64 = "virtio-aarch64" diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_5.10.bb b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_5.10.bb deleted file mode 100644 index 322ae51ea..000000000 --- a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_5.10.bb +++ /dev/null @@ -1,58 +0,0 @@ -KBRANCH ?= "v5.10/standard/base" - -require recipes-kernel/linux/linux-yocto.inc - -# board specific branches -KBRANCH:qemuarm ?= "v5.10/standard/arm-versatile-926ejs" -KBRANCH:qemuarm64 ?= "v5.10/standard/qemuarm64" -KBRANCH:qemumips ?= "v5.10/standard/mti-malta32" -KBRANCH:qemuppc ?= "v5.10/standard/qemuppc" -KBRANCH:qemuriscv64 ?= "v5.10/standard/base" -KBRANCH:qemuriscv32 ?= "v5.10/standard/base" -KBRANCH:qemux86 ?= "v5.10/standard/base" -KBRANCH:qemux86-64 ?= "v5.10/standard/base" -KBRANCH:qemumips64 ?= "v5.10/standard/mti-malta64" - -SRCREV_machine:qemuarm ?= "d8551cae1ccdbe062a5c6068ce39ea8f4e1c72db" -SRCREV_machine:qemuarm64 ?= "cf5b0320cf4544d3db9ce3ddd6ddb7553a610651" -SRCREV_machine:qemumips ?= "7f1f1ad2f2d90b1b070c6b0a82f0add9aa492e37" -SRCREV_machine:qemuppc ?= "cf5b0320cf4544d3db9ce3ddd6ddb7553a610651" -SRCREV_machine:qemuriscv64 ?= "cf5b0320cf4544d3db9ce3ddd6ddb7553a610651" -SRCREV_machine:qemuriscv32 ?= "cf5b0320cf4544d3db9ce3ddd6ddb7553a610651" -SRCREV_machine:qemux86 ?= "cf5b0320cf4544d3db9ce3ddd6ddb7553a610651" -SRCREV_machine:qemux86-64 ?= "cf5b0320cf4544d3db9ce3ddd6ddb7553a610651" -SRCREV_machine:qemumips64 ?= "fd5ac097b891642eea13659bea536f3ec5910d6d" -SRCREV_machine ?= "cf5b0320cf4544d3db9ce3ddd6ddb7553a610651" -SRCREV_meta ?= "031f6c76e488a3563f35258c72ff1de3e25a512e" - -# remap qemuarm to qemuarma15 for the 5.8 kernel -# KMACHINE:qemuarm ?= "qemuarma15" - -SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;name=machine;branch=${KBRANCH}; \ - git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-5.10;destsuffix=${KMETA}" - -LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46" -LINUX_VERSION ?= "5.10.25" - -DEPENDS += "${@bb.utils.contains('ARCH', 'x86', 'elfutils-native', '', d)}" -DEPENDS += "openssl-native util-linux-native" -DEPENDS += "gmp-native" - -PV = "${LINUX_VERSION}+git${SRCPV}" - -KMETA = "kernel-meta" -KCONF_BSP_AUDIT_LEVEL = "1" - -KERNEL_DEVICETREE:qemuarmv5 = "versatile-pb.dtb" - -COMPATIBLE_MACHINE = "qemuarm|qemuarmv5|qemuarm64|qemux86|qemuppc|qemuppc64|qemumips|qemumips64|qemux86-64|qemuriscv64|qemuriscv32" - -# Functionality flags -KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc" -KERNEL_FEATURES:append = " ${KERNEL_EXTRA_FEATURES}" -KERNEL_FEATURES:append:qemuall=" cfg/virtio.scc features/drm-bochs/drm-bochs.scc" -KERNEL_FEATURES:append:qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc" -KERNEL_FEATURES:append:qemux86-64=" cfg/sound.scc cfg/paravirt_kvm.scc" -KERNEL_FEATURES:append = " ${@bb.utils.contains("TUNE_FEATURES", "mx32", " cfg/x32.scc", "", d)}" -KERNEL_FEATURES:append = " ${@bb.utils.contains("DISTRO_FEATURES", "ptest", " features/scsi/scsi-debug.scc", "", d)}" -KERNEL_FEATURES:append = " ${@bb.utils.contains("DISTRO_FEATURES", "ptest", " features/gpio/mockup.scc", "", d)}"
\ No newline at end of file diff --git a/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_6.6.bbappend b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_6.6.bbappend new file mode 100644 index 000000000..6952436a3 --- /dev/null +++ b/meta-agl-bsp/virtualization-layer/recipes-kernel/linux/linux-yocto_6.6.bbappend @@ -0,0 +1,17 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" + +# Cannot just append to SRC_URI, as the metadata interferes with the +# AGL config fragment scheme +AGL_KERNEL_SRC:prepend:virtio-all = " \ + git://gerrit.automotivelinux.org/gerrit/src/agl-yocto-kernel-meta.git;protocol=https;type=kmeta;name=agl-meta;destsuffix=agl-kernel-meta;branch=kernel-5.15 \ + file://virtio-aarch64-${LINUX_KERNEL_TYPE}.scc \ +" + +SRCREV_agl-meta = "4deb7357eab5962b0553a5ad1f11be5ac35f9da9" + +AGL_KCONFIG_FRAGMENTS:append:virtio-all = " \ + virtio-drm.cfg \ + virtio-pci.cfg \ +" + +COMPATIBLE_MACHINE:virtio-aarch64 = "virtio-aarch64" |