mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 05:55:44 +02:00
wifi: rtw89: efuse: move recognize firmware MSS info v1 to common
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
This commit is contained in:
parent
d230e215e3
commit
0ce1df1cc3
|
|
@ -11,11 +11,24 @@
|
|||
#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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -20,14 +16,6 @@
|
|||
#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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user