lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Thu, 19 Jan 2023 23:24:17 +0000
From:   Caleb Connolly <caleb.connolly@...aro.org>
To:     Krzysztof Kozlowski <krzysztof.kozlowski@...aro.org>,
        Andy Gross <agross@...nel.org>,
        Bjorn Andersson <andersson@...nel.org>,
        Konrad Dybcio <konrad.dybcio@...aro.org>,
        Rob Herring <robh+dt@...nel.org>,
        Krzysztof Kozlowski <krzysztof.kozlowski+dt@...aro.org>,
        linux-arm-msm@...r.kernel.org, devicetree@...r.kernel.org,
        linux-kernel@...r.kernel.org,
        Srinivas Kandagatla <srinivas.kandagatla@...aro.org>
Subject: Re: [RFT PATCH v2 4/6] arm64: dts: qcom: sdm845: move audio to
 separate file



On 18/01/2023 10:34, Krzysztof Kozlowski wrote:
> Re-organize SDM845 sound components into separate, audio DTSI which
> should be included and customized by the SDM845 boards wanting audio.
> The DTSI includes:
> 1. WCD9340 codec node because it is not a property of the SoC, but board.
> 2. Common sound DAI links, shared with all sound cards.

Hi Krzysztof,

I know I already reported this on IRC, I thought I'd duplicate the info
here for completeness sake.

Due to how the sound node is parsed the device numbers in alsa are
derived from the index of the sound/mmX-dai-link child nodes.

For boards which use more than 3 FE's this causes breaking changes in
userspace, as the slim-dai-link and slimcap-dai-link nodes now come
before the other mmX-dai-link nodes, for example with my OnePlus 6
patches "aplay -l" shows:

card 0: O6 [OnePlus 6], device 0: MultiMedia1 (*) []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: O6 [OnePlus 6], device 1: MultiMedia2 (*) []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: O6 [OnePlus 6], device 2: MultiMedia3 (*) []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: O6 [OnePlus 6], device 5: MultiMedia4 (*) [] <-- 5 instead of 3
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: O6 [OnePlus 6], device 6: MultiMedia5 (*) []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: O6 [OnePlus 6], device 7: MultiMedia6 (*) []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

This breaks the UCM configs shipped by postmarketOS and Mobian - though
none of it is "upstream".

Would it be reasonable to add all 6 FE DAI's and then disable the unused
ones on a per-board basis?

