wifi: rtw89: efuse: move recognize firmware MSS info v1 to common
authorPing-Ke Shih <pkshih@realtek.com>
Wed, 30 Oct 2024 02:21:29 +0000 (10:21 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Wed, 6 Nov 2024 05:56:57 +0000 (13:56 +0800)
The WiFi 6 chip use the same firmware MSS information v1 read from efuse,
so move this logic to common.

No change logic at all.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20241030022135.11688-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/efuse.c
drivers/net/wireless/realtek/rtw89/efuse.h
drivers/net/wireless/realtek/rtw89/efuse_be.c

index 532623130c417a4a712f3de5b401a630c841c938..a02b04eecd056259de29cffe175aced6bed41baf 100644 (file)
 #define EF_CV_MASK GENMASK(7, 4)
 #define EF_CV_INV 15
 
+#define EFUSE_B1_MSSDEVTYPE_MASK GENMASK(3, 0)
+#define EFUSE_B1_MSSCUSTIDX0_MASK GENMASK(7, 4)
+#define EFUSE_B2_MSSKEYNUM_MASK GENMASK(3, 0)
+#define EFUSE_B2_MSSCUSTIDX1_MASK BIT(6)
+
 enum rtw89_efuse_bank {
        RTW89_EFUSE_BANK_WIFI,
        RTW89_EFUSE_BANK_BT,
 };
 
+enum rtw89_efuse_mss_dev_type {
+       MSS_DEV_TYPE_FWSEC_DEF = 0xF,
+       MSS_DEV_TYPE_FWSEC_WINLIN_INBOX = 0xC,
+       MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_NON_COB = 0xA,
+       MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_COB = 0x9,
+       MSS_DEV_TYPE_FWSEC_NONWIN_INBOX = 0x6,
+};
+
 static int rtw89_switch_efuse_bank(struct rtw89_dev *rtwdev,
                                   enum rtw89_efuse_bank bank)
 {
@@ -355,6 +368,52 @@ int rtw89_read_efuse_ver(struct rtw89_dev *rtwdev, u8 *ecv)
 }
 EXPORT_SYMBOL(rtw89_read_efuse_ver);
 
+static u8 get_mss_dev_type_idx(struct rtw89_dev *rtwdev, u8 mss_dev_type)
+{
+       switch (mss_dev_type) {
+       case MSS_DEV_TYPE_FWSEC_WINLIN_INBOX:
+               mss_dev_type = 0x0;
+               break;
+       case MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_NON_COB:
+               mss_dev_type = 0x1;
+               break;
+       case MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_COB:
+               mss_dev_type = 0x2;
+               break;
+       case MSS_DEV_TYPE_FWSEC_NONWIN_INBOX:
+               mss_dev_type = 0x3;
+               break;
+       case MSS_DEV_TYPE_FWSEC_DEF:
+               mss_dev_type = RTW89_FW_MSS_DEV_TYPE_FWSEC_DEF;
+               break;
+       default:
+               rtw89_warn(rtwdev, "unknown mss_dev_type %d", mss_dev_type);
+               mss_dev_type = RTW89_FW_MSS_DEV_TYPE_FWSEC_INV;
+               break;
+       }
+
+       return mss_dev_type;
+}
+
+int rtw89_efuse_recognize_mss_info_v1(struct rtw89_dev *rtwdev, u8 b1, u8 b2)
+{
+       struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
+       u8 mss_dev_type;
+
+       mss_dev_type = u8_get_bits(b1, EFUSE_B1_MSSDEVTYPE_MASK);
+       sec->mss_cust_idx = 0x1F - (u8_get_bits(b1, EFUSE_B1_MSSCUSTIDX0_MASK) |
+                                   u8_get_bits(b2, EFUSE_B2_MSSCUSTIDX1_MASK) << 4);
+       sec->mss_key_num = 0xF - u8_get_bits(b2, EFUSE_B2_MSSKEYNUM_MASK);
+
+       sec->mss_dev_type = get_mss_dev_type_idx(rtwdev, mss_dev_type);
+       if (sec->mss_dev_type == RTW89_FW_MSS_DEV_TYPE_FWSEC_INV) {
+               rtw89_warn(rtwdev, "invalid mss_dev_type %d\n", mss_dev_type);
+               return -ENOENT;
+       }
+
+       return 0;
+}
+
 int rtw89_efuse_read_fw_secure_ax(struct rtw89_dev *rtwdev)
 {
        return 0;
index a2f6f36e697f96fd82a03c5450048bfdc2d4173a..a96fc104479104db84eab44e51867e8f04405a35 100644 (file)
@@ -23,6 +23,7 @@ int rtw89_parse_efuse_map_be(struct rtw89_dev *rtwdev);
 int rtw89_parse_phycap_map_be(struct rtw89_dev *rtwdev);
 int rtw89_cnv_efuse_state_be(struct rtw89_dev *rtwdev, bool idle);
 int rtw89_read_efuse_ver(struct rtw89_dev *rtwdev, u8 *efv);
+int rtw89_efuse_recognize_mss_info_v1(struct rtw89_dev *rtwdev, u8 b1, u8 b2);
 int rtw89_efuse_read_fw_secure_ax(struct rtw89_dev *rtwdev);
 int rtw89_efuse_read_fw_secure_be(struct rtw89_dev *rtwdev);
 
index 756aaf886af92c591d4eee91ee27a72c00b638b0..64768923b0f0a8a42536bf524a9075639182e17a 100644 (file)
@@ -8,11 +8,7 @@
 #include "reg.h"
 
 #define EFUSE_EXTERNALPN_ADDR_BE 0x1580
-#define EFUSE_B1_MSSDEVTYPE_MASK GENMASK(3, 0)
-#define EFUSE_B1_MSSCUSTIDX0_MASK GENMASK(7, 4)
 #define EFUSE_SERIALNUM_ADDR_BE 0x1581
-#define EFUSE_B2_MSSKEYNUM_MASK GENMASK(3, 0)
-#define EFUSE_B2_MSSCUSTIDX1_MASK BIT(6)
 #define EFUSE_SB_CRYP_SEL_ADDR 0x1582
 #define EFUSE_SB_CRYP_SEL_SIZE 2
 #define EFUSE_SB_CRYP_SEL_DEFAULT 0xFFFF
 #define EFUSE_SEC_BE_START 0x1580
 #define EFUSE_SEC_BE_SIZE 4
 
-enum rtw89_efuse_mss_dev_type {
-       MSS_DEV_TYPE_FWSEC_DEF = 0xF,
-       MSS_DEV_TYPE_FWSEC_WINLIN_INBOX = 0xC,
-       MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_NON_COB = 0xA,
-       MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_COB = 0x9,
-       MSS_DEV_TYPE_FWSEC_NONWIN_INBOX = 0x6,
-};
-
 static const u32 sb_sel_mgn[SB_SEL_MGN_MAX_SIZE] = {
        0x8000100, 0xC000180
 };
@@ -477,33 +465,6 @@ static u16 get_sb_cryp_sel_idx(u16 sb_cryp_sel)
        return sb_cryp_sel_v + low_bit;
 }
 
-static u8 get_mss_dev_type_idx(struct rtw89_dev *rtwdev, u8 mss_dev_type)
-{
-       switch (mss_dev_type) {
-       case MSS_DEV_TYPE_FWSEC_WINLIN_INBOX:
-               mss_dev_type = 0x0;
-               break;
-       case MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_NON_COB:
-               mss_dev_type = 0x1;
-               break;
-       case MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_COB:
-               mss_dev_type = 0x2;
-               break;
-       case MSS_DEV_TYPE_FWSEC_NONWIN_INBOX:
-               mss_dev_type = 0x3;
-               break;
-       case MSS_DEV_TYPE_FWSEC_DEF:
-               mss_dev_type = RTW89_FW_MSS_DEV_TYPE_FWSEC_DEF;
-               break;
-       default:
-               rtw89_warn(rtwdev, "unknown mss_dev_type %d", mss_dev_type);
-               mss_dev_type = RTW89_FW_MSS_DEV_TYPE_FWSEC_INV;
-               break;
-       }
-
-       return mss_dev_type;
-}
-
 int rtw89_efuse_read_fw_secure_be(struct rtw89_dev *rtwdev)
 {
        struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
@@ -511,7 +472,6 @@ int rtw89_efuse_read_fw_secure_be(struct rtw89_dev *rtwdev)
        u32 sec_size = EFUSE_SEC_BE_SIZE;
        u16 sb_cryp_sel, sb_cryp_sel_idx;
        u8 sec_map[EFUSE_SEC_BE_SIZE];
-       u8 mss_dev_type;
        u8 b1, b2;
        int ret;
 
@@ -538,16 +498,9 @@ int rtw89_efuse_read_fw_secure_be(struct rtw89_dev *rtwdev)
        b1 = sec_map[EFUSE_EXTERNALPN_ADDR_BE - sec_addr];
        b2 = sec_map[EFUSE_SERIALNUM_ADDR_BE - sec_addr];
 
-       mss_dev_type = u8_get_bits(b1, EFUSE_B1_MSSDEVTYPE_MASK);
-       sec->mss_cust_idx = 0x1F - (u8_get_bits(b1, EFUSE_B1_MSSCUSTIDX0_MASK) |
-                                   u8_get_bits(b2, EFUSE_B2_MSSCUSTIDX1_MASK) << 4);
-       sec->mss_key_num = 0xF - u8_get_bits(b2, EFUSE_B2_MSSKEYNUM_MASK);
-
-       sec->mss_dev_type = get_mss_dev_type_idx(rtwdev, mss_dev_type);
-       if (sec->mss_dev_type == RTW89_FW_MSS_DEV_TYPE_FWSEC_INV) {
-               rtw89_warn(rtwdev, "invalid mss_dev_type %d\n", mss_dev_type);
+       ret = rtw89_efuse_recognize_mss_info_v1(rtwdev, b1, b2);
+       if (ret)
                goto out;
-       }
 
        sec->secure_boot = true;