From 38e6aee074169c74aff772642f16bac8e1892202 Mon Sep 17 00:00:00 2001 From: Ken Date: Thu, 14 Sep 2023 13:31:22 +0800 Subject: [PATCH] ipq807x: BSP patch for WF-186H Fixes: WIFI-12922 Signed-off-by: Ken --- .../ipq807x/base-files/etc/board.d/02_network | 12 + .../etc/hotplug.d/firmware/10-ath11k-caldata | 18 + .../base-files/lib/upgrade/platform.sh | 2 + .../arm/boot/dts/qcom-ipq5018-cig-wf186h.dts | 23 + .../boot/dts/qcom/qcom-ipq5018-cig-wf186h.dts | 965 ++++++++++++++++++ feeds/ipq807x/ipq807x/image/ipq50xx.mk | 9 + .../files/etc/board.d/04-regdm | 1 + feeds/wifi-ax/ath11k-wifi/Makefile | 2 + .../ath11k-wifi/board-cig-wf186h.bin.IPQ5018 | Bin 0 -> 131072 bytes .../ath11k-wifi/board-cig-wf186h.bin.QCN6122 | Bin 0 -> 131072 bytes profiles/cig_wf186h.yml | 26 + 11 files changed, 1058 insertions(+) create mode 100644 feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-cig-wf186h.dts create mode 100644 feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-cig-wf186h.dts create mode 100755 feeds/wifi-ax/ath11k-wifi/board-cig-wf186h.bin.IPQ5018 create mode 100755 feeds/wifi-ax/ath11k-wifi/board-cig-wf186h.bin.QCN6122 create mode 100644 profiles/cig_wf186h.yml diff --git a/feeds/ipq807x/ipq807x/base-files/etc/board.d/02_network b/feeds/ipq807x/ipq807x/base-files/etc/board.d/02_network index b3e9120b1..7c341f149 100755 --- a/feeds/ipq807x/ipq807x/base-files/etc/board.d/02_network +++ b/feeds/ipq807x/ipq807x/base-files/etc/board.d/02_network @@ -66,6 +66,9 @@ qcom_setup_interfaces() cig,wf186w) ucidef_add_switch "switch0" "4:wan" "0:lan" "1:lan" "2:lan" "3:lan" "6@eth0" ;; + cig,wf186h) + ucidef_add_switch "switch0" "4:wan" "1:lan" "2:lan" "6@eth0" + ;; yuncore,fap650) ucidef_set_interface_lan "eth3 eth2 eth1 eth0" ucidef_set_interface_wan "eth4" @@ -180,6 +183,15 @@ qcom_setup_macs() # ip link set eth1 address $wan_mac # ucidef_set_label_macaddr $wan_mac ;; + cig,wf186h) + mtd=$(find_mtd_chardev "0:APPSBLENV") + [ -z "$mtd" ] && return; + mac=$(grep BaseMacAddress= $mtd | cut -dx -f2) + [ -z "$mac" ] && return; + wan_mac=$(macaddr_canonicalize $mac) + ucidef_set_network_device_mac eth0 $wan_mac + ip link set eth0 address $wan_mac + ;; cybertan,eww631-a1|\ cybertan,eww631-b1) mac=$(grep -i -m 1 BaseMacAddress= /dev/`cat /proc/mtd | grep APPSBLENV | cut -d: -f1` | cut -d= -f2) diff --git a/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata b/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata index 7cd81a6fa..8dc88c875 100755 --- a/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata +++ b/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata @@ -85,6 +85,19 @@ ath11k_generate_macs_wf186w() { echo -ne \\x${mac3//:/\\x} >> /lib/firmware/ath11k-macs } +ath11k_generate_macs_wf186h() { + touch /lib/firmware/ath11k-macs + local dev=$(find_mtd_chardev "0:APPSBLENV") + mac=$(grep BaseMacAddress= $dev | cut -dx -f2) + eth=$(macaddr_canonicalize $mac) + mac1=$(macaddr_add $eth 2) + mac2=$(macaddr_add $eth 3) + mac3=$(macaddr_add $eth 4) + echo -ne \\x${mac1//:/\\x} >> /lib/firmware/ath11k-macs + echo -ne \\x${mac2//:/\\x} >> /lib/firmware/ath11k-macs + echo -ne \\x${mac3//:/\\x} >> /lib/firmware/ath11k-macs +} + caldata_die() { echo "caldata: " "$*" @@ -159,6 +172,7 @@ case "$FIRMWARE" in ath11k/IPQ5018/hw1.0/caldata.bin) case "$board" in cig,wf186w|\ + cig,wf186h|\ cybertan,eww622-a1|\ cybertan,eww631-a1|\ cybertan,eww631-b1|\ @@ -180,6 +194,7 @@ ath11k/IPQ5018/hw1.0/caldata.bin) ath11k/qcn6122/hw1.0/caldata_1.bin) case "$board" in cig,wf186w|\ + cig,wf186h|\ wallys,dr5018|\ hfcl,ion4xi_w|\ hfcl,ion4x_w|\ @@ -269,6 +284,9 @@ ath11k-macs) cig,wf186w) ath11k_generate_macs_wf186w ;; + cig,wf186h) + ath11k_generate_macs_wf186h + ;; esac ;; *) diff --git a/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh b/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh index 93fed0f77..cdd6593e1 100755 --- a/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh +++ b/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh @@ -111,6 +111,7 @@ platform_check_image() { board=$(board_name) case $board in cig,wf186w|\ + cig,wf186h|\ cig,wf188|\ cig,wf660a|\ cig,wf188n|\ @@ -267,6 +268,7 @@ platform_do_upgrade() { platform_do_upgrade_dualboot_datachk "$1" ;; cig,wf186w|\ + cig,wf186h|\ yuncore,ax840|\ yuncore,fap655) [ -f /proc/boot_info/rootfs/upgradepartition ] && { diff --git a/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-cig-wf186h.dts b/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-cig-wf186h.dts new file mode 100644 index 000000000..61b159fd1 --- /dev/null +++ b/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-cig-wf186h.dts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, 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 "../../../arm64/boot/dts/qcom/qcom-ipq5018-cig-wf186h.dts" + +/ { + pmuv8: pmu { + compatible = "arm,cortex-a7-pmu"; + }; +}; diff --git a/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-cig-wf186h.dts b/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-cig-wf186h.dts new file mode 100644 index 000000000..5fb9e3469 --- /dev/null +++ b/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-cig-wf186h.dts @@ -0,0 +1,965 @@ +/dts-v1/; +/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, 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 "qcom-ipq5018.dtsi" + +/ { + #address-cells = <0x2>; + #size-cells = <0x2>; + model = "CIG wf186h"; + compatible = "cig,wf186h","qcom,ipq5018-mp03.3", "qcom,ipq5018"; + interrupt-parent = <&intc>; + + aliases { + sdhc1 = &sdhc_1; /* SDC1 eMMC slot */ + serial0 = &blsp1_uart1; + serial1 = &blsp1_uart2; + ethernet0 = "/soc/dp1"; + ethernet1 = "/soc/dp2"; + }; + + chosen { + bootargs = "console=ttyMSM0,115200,n8 rw init=/init"; + #ifdef __IPQ_MEM_PROFILE_256_MB__ + bootargs-append = " swiotlb=1"; + #else + bootargs-append = " swiotlb=1 coherent_pool=2M"; + #endif + stdout-path = "serial0"; + }; + + reserved-memory { + #ifdef __IPQ_MEM_PROFILE_256_MB__ + /* 256 MB Profile + * +=========+==============+========================+ + * | | | | + * | Region | Start Offset | Size | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | | | | + * | NSS | 0x40000000 | 8MB | + * | | | | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | | | | + * | | | | + * | | | | + * | Linux | 0x40800000 | Depends on total memory | + * | | | | + * | | | | + * | | | | + * + | | | + * +--------+--------------+-------------------------+ + * | | | | + * | uboot | 0x4A600000 | 4MB | + * | | | | + * +--------+--------------+-------------------------+ + * | SBL | 0x4AA00000 | 1MB | + * +--------+--------------+-------------------------+ + * | smem | 0x4AB00000 | 1MB | + * +--------+--------------+-------------------------+ + * | | | | + * | TZ | 0x4AC00000 | 4MB | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | | | | + * | | | | + * | Q6 | 0x4B000000 | 16MB | + * | code/ | | | + * | data | | | + * +--------+--------------+-------------------------+ + * | | | | + * |IPQ5018 | 0x4C000000 | 13MB | + * | data | | | + * +--------+--------------+-------------------------+ + * | M3 Dump| 0x4CD00000 | 1MB | + * +--------+--------------+-------------------------+ + * | QDSS | 0x4CE00000 | 1MB | + * +--------+--------------+-------------------------+ + * |QCN6122 | 0x4CF00000 | 15MB | + * | data | | | + * +--------+--------------+-------------------------+ + * | M3 Dump| 0x4DE00000 | 1MB | + * +--------+--------------+-------------------------+ + * | QDSS | 0x4DF00000 | 1MB | + * +--------+--------------+-------------------------+ + * | | | | + * |QCN9000 | 0x4E000000 | 17MB | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | MHI1 | 0x4F100000 | 16MB | + * | | | | + * +--------+--------------+-------------------------+ + * | | + * | Rest of the memory for Linux | + * | | + * +=================================================+ + */ + + q6_mem_regions: q6_mem_regions@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 0x3000000>; + }; + + q6_code_data: q6_code_data@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 01000000>; + }; + + q6_ipq5018_data: q6_ipq5018_data@4c000000 { + no-map; + reg = <0x0 0x4c000000 0x0 0xD00000>; + }; + + m3_dump: m3_dump@4CD00000 { + no-map; + reg = <0x0 0x4CD00000 0x0 0x100000>; + }; + + q6_etr_region:q6_etr_dump@4CE00000 { + no-map; + reg = <0x0 0x4CE00000 0x0 0x100000>; + }; + + q6_qcn6122_data1: q6_qcn6122_data1@4CF00000 { + no-map; + reg = <0x0 0x4CF00000 0x0 0xF00000>; + }; + + m3_dump_qcn6122_1: m3_dump_qcn6122_1@4DE00000 { + no-map; + reg = <0x0 0x4DE00000 0x0 0x100000>; + }; + + q6_qcn6122_etr_1: q6_qcn6122_etr_1@4DF00000 { + no-map; + reg = <0x0 0x4DF00000 0x0 0x100000>; + }; + + q6_qcn9000_region: qcn9000_pcie0@4E000000 { + no-map; + reg = <0x0 0x4E000000 0x0 0x01100000>; + }; + + mhi_region1: dma_pool1@4F100000 { + compatible = "shared-dma-pool"; + no-map; + reg = <0x0 0x4F100000 0x0 0x01000000>; + }; + #elif __IPQ_MEM_PROFILE_512_MB__ + /* 512 MB Profile + * +=========+==============+========================+ + * | | | | + * | Region | Start Offset | Size | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | | | | + * | NSS | 0x40000000 | 16MB | + * | | | | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | | | | + * | | | | + * | | | | + * | Linux | 0x41000000 | Depends on total memory | + * | | | | + * | | | | + * | | | | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | uboot | 0x4A600000 | 4MB | + * | | | | + * +--------+--------------+-------------------------+ + * | SBL | 0x4AA00000 | 1MB | + * +--------+--------------+-------------------------+ + * | smem | 0x4AB00000 | 1MB | + * +--------+--------------+-------------------------+ + * | | | | + * | TZ | 0x4AC00000 | 4MB | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | | | | + * | Q6 | 0x4B000000 | 16MB | + * | code/ | | | + * | data | | | + * +--------+--------------+-------------------------+ + * | | | | + * |IPQ5018 | 0x4C000000 | 14MB | + * | data | | | + * +--------+--------------+-------------------------+ + * | M3 Dump| 0x4CE00000 | 1MB | + * +--------+--------------+-------------------------+ + * | QDSS | 0x4CF00000 | 1MB | + * +--------+--------------+-------------------------+ + * | caldb | 0x4D000000 | 2MB | + * +--------+--------------+-------------------------+ + * |QCN6122 | 0x4D200000 | 16MB | + * | data | | | + * +--------+--------------+-------------------------+ + * | M3 Dump| 0x4E200000 | 1MB | + * +--------+--------------+-------------------------+ + * | QDSS | 0x4E300000 | 1MB | + * +--------+--------------+-------------------------+ + * | caldb | 0x4E400000 | 5MB | + * +--------+--------------+-------------------------+ + * | | | | + * |QCN9000 | 0x4E900000 | 30MB | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | MHI1 | 0x50700000 | 16MB | + * | | | | + * +--------+--------------+-------------------------+ + * | | + * | Rest of the memory for Linux | + * | | + * +=================================================+ + */ + + q6_mem_regions: q6_mem_regions@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 0x3900000>; + }; + + q6_code_data: q6_code_data@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 01000000>; + }; + + q6_ipq5018_data: q6_ipq5018_data@4C000000 { + no-map; + reg = <0x0 0x4C000000 0x0 0xE00000>; + }; + + m3_dump: m3_dump@4CE00000 { + no-map; + reg = <0x0 0x4CE00000 0x0 0x100000>; + }; + + q6_etr_region: q6_etr_dump@4CF00000 { + no-map; + reg = <0x0 0x4CF00000 0x0 0x100000>; + }; + + q6_caldb_region: q6_caldb_region@4D000000 { + no-map; + reg = <0x0 0x4D000000 0x0 0x200000>; + }; + + q6_qcn6122_data1: q6_qcn6122_data1@4D200000 { + no-map; + reg = <0x0 0x4D200000 0x0 0x1000000>; + }; + + m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E200000 { + no-map; + reg = <0x0 0x4E200000 0x0 0x100000>; + }; + + q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E300000 { + no-map; + reg = <0x0 0x4E300000 0x0 0x100000>; + }; + + q6_qcn6122_caldb_1: q6_qcn6122_caldb_1@4E400000 { + no-map; + reg = <0x0 0x4E400000 0x0 0x500000>; + }; + + q6_qcn9000_region: qcn9000_pcie0@4E900000 { + no-map; + reg = <0x0 0x4E900000 0x0 0x01E00000>; + }; + + mhi_region1: dma_pool1@50700000 { + compatible = "shared-dma-pool"; + no-map; + reg = <0x0 0x50700000 0x0 0x01000000>; + }; + #else + /* 1G Profile + * +=========+==============+========================+ + * | | | | + * | Region | Start Offset | Size | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | | | | + * | NSS | 0x40000000 | 16MB | + * | | | | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | | | | + * | | | | + * | | | | + * | Linux | 0x41000000 | Depends on total memory | + * | | | | + * | | | | + * | | | | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | uboot | 0x4A600000 | 4MB | + * | | | | + * +--------+--------------+-------------------------+ + * | SBL | 0x4AA00000 | 1MB | + * +--------+--------------+-------------------------+ + * | smem | 0x4AB00000 | 1MB | + * +--------+--------------+-------------------------+ + * | | | | + * | TZ | 0x4AC00000 | 4MB | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | | | | + * | Q6 | 0x4B000000 | 16MB | + * | code/ | | | + * | data | | | + * +--------+--------------+-------------------------+ + * | | | | + * |IPQ5018 | 0x4C000000 | 14MB | + * | data | | | + * +--------+--------------+-------------------------+ + * | M3 Dump| 0x4CE00000 | 1MB | + * +--------+--------------+-------------------------+ + * | QDSS | 0x4CF00000 | 1MB | + * +--------+--------------+-------------------------+ + * | caldb | 0x4D000000 | 2MB | + * +--------+--------------+-------------------------+ + * |QCN6122 | 0x4D200000 | 16MB | + * | data | | | + * +--------+--------------+-------------------------+ + * | M3 Dump| 0x4E200000 | 1MB | + * +--------+--------------+-------------------------+ + * | QDSS | 0x4E300000 | 1MB | + * +--------+--------------+-------------------------+ + * | caldb | 0x4E400000 | 5MB | + * +--------+--------------+-------------------------+ + * | | | | + * |QCN9000 | 0x4E900000 | 45MB | + * | | | | + * +--------+--------------+-------------------------+ + * | | | | + * | MHI1 | 0x51600000 | 24MB | + * | | | | + * +--------+--------------+-------------------------+ + * | | + * | Rest of the memory for Linux | + * | | + * +=================================================+ + */ + + q6_mem_regions: q6_mem_regions@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 0x3900000>; + }; + + q6_code_data: q6_code_data@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 01000000>; + }; + + q6_ipq5018_data: q6_ipq5018_data@4C000000 { + no-map; + reg = <0x0 0x4C000000 0x0 0xE00000>; + }; + + m3_dump: m3_dump@4CE00000 { + no-map; + reg = <0x0 0x4CE00000 0x0 0x100000>; + }; + + q6_etr_region: q6_etr_dump@4CF00000 { + no-map; + reg = <0x0 0x4CF00000 0x0 0x100000>; + }; + + q6_caldb_region: q6_caldb_region@4D000000 { + no-map; + reg = <0x0 0x4D000000 0x0 0x200000>; + }; + + q6_qcn6122_data1: q6_qcn6122_data1@4D200000 { + no-map; + reg = <0x0 0x4D200000 0x0 0x1000000>; + }; + + m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E200000 { + no-map; + reg = <0x0 0x4E200000 0x0 0x100000>; + }; + + q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E300000 { + no-map; + reg = <0x0 0x4E300000 0x0 0x100000>; + }; + + q6_qcn6122_caldb_1: q6_qcn6122_caldb_1@4E400000 { + no-map; + reg = <0x0 0x4E400000 0x0 0x500000>; + }; + + q6_qcn9000_region: qcn9000_pcie0@4E900000 { + no-map; + reg = <0x0 0x4E900000 0x0 0x02D00000>; + }; + + mhi_region1: dma_pool1@51600000 { + compatible = "shared-dma-pool"; + no-map; + reg = <0x0 0x51600000 0x0 0x01800000>; + }; + #endif + }; + + soc { + serial@78af000 { + status = "ok"; + }; + + blsp1_uart2: serial@78b0000 { + pinctrl-0 = <&blsp1_uart_pins>; + pinctrl-names = "default"; + status = "ok"; + }; + + qpic_bam: dma@7984000{ + status = "ok"; + }; + + nand: qpic-nand@79b0000 { + pinctrl-0 = <&qspi_nand_pins>; + pinctrl-names = "default"; + status = "ok"; + }; + + spi_0: spi@78b5000 { /* BLSP1 QUP0 */ + pinctrl-0 = <&blsp0_spi_pins>; + pinctrl-names = "default"; + cs-select = <0>; + status = "ok"; + + m25p80@0 { + #address-cells = <1>; + #size-cells = <1>; + reg = <0>; + compatible = "n25q128a11"; + linux,modalias = "m25p80", "n25q128a11"; + spi-max-frequency = <50000000>; + use-default-sizes; + }; + }; + + mdio0: mdio@88000 { + status = "ok"; + ethernet-phy@0 { + reg = <7>; + }; + }; + + mdio1: mdio@90000 { + status = "ok"; + pinctrl-0 = <&mdio1_pins>; + pinctrl-names = "default"; + phy-reset-gpio = <&tlmm 35 0>; + cig_clk_div = <0xff>; + ethernet-phy@0 { + reg = <0x1d>; + }; + }; + + realtek@29{ + compatible = "realtek,rtl8367s"; + mii-bus = <&mdio1>; + realtek,extif0 = <0 0 10 1 1 1 1 1 2>; + switch = <&tlmm 35 0>; + phy-addr = <29>; + status = "ok"; + }; + ess-instance { + num_devices = <0x1>; + ess-switch@0x39c00000 { + compatible = "qcom,ess-switch-ipq50xx"; + device_id = <0>; + switch_mac_mode = <0xf>; /* mac mode for uniphy instance*/ + cmnblk_clk = "internal_96MHz"; /* cmnblk clk*/ + qcom,port_phyinfo { + port@0 { + port_id = <1>; + phy_address = <7>; + }; + port@1 { + port_id = <2>; + forced-speed = <1000>; + forced-duplex = <1>; + }; + }; + led_source@0 { + source = <0>; + mode = "normal"; + speed = "all"; + blink_en = "enable"; + active = "high"; + }; + }; + }; + + wifi0: wifi@c000000 { + status = "ok"; + }; + + dp1 { + device_type = "network"; + compatible = "qcom,nss-dp"; + clocks = <&gcc GCC_SNOC_GMAC1_AXI_CLK>; + clock-names = "nss-snoc-gmac-axi-clk"; + qcom,id = <2>; + reg = <0x39D00000 0x10000>; + interrupts = ; + qcom,mactype = <2>; + local-mac-address = [000000000000]; + phy-mode = "sgmii"; + }; + + dp2 { + device_type = "network"; + compatible = "qcom,nss-dp"; + clocks = <&gcc GCC_SNOC_GMAC0_AXI_CLK>; + clock-names = "nss-snoc-gmac-axi-clk"; + qcom,id = <1>; + reg = <0x39C00000 0x10000>; + interrupts = ; + qcom,mactype = <2>; + qcom,link-poll = <1>; + qcom,phy-mdio-addr = <7>; + mdio-bus = <&mdio0>; + local-mac-address = [000000000000]; + phy-mode = "sgmii"; + }; + + + qcom,test@0 { + status = "ok"; + }; + + lpass: lpass@0xA000000{ + status = "disabled"; + }; + + pcm: pcm@0xA3C0000{ + pinctrl-0 = <&audio_pins>; + pinctrl-names = "default"; + status = "disabled"; + }; + + gpio_keys { + compatible = "gpio-keys"; + pinctrl-0 = <&button_pins>; + pinctrl-names = "default"; + + button@1 { + label = "rst"; + linux,code = ; + gpios = <&tlmm 27 GPIO_ACTIVE_LOW>; + linux,input-type = <1>; + debounce-interval = <60>; + }; + }; + pcm_lb: pcm_lb@0 { + status = "disabled"; + }; + }; + + thermal-zones { + status = "ok"; + }; +}; + +&tlmm { + pinctrl-0 = <&phy_led_pins>; + pinctrl-names = "default"; + + blsp1_uart_pins: blsp1_uart_pins { + blsp1_uart_rx_tx { + pins = "gpio31", "gpio33"; + function = "blsp1_uart1"; + bias-disable; + }; + }; + + blsp0_spi_pins: blsp0_spi_pins { + mux { + pins = "gpio10", "gpio11", "gpio12", "gpio13"; + function = "blsp0_spi"; + drive-strength = <2>; + bias-disable; + }; + }; + + qspi_nand_pins: qspi_nand_pins { + qspi_clock { + pins = "gpio9"; + function = "qspi_clk"; + drive-strength = <8>; + bias-disable; + }; + qspi_cs { + pins = "gpio8"; + function = "qspi_cs"; + drive-strength = <8>; + bias-disable; + }; + qspi_data_0 { + pins = "gpio7"; + function = "qspi0"; + drive-strength = <8>; + bias-disable; + }; + qspi_data_1 { + pins = "gpio6"; + function = "qspi1"; + drive-strength = <8>; + bias-disable; + }; + qspi_data_2 { + pins = "gpio5"; + function = "qspi2"; + drive-strength = <8>; + bias-disable; + }; + qspi_data_3 { + pins = "gpio4"; + function = "qspi3"; + drive-strength = <8>; + bias-disable; + }; + }; + + mdio1_pins: mdio_pinmux { + mux_0 { + pins = "gpio36"; + function = "mdc"; + drive-strength = <8>; + bias-pull-up; + }; + + mux_1 { + pins = "gpio37"; + function = "mdio"; + drive-strength = <8>; + bias-pull-up; + }; + }; + + phy_led_pins: phy_led_pins { + gephy_led_pin { + pins = "gpio46"; + function = "led0"; + drive-strength = <8>; + bias-pull-down; + }; + }; + + i2c_pins: i2c_pins { + i2c_scl { + pins = "gpio25"; + function = "blsp2_i2c1"; + drive-strength = <8>; + bias-disable; + }; + + i2c_sda { + pins = "gpio26"; + function = "blsp2_i2c1"; + drive-strength = <8>; + bias-disable; + }; + }; + + button_pins: button_pins { + wps_button { + pins = "gpio38"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + }; + rst_button { + pins = "gpio27"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + }; + + }; + audio_pins: audio_pinmux { + mux_1 { + pins = "gpio24"; + function = "audio_rxbclk"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_2 { + pins = "gpio25"; + function = "audio_rxfsync"; + drive-strength = <8>; + bias-pull-down; + }; + + mux_5 { + pins = "gpio28"; + function = "audio_txbclk"; + drive-strength = <8>; + bias-pull-down; + }; + + }; + + pwm_pins: pwm_pinmux { + mux_1 { + pins = "gpio0"; + function = "pwm10"; + drive-strength = <8>; + }; + mux_2 { + pins = "gpio1"; + function = "pwm20"; + drive-strength = <8>; + }; + mux_3 { + pins = "gpio45"; + function = "pwm3"; + drive-strength = <8>; + }; + }; + +}; + +&soc { + + pwm: pwm@0x1941010 { + pinctrl-0 = <&pwm_pins>; + pinctrl-names = "default"; + used-pwm-indices = <1>, <1>, <1>, <1>; + dft-pwm-status = <1>, <0>, <0>, <0>; + status = "ok"; + }; +}; + +&usb3 { + status = "disabled"; + device-power-gpio = <&tlmm 24 1>; +}; + +&eud { + status = "ok"; +}; + +&pcie_x1 { + status = "ok"; + perst-gpio = <&tlmm 18 1>; +}; + +&pcie_x2 { + status = "disabled"; + perst-gpio = <&tlmm 15 1>; +}; + +&dwc_0 { + /delete-property/ #phy-cells; + /delete-property/ phys; + /delete-property/ phy-names; +}; + +&hs_m31phy_0 { + status = "ok"; +}; + +&pcie_x1phy { + status = "disabled"; +}; + +&pcie_x2phy { + status = "disabled"; +}; + +&pcie_x1_rp { + status = "disabled"; + + mhi_0: qcom,mhi@0 { + reg = <0 0 0 0 0 >; + }; +}; + +&pcie_x2_rp { + status = "disabled"; + + mhi_1: qcom,mhi@1 { + reg = <0 0 0 0 0 >; + qrtr_instance_id = <0x21>; + #address-cells = <0x2>; + #size-cells = <0x2>; + memory-region = <&mhi_region1>; +#if !defined(__CNSS2__) + base-addr = <0x4E900000>; + m3-dump-addr = <0x4FD00000>; + etr-addr = <0x4FE00000>; + qcom,caldb-addr = <0x4FF00000>; + qcom,tgt-mem-mode = <0x1>; + mhi,max-channels = <30>; + mhi,timeout = <10000>; + qcom,board_id = <0xa4>; +#endif + }; +}; + +&wifi3 { + status = "ok"; +}; + +&qfprom { + status = "ok"; +}; + +&tsens { + status = "ok"; +}; + +&qcom_q6v5_wcss { + qcom,multipd_arch; + memory-region = <&q6_mem_regions>; + qcom,share_bootargs; + qcom,bootargs_smem = <507>; + boot-args = <0x2 0x4 0x2 0x12 0x0 0x0>; + + /* IPQ5018 */ + q6v5_wcss_userpd1 { + m3_firmware = "IPQ5018/m3_fw.mdt"; + interrupts-extended = <&wcss_smp2p_in 8 0>, + <&wcss_smp2p_in 9 0>, + <&wcss_smp2p_in 12 0>, + <&wcss_smp2p_in 11 0>; + interrupt-names ="fatal", + "ready", + "spawn_ack", + "stop-ack"; + qcom,smem-states = <&wcss_smp2p_out 8>, + <&wcss_smp2p_out 9>, + <&wcss_smp2p_out 10>; + qcom,smem-state-names = "shutdown", + "stop", + "spawn"; + qca,asid = <1>; + qca,auto-restart; + qca,int_radio; + #ifdef __IPQ_MEM_PROFILE_256_MB__ + memory-region = <&q6_ipq5018_data>, <&m3_dump>, + <&q6_etr_region>; + #else + memory-region = <&q6_ipq5018_data>, <&m3_dump>, + <&q6_etr_region>, <&q6_caldb_region>; + #endif + }; + + /* QCN6122 5G */ + q6v5_wcss_userpd2 { + m3_firmware = "qcn6122/m3_fw.mdt"; + interrupts-extended = <&wcss_smp2p_in 16 0>, + <&wcss_smp2p_in 17 0>, + <&wcss_smp2p_in 20 0>, + <&wcss_smp2p_in 19 0>; + interrupt-names ="fatal", + "ready", + "spawn_ack", + "stop-ack"; + qcom,smem-states = <&wcss_smp2p_out 16>, + <&wcss_smp2p_out 17>, + <&wcss_smp2p_out 18>; + qcom,smem-state-names = "shutdown", + "stop", + "spawn"; + qca,asid = <2>; + qca,auto-restart; + #ifdef __IPQ_MEM_PROFILE_256_MB__ + memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>, + <&q6_qcn6122_etr_1>; + #else + memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>, + <&q6_qcn6122_etr_1>, <&q6_qcn6122_caldb_1>; + #endif + }; +}; + +&i2c_0 { + pinctrl-0 = <&i2c_pins>; + pinctrl-names = "default"; + status = "disabled"; +}; + +&qgic_msi_0 { + status = "ok"; +}; + +&wifi0 { + /* IPQ5018 */ + qcom,multipd_arch; +#ifdef __IPQ_MEM_PROFILE_256_MB__ + qcom,tgt-mem-mode = <2>; +#else + qcom,tgt-mem-mode = <1>; +#endif + qcom,board_id = <0x24>; + qcom,bdf-addr = <0x0 0x4C000000 0x4C000000 0x0 0x0>; +#ifdef __CNSS2__ + qcom,caldb-addr = <0x0 0x4D000000 0 0 0>; +#else + qcom,caldb-addr = <0x4D000000>; + m3-dump-addr = <0x4CE00000>; +#endif + qcom,caldb-size = <0x200000>; + qcom,userpd-subsys-name = "q6v5_wcss_userpd1"; + status = "ok"; +}; + +&wifi1 { + /* QCN6122 5G */ + qcom,multipd_arch; +#ifdef __IPQ_MEM_PROFILE_256_MB__ + qcom,tgt-mem-mode = <2>; +#else + qcom,tgt-mem-mode = <1>; +#endif + qcom,board_id = <0x60>; + qcom,bdf-addr = <0x0 0x4D200000 0x4CF00000 0x0 0x0>; +#ifdef __CNSS2__ + qcom,caldb-addr = <0x0 0x4E400000 0 0 0>; +#else + qcom,caldb-addr = <0x4E400000>; + m3-dump-addr = <0x4E200000>; +#endif + qcom,caldb-size = <0x500000>; + qcom,userpd-subsys-name = "q6v5_wcss_userpd2"; + status = "ok"; +}; diff --git a/feeds/ipq807x/ipq807x/image/ipq50xx.mk b/feeds/ipq807x/ipq807x/image/ipq50xx.mk index db3eff672..fd9d721fb 100644 --- a/feeds/ipq807x/ipq807x/image/ipq50xx.mk +++ b/feeds/ipq807x/ipq807x/image/ipq50xx.mk @@ -28,6 +28,15 @@ define Device/cig_wf186w endef TARGET_DEVICES += cig_wf186w +define Device/cig_wf186h + DEVICE_TITLE := Cigtech WF-186h + DEVICE_DTS := qcom-ipq5018-cig-wf186h + SUPPORTED_DEVICES := cig,wf186h + DEVICE_PACKAGES := ath11k-wifi-cig-wf186h ath11k-firmware-ipq50xx-map-spruce + DEVICE_DTS_CONFIG := config@mp03.3 +endef +TARGET_DEVICES += cig_wf186h + define Device/cybertan_eww622_a1 DEVICE_TITLE := CyberTan EWW622-A1 DEVICE_DTS := qcom-ipq5018-eww622-a1 diff --git a/feeds/ucentral/ucentral-schema/files/etc/board.d/04-regdm b/feeds/ucentral/ucentral-schema/files/etc/board.d/04-regdm index 25beba72a..04f697ab4 100755 --- a/feeds/ucentral/ucentral-schema/files/etc/board.d/04-regdm +++ b/feeds/ucentral/ucentral-schema/files/etc/board.d/04-regdm @@ -8,6 +8,7 @@ board=$(board_name) case "$board" in cig,wf186w|\ +cig,wf186h|\ cig,wf194c4|\ cig,wf194c|\ cig,wf610d|\ diff --git a/feeds/wifi-ax/ath11k-wifi/Makefile b/feeds/wifi-ax/ath11k-wifi/Makefile index 532df868e..f1fcdfe2f 100644 --- a/feeds/wifi-ax/ath11k-wifi/Makefile +++ b/feeds/wifi-ax/ath11k-wifi/Makefile @@ -26,6 +26,7 @@ endef ALLWIFIBOARDS:= \ cig-wf188 \ cig-wf186w \ + cig-wf186h \ cig-wf660a \ cig-wf194c \ cig-wf194c4 \ @@ -348,6 +349,7 @@ endef $(eval $(call generate-ath11k-wifi-package,cig-wf188,Cigtech WF188)) $(eval $(call generate-ath11k-wifi-package,cig-wf186w,Cigtech WF186w)) +$(eval $(call generate-ath11k-wifi-package,cig-wf186h,Cigtech WF186h)) $(eval $(call generate-ath11k-wifi-package,cig-wf660a,Cigtech WF660a)) $(eval $(call generate-ath11k-wifi-package,cig-wf194c,Cigtech WF194c)) $(eval $(call generate-ath11k-wifi-package,cig-wf194c4,Cigtech WF194c4)) diff --git a/feeds/wifi-ax/ath11k-wifi/board-cig-wf186h.bin.IPQ5018 b/feeds/wifi-ax/ath11k-wifi/board-cig-wf186h.bin.IPQ5018 new file mode 100755 index 0000000000000000000000000000000000000000..9241704f308082b6a850bb9d5ce904edce7fefed GIT binary patch literal 131072 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