> 
> The Xiaomi Polaris, although includes WCD9340 codec, it lacks sound
> node, so it stays disabled.
> 
> On all others boards not using audio, keep the Slimbus node disabled as
> it is empty.
> 
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@...aro.org>
> 
> ---
> 
> Changes since v1:
> 1. Move also sound node.
> 2. Rewrite commit msg.
> 
> RFC - please kindly test the boards.
> ---
>  .../boot/dts/qcom/sdm845-audio-wcd9340.dtsi   | 125 ++++++++++++++++++
>  arch/arm64/boot/dts/qcom/sdm845-db845c.dts    |  55 +-------
>  .../qcom/sdm845-xiaomi-beryllium-common.dtsi  |  53 +-------
>  .../boot/dts/qcom/sdm845-xiaomi-polaris.dts   |   1 +
>  arch/arm64/boot/dts/qcom/sdm845.dtsi          |  60 +--------
>  .../boot/dts/qcom/sdm850-lenovo-yoga-c630.dts |  59 ++-------
>  .../boot/dts/qcom/sdm850-samsung-w737.dts     |  60 ++-------
>  7 files changed, 151 insertions(+), 262 deletions(-)
>  create mode 100644 arch/arm64/boot/dts/qcom/sdm845-audio-wcd9340.dtsi
> 
> diff --git a/arch/arm64/boot/dts/qcom/sdm845-audio-wcd9340.dtsi b/arch/arm64/boot/dts/qcom/sdm845-audio-wcd9340.dtsi
> new file mode 100644
> index 000000000000..0a94fde6741d
> --- /dev/null
> +++ b/arch/arm64/boot/dts/qcom/sdm845-audio-wcd9340.dtsi
> @@ -0,0 +1,125 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * SDM845 SoC device tree source
> + *
> + * Copyright (c) 2018, The Linux Foundation. All rights reserved.
> + */
> +
> +&slim {
> +	status = "okay";
> +
> +	slim@1 {
> +		reg = <1>;
> +		#address-cells = <2>;
> +		#size-cells = <0>;
> +
> +		wcd9340_ifd: ifd@0,0 {
> +			compatible = "slim217,250";
> +			reg = <0 0>;
> +		};
> +
> +		wcd9340: codec@1,0 {
> +			compatible = "slim217,250";
> +			reg = <1 0>;
> +			slim-ifc-dev = <&wcd9340_ifd>;
> +
> +			#sound-dai-cells = <1>;
> +
> +			interrupts-extended = <&tlmm 54 IRQ_TYPE_LEVEL_HIGH>;
> +			interrupt-controller;
> +			#interrupt-cells = <1>;
> +
> +			#clock-cells = <0>;
> +			clock-frequency = <9600000>;
> +			clock-output-names = "mclk";
> +			qcom,micbias1-microvolt = <1800000>;
> +			qcom,micbias2-microvolt = <1800000>;
> +			qcom,micbias3-microvolt = <1800000>;
> +			qcom,micbias4-microvolt = <1800000>;
> +
> +			#address-cells = <1>;
> +			#size-cells = <1>;
> +
> +			wcdgpio: gpio-controller@42 {
> +				compatible = "qcom,wcd9340-gpio";
> +				gpio-controller;
> +				#gpio-cells = <2>;
> +				reg = <0x42 0x2>;
> +			};
> +
> +			swm: swm@c85 {
> +				compatible = "qcom,soundwire-v1.3.0";
> +				reg = <0xc85 0x40>;
> +				interrupts-extended = <&wcd9340 20>;
> +
> +				qcom,dout-ports = <6>;
> +				qcom,din-ports = <2>;
> +				qcom,ports-sinterval-low = /bits/ 8  <0x07 0x1f 0x3f 0x7 0x1f 0x3f 0x0f 0x0f>;
> +				qcom,ports-offset1 = /bits/ 8 <0x01 0x02 0x0c 0x6 0x12 0x0d 0x07 0x0a>;
> +				qcom,ports-offset2 = /bits/ 8 <0x00 0x00 0x1f 0x00 0x00 0x1f 0x00 0x00>;
> +
> +				#sound-dai-cells = <1>;
> +				clocks = <&wcd9340>;
> +				clock-names = "iface";
> +				#address-cells = <2>;
> +				#size-cells = <0>;
> +			};
> +		};
> +	};
> +};
> +
> +&sound {
> +	compatible = "qcom,sdm845-sndcard";
> +	status = "disabled";
> +
> +	mm1-dai-link {
> +		link-name = "MultiMedia1";
> +		cpu {
> +			sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA1>;
> +		};
> +	};
> +
> +	mm2-dai-link {
> +		link-name = "MultiMedia2";
> +		cpu {
> +			sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA2>;
> +		};
> +	};
> +
> +	mm3-dai-link {
> +		link-name = "MultiMedia3";
> +		cpu {
> +			sound-dai = <&q6asmdai MSM_FRONTEND_DAI_MULTIMEDIA3>;
> +		};
> +	};
> +
> +	sound_slim_dai_link: slim-dai-link {
> +		link-name = "SLIM Playback";
> +		cpu {
> +			sound-dai = <&q6afedai SLIMBUS_0_RX>;
> +		};
> +
> +		platform {
> +			sound-dai = <&q6routing>;
> +		};
> +
> +		codec {
> +			sound-dai = <&wcd9340 0>;
> +		};
> +	};
> +
> +	slimcap-dai-link {
> +		link-name = "SLIM Capture";
> +		cpu {
> +			sound-dai = <&q6afedai SLIMBUS_0_TX>;
> +		};
> +
> +		platform {
> +			sound-dai = <&q6routing>;
> +		};
> +
> +		codec {
> +			sound-dai = <&wcd9340 1>;
> +		};
> +	};
> +};
> diff --git a/arch/arm64/boot/dts/qcom/sdm845-db845c.dts b/arch/arm64/boot/dts/qcom/sdm845-db845c.dts
> index 4833e89affc2..11b0554a6aea 100644
> --- a/arch/arm64/boot/dts/qcom/sdm845-db845c.dts
> +++ b/arch/arm64/boot/dts/qcom/sdm845-db845c.dts
> @@ -11,6 +11,7 @@
>  #include <dt-bindings/sound/qcom,q6afe.h>
>  #include <dt-bindings/sound/qcom,q6asm.h>
>  #include "sdm845.dtsi"
> +#include "sdm845-audio-wcd9340.dtsi"
>  #include "pm8998.dtsi"
>  #include "pmi8998.dtsi"
>  
> @@ -726,27 +727,7 @@ &quat_mi2s_sd2_active
>  		"MM_DL2",  "MultiMedia2 Playback",
>  		"MM_DL4",  "MultiMedia4 Playback",
>  		"MultiMedia3 Capture", "MM_UL3";
> -
> -	mm1-dai-link {
> -		link-name = "MultiMedia1";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA1>;
> -		};
> -	};
> -
> -	mm2-dai-link {
> -		link-name = "MultiMedia2";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA2>;
> -		};
> -	};
> -
> -	mm3-dai-link {
> -		link-name = "MultiMedia3";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA3>;
> -		};
> -	};
> +	status = "okay";
>  
>  	mm4-dai-link {
>  		link-name = "MultiMedia4";
> @@ -769,35 +750,11 @@ codec {
>  			sound-dai = <&lt9611_codec 0>;
>  		};
>  	};
> +};
>  
> -	slim-dai-link {
> -		link-name = "SLIM Playback";
> -		cpu {
> -			sound-dai = <&q6afedai SLIMBUS_0_RX>;
> -		};
> -
> -		platform {
> -			sound-dai = <&q6routing>;
> -		};
> -
> -		codec {
> -			sound-dai = <&left_spkr>, <&right_spkr>, <&swm 0>, <&wcd9340 0>;
> -		};
> -	};
> -
> -	slimcap-dai-link {
> -		link-name = "SLIM Capture";
> -		cpu {
> -			sound-dai = <&q6afedai SLIMBUS_0_TX>;
> -		};
> -
> -		platform {
> -			sound-dai = <&q6routing>;
> -		};
> -
> -		codec {
> -			sound-dai = <&wcd9340 1>;
> -		};
> +&sound_slim_dai_link {
> +	codec {
> +		sound-dai = <&left_spkr>, <&right_spkr>, <&swm 0>, <&wcd9340 0>;
>  	};
>  };
>  
> diff --git a/arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium-common.dtsi b/arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium-common.dtsi
> index 5de8b4c372fc..54eabacdc031 100644
> --- a/arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium-common.dtsi
> +++ b/arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium-common.dtsi
> @@ -7,6 +7,7 @@
>  #include <dt-bindings/sound/qcom,q6afe.h>
>  #include <dt-bindings/sound/qcom,q6asm.h>
>  #include "sdm845.dtsi"
> +#include "sdm845-audio-wcd9340.dtsi"
>  #include "pm8998.dtsi"
>  #include "pmi8998.dtsi"
>  
> @@ -384,57 +385,7 @@ &sound {
>  		"AMIC1", "MIC BIAS1",
>  		"AMIC2", "MIC BIAS2",
>  		"AMIC3", "MIC BIAS3";
> -
> -	mm1-dai-link {
> -		link-name = "MultiMedia1";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA1>;
> -		};
> -	};
> -
> -	mm2-dai-link {
> -		link-name = "MultiMedia2";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA2>;
> -		};
> -	};
> -
> -	mm3-dai-link {
> -		link-name = "MultiMedia3";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA3>;
> -		};
> -	};
> -
> -	slim-dai-link {
> -		link-name = "SLIM Playback";
> -		cpu {
> -			sound-dai = <&q6afedai SLIMBUS_0_RX>;
> -		};
> -
> -		platform {
> -			sound-dai = <&q6routing>;
> -		};
> -
> -		codec {
> -			sound-dai = <&wcd9340 0>;
> -		};
> -	};
> -
> -	slimcap-dai-link {
> -		link-name = "SLIM Capture";
> -		cpu {
> -			sound-dai = <&q6afedai SLIMBUS_0_TX>;
> -		};
> -
> -		platform {
> -			sound-dai = <&q6routing>;
> -		};
> -
> -		codec {
> -			sound-dai = <&wcd9340 1>;
> -		};
> -	};
> +	status = "okay";
>  };
>  
>  &tlmm {
> diff --git a/arch/arm64/boot/dts/qcom/sdm845-xiaomi-polaris.dts b/arch/arm64/boot/dts/qcom/sdm845-xiaomi-polaris.dts
> index a80c3dd9a2da..f81619c8a3ba 100644
> --- a/arch/arm64/boot/dts/qcom/sdm845-xiaomi-polaris.dts
> +++ b/arch/arm64/boot/dts/qcom/sdm845-xiaomi-polaris.dts
> @@ -13,6 +13,7 @@
>  #include <dt-bindings/sound/qcom,q6afe.h>
>  #include <dt-bindings/sound/qcom,q6asm.h>
>  #include "sdm845.dtsi"
> +#include "sdm845-audio-wcd9340.dtsi"
>  #include "pm8998.dtsi"
>  #include "pmi8998.dtsi"
>  #include "pm8005.dtsi"
> diff --git a/arch/arm64/boot/dts/qcom/sdm845.dtsi b/arch/arm64/boot/dts/qcom/sdm845.dtsi
> index 0f1cb2c8addd..27d1917f5358 100644
> --- a/arch/arm64/boot/dts/qcom/sdm845.dtsi
> +++ b/arch/arm64/boot/dts/qcom/sdm845.dtsi
> @@ -3831,65 +3831,7 @@ slim: slim-ngd@...c0000 {
>  			iommus = <&apps_smmu 0x1806 0x0>;
>  			#address-cells = <1>;
>  			#size-cells = <0>;
> -
> -			slim@1 {
> -				reg = <1>;
> -				#address-cells = <2>;
> -				#size-cells = <0>;
> -
> -				wcd9340_ifd: ifd@0,0 {
> -					compatible = "slim217,250";
> -					reg = <0 0>;
> -				};
> -
> -				wcd9340: codec@1,0 {
> -					compatible = "slim217,250";
> -					reg = <1 0>;
> -					slim-ifc-dev = <&wcd9340_ifd>;
> -
> -					#sound-dai-cells = <1>;
> -
> -					interrupts-extended = <&tlmm 54 IRQ_TYPE_LEVEL_HIGH>;
> -					interrupt-controller;
> -					#interrupt-cells = <1>;
> -
> -					#clock-cells = <0>;
> -					clock-frequency = <9600000>;
> -					clock-output-names = "mclk";
> -					qcom,micbias1-microvolt = <1800000>;
> -					qcom,micbias2-microvolt = <1800000>;
> -					qcom,micbias3-microvolt = <1800000>;
> -					qcom,micbias4-microvolt = <1800000>;
> -
> -					#address-cells = <1>;
> -					#size-cells = <1>;
> -
> -					wcdgpio: gpio-controller@42 {
> -						compatible = "qcom,wcd9340-gpio";
> -						gpio-controller;
> -						#gpio-cells = <2>;
> -						reg = <0x42 0x2>;
> -					};
> -
> -					swm: swm@c85 {
> -						compatible = "qcom,soundwire-v1.3.0";
> -						reg = <0xc85 0x40>;
> -						interrupts-extended = <&wcd9340 20>;
> -
> -						qcom,dout-ports = <6>;
> -						qcom,din-ports = <2>;
> -						qcom,ports-sinterval-low = /bits/ 8  <0x07 0x1f 0x3f 0x7 0x1f 0x3f 0x0f 0x0f>;
> -						qcom,ports-offset1 = /bits/ 8 <0x01 0x02 0x0c 0x6 0x12 0x0d 0x07 0x0a>;
> -						qcom,ports-offset2 = /bits/ 8 <0x00 0x00 0x1f 0x00 0x00 0x1f 0x00 0x00>;
> -
> -						#sound-dai-cells = <1>;
> -						clocks = <&wcd9340>;
> -						clock-names = "iface";
> -						#address-cells = <2>;
> -						#size-cells = <0>;
> -					};
> -				};
> -			};
> +			status = "disabled";
>  		};
>  
>  		lmh_cluster1: lmh@...70800 {
> diff --git a/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts b/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts
> index d55ffd69155e..b979d8ae8698 100644
> --- a/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts
> +++ b/arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts
> @@ -13,6 +13,7 @@
>  #include <dt-bindings/sound/qcom,q6afe.h>
>  #include <dt-bindings/sound/qcom,q6asm.h>
>  #include "sdm850.dtsi"
> +#include "sdm845-audio-wcd9340.dtsi"
>  #include "pm8998.dtsi"
>  
>  /*
> @@ -522,57 +523,7 @@ &sound {
>  		"MM_DL1",  "MultiMedia1 Playback",
>  		"MM_DL3",  "MultiMedia3 Playback",
>  		"MultiMedia2 Capture", "MM_UL2";
> -
> -	mm1-dai-link {
> -		link-name = "MultiMedia1";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA1>;
> -		};
> -	};
> -
> -	mm2-dai-link {
> -		link-name = "MultiMedia2";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA2>;
> -		};
> -	};
> -
> -	mm3-dai-link {
> -		link-name = "MultiMedia3";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA3>;
> -		};
> -	};
> -
> -	slim-dai-link {
> -		link-name = "SLIM Playback";
> -		cpu {
> -			sound-dai = <&q6afedai SLIMBUS_0_RX>;
> -		};
> -
> -		platform {
> -			sound-dai = <&q6routing>;
> -		};
> -
> -		codec {
> -			sound-dai = <&left_spkr>, <&right_spkr>, <&swm 0>, <&wcd9340 0>;
> -		};
> -	};
> -
> -	slimcap-dai-link {
> -		link-name = "SLIM Capture";
> -		cpu {
> -			sound-dai = <&q6afedai SLIMBUS_0_TX>;
> -		};
> -
> -		platform {
> -			sound-dai = <&q6routing>;
> -		};
> -
> -		codec {
> -			sound-dai = <&wcd9340 1>;
> -		};
> -	};
> +	status = "okay";
>  
>  	slim-wcd-dai-link {
>  		link-name = "SLIM WCD Playback";
> @@ -590,6 +541,12 @@ codec {
>  	};
>  };
>  
> +&sound_slim_dai_link {
> +	codec {
> +		sound-dai = <&left_spkr>, <&right_spkr>, <&swm 0>, <&wcd9340 0>;
> +	};
> +};
> +
>  &tlmm {
>  	gpio-reserved-ranges = <0 4>, <81 4>;
>  
> diff --git a/arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts b/arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts
> index 6730804f4e3e..75773b06701b 100644
> --- a/arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts
> +++ b/arch/arm64/boot/dts/qcom/sdm850-samsung-w737.dts
> @@ -14,6 +14,7 @@
>  #include <dt-bindings/sound/qcom,q6afe.h>
>  #include <dt-bindings/sound/qcom,q6asm.h>
>  #include "sdm850.dtsi"
> +#include "sdm845-audio-wcd9340.dtsi"
>  #include "pm8998.dtsi"
>  
>  /*
> @@ -436,7 +437,6 @@ dai@2 {
>  };
>  
>  &sound {
> -	compatible = "qcom,sdm845-sndcard";
>  	model = "Samsung-W737";
>  
>  	audio-routing =
> @@ -447,57 +447,7 @@ &sound {
>  		"MM_DL1",  "MultiMedia1 Playback",
>  		"MM_DL3",  "MultiMedia3 Playback",
>  		"MultiMedia2 Capture", "MM_UL2";
> -
> -	mm1-dai-link {
> -		link-name = "MultiMedia1";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA1>;
> -		};
> -	};
> -
> -	mm2-dai-link {
> -		link-name = "MultiMedia2";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA2>;
> -		};
> -	};
> -
> -	mm3-dai-link {
> -		link-name = "MultiMedia3";
> -		cpu {
> -			sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA3>;
> -		};
> -	};
> -
> -	slim-dai-link {
> -		link-name = "SLIM Playback";
> -		cpu {
> -			sound-dai = <&q6afedai SLIMBUS_0_RX>;
> -		};
> -
> -		platform {
> -			sound-dai = <&q6routing>;
> -		};
> -
> -		codec {
> -			sound-dai = <&left_spkr>, <&right_spkr>, <&swm 0>, <&wcd9340 0>;
> -		};
> -	};
> -
> -	slimcap-dai-link {
> -		link-name = "SLIM Capture";
> -		cpu {
> -			sound-dai = <&q6afedai SLIMBUS_0_TX>;
> -		};
> -
> -		platform {
> -			sound-dai = <&q6routing>;
> -		};
> -
> -		codec {
> -			sound-dai = <&wcd9340 1>;
> -		};
> -	};
> +	status = "okay";
>  
>  	slim-wcd-dai-link {
>  		link-name = "SLIM WCD Playback";
> @@ -515,6 +465,12 @@ codec {
>  	};
>  };
>  
> +&sound_slim_dai_link {
> +	codec {
> +		sound-dai = <&left_spkr>, <&right_spkr>, <&swm 0>, <&wcd9340 0>;
> +	};
> +};
> +
>  &tlmm {
>  	gpio-reserved-ranges = <0 6>, <85 4>;
>  

-- 
Kind Regards,
Caleb (they/them)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