From 1c055e55a242a33e574e48be530e06770a210dcd Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 19 Feb 2024 03:26:26 +0000 Subject: [PATCH] add r8169 read mac form eeprom --- kernel/drivers/devfreq/rockchip_dmc_dbg.c | 382 +++++++++++++++++++----------------------------------- 1 files changed, 133 insertions(+), 249 deletions(-) diff --git a/kernel/drivers/devfreq/rockchip_dmc_dbg.c b/kernel/drivers/devfreq/rockchip_dmc_dbg.c index c0b9bae..80b25e9 100644 --- a/kernel/drivers/devfreq/rockchip_dmc_dbg.c +++ b/kernel/drivers/devfreq/rockchip_dmc_dbg.c @@ -74,59 +74,10 @@ struct dram_info { unsigned int version; - char dramtype[12]; + char dramtype[10]; unsigned int dramfreq; unsigned int channel_num; struct dram_cap_info ch[2]; - unsigned int dramid[3]; -}; - -struct lpddrx_id { - unsigned int dramid; - char *name; -}; - -static const struct lpddrx_id lp23_manuf_id[] = { - { 0x1, "Samsung" }, - { 0x2, "Qimonda" }, - { 0x3, "Elpida" }, - { 0x4, "Etron" }, - { 0x5, "Nanya" }, - { 0x6, "SK hynix" }, - { 0x7, "Mosel" }, - { 0x8, "Winbond" }, - { 0x9, "ESMT" }, - { 0xa, "Zentel" }, - { 0xb, "Spansion" }, - { 0xc, "SST" }, - { 0xd, "ZMOS" }, - { 0xe, "Intel" }, - { 0x12, "Being Advanced Memory Corp" }, - { 0x1a, "Xi'an UniIC Semiconductors Co., Ltd" }, - { 0x1b, "ISSI" }, - { 0x1c, "JSC" }, - { 0xaa, "Tezzaron" }, - { 0xc2, "Macronix" }, - { 0xf8, "Fidelix" }, - { 0xfc, "eveRAM" }, - { 0xfd, "AP Memory" }, - { 0xfe, "Numonyx" }, - { 0xff, "Micron" } -}; - -static const struct lpddrx_id lp4_manuf_id[] = { - { 0x1, "Samsung" }, - { 0x5, "Nanya" }, - { 0x6, "SK hynix" }, - { 0x8, "Winbond" }, - { 0x9, "ESMT" }, - { 0x13, "CXMT" }, - { 0x1a, "Xi'an UniIC Semiconductors Co., Ltd" }, - { 0x1c, "JSC" }, - { 0xf8, "Fidelix" }, - { 0xf9, "Ultra Memory" }, - { 0xfd, "AP Memory" }, - { 0xff, "Micron" } }; static const char * const power_save_msg[] = { @@ -241,9 +192,9 @@ { struct arm_smccc_res res; struct dram_info *p_dram_info; - struct file *fp = NULL; - char cur_freq[20] = { 0 }; - char governor[20] = { 0 }; + struct file *fp = NULL; + char cur_freq[20] = {0}; + char governor[20] = {0}; loff_t pos; u32 i; @@ -254,11 +205,6 @@ res.a0); return -ENOMEM; } - if (res.a1) { - seq_printf(m, "ddrdbg function get dram info error:%lx\n", - res.a1); - return -EPERM; - } if (!dmcdbg_data.inited_flag) { seq_puts(m, "dmcdbg_data no int\n"); @@ -267,57 +213,25 @@ p_dram_info = (struct dram_info *)dmcdbg_data.share_memory; /* dram type information */ - seq_printf(m, "DramType: %s\n", p_dram_info->dramtype); - if (p_dram_info->version >= 0x2) { - if ((strcmp(p_dram_info->dramtype, "LPDDR2") == 0) || - (strcmp(p_dram_info->dramtype, "LPDDR3") == 0)) { - for (i = 0; i < ARRAY_SIZE(lp23_manuf_id); i++) { - if (lp23_manuf_id[i].dramid == p_dram_info->dramid[0]) { - seq_printf(m, - "Dram ID: %s(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n", - lp23_manuf_id[i].name, - p_dram_info->dramid[0], - p_dram_info->dramid[1], - p_dram_info->dramid[2]); - break; - } - } - if (i == ARRAY_SIZE(lp23_manuf_id)) - seq_printf(m, - "Dram ID: Unknown(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n", - p_dram_info->dramid[0], - p_dram_info->dramid[1], - p_dram_info->dramid[2]); - } else if ((strcmp(p_dram_info->dramtype, "LPDDR4") == 0) || - (strcmp(p_dram_info->dramtype, "LPDDR4X") == 0)) { - for (i = 0; i < ARRAY_SIZE(lp4_manuf_id); i++) { - if (lp4_manuf_id[i].dramid == p_dram_info->dramid[0]) { - seq_printf(m, - "Dram ID: %s(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n", - lp4_manuf_id[i].name, - p_dram_info->dramid[0], - p_dram_info->dramid[1], - p_dram_info->dramid[2]); - break; - } - } - if (i == ARRAY_SIZE(lp4_manuf_id)) - seq_printf(m, - "Dram ID: Unknown(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n", - p_dram_info->dramid[0], - p_dram_info->dramid[1], - p_dram_info->dramid[2]); - } else { - seq_printf(m, "Dram ID: None\n"); - } - } + seq_printf(m, + "DramType: %s\n" + , + p_dram_info->dramtype + ); + /* dram capacity information */ - seq_printf(m, "\n" - "DramCapacity:\n"); + seq_printf(m, + "\n" + "DramCapacity:\n" + ); for (i = 0; i < p_dram_info->channel_num; i++) { if (p_dram_info->channel_num == 2) - seq_printf(m, "Channel [%d]:\n", i); + seq_printf(m, + "Channel [%d]:\n" + , + i + ); seq_printf(m, "CS Count: %d\n" @@ -327,7 +241,8 @@ "CS0_Row: %d\n" "CS1_Row: %d\n" "DieBusWidth: %d bit\n" - "TotalSize: %d MB\n", + "TotalSize: %d MB\n" + , p_dram_info->ch[i].rank, p_dram_info->ch[i].buswidth, p_dram_info->ch[i].col, @@ -335,7 +250,8 @@ p_dram_info->ch[i].cs0_row, p_dram_info->ch[i].cs1_row, p_dram_info->ch[i].die_buswidth, - p_dram_info->ch[i].size); + p_dram_info->ch[i].size + ); } /* check devfreq/dmc device */ @@ -344,8 +260,10 @@ seq_printf(m, "\n" "devfreq/dmc: Disable\n" - "DramFreq: %d\n", - p_dram_info->dramfreq); + "DramFreq: %d\n" + , + p_dram_info->dramfreq + ); } else { pos = 0; kernel_read(fp, cur_freq, sizeof(cur_freq), &pos); @@ -364,11 +282,15 @@ "\n" "devfreq/dmc: Enable\n" "governor: %s\n" - "cur_freq: %s\n", - governor, cur_freq); + "cur_freq: %s\n" + , + governor, + cur_freq + ); seq_printf(m, "NOTE:\n" - "more information about dmc can get from /sys/class/devfreq/dmc.\n"); + "more information about dmc can get from /sys/class/devfreq/dmc.\n" + ); } return 0; @@ -418,15 +340,19 @@ } p_power = (struct power_save_info *)dmcdbg_data.share_memory; - seq_printf(m, "low power information:\n" - "\n" - "[number]name: value\n"); + seq_printf(m, + "low power information:\n" + "\n" + "[number]name: value\n" + ); p_uint = (unsigned int *)p_power; for (i = 0; i < ARRAY_SIZE(power_save_msg); i++) seq_printf(m, - "[%d]%s: %d\n", - i, power_save_msg[i], *(p_uint + i)); + "[%d]%s: %d\n" + , + i, power_save_msg[i], *(p_uint + i) + ); seq_printf(m, "\n" @@ -438,7 +364,8 @@ "Support for setting multiple parameters at the same time.\n" "echo number=value,number=value,... > /proc/dmcdbg/powersave\n" "eg:\n" - " echo 0=1,1=32 > /proc/dmcdbg/powersave\n"); + " echo 0=1,1=32 > /proc/dmcdbg/powersave\n" + ); return 0; } @@ -575,34 +502,48 @@ } p_drvodt = (struct drv_odt_info *)dmcdbg_data.share_memory; - seq_printf(m, "drv and odt information:\n" - "\n" - "[number]name: value (ohm)\n"); + seq_printf(m, + "drv and odt information:\n" + "\n" + "[number]name: value (ohm)\n" + ); p_uint = (unsigned int *)p_drvodt; for (i = 0; i < ARRAY_SIZE(drv_odt_msg); i++) { if (*(p_uint + (i * 3)) == DRV_ODT_UNKNOWN) seq_printf(m, - "[%2d]%s: NULL (unknown) %c\n", + "[%2d]%s: NULL (unknown) %c\n" + , i, drv_odt_msg[i], - (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*'); + (*(p_uint + (i * 3) + 2) == + DRV_ODT_SUSPEND_FIX) ? '\0' : '*' + ); else if (*(p_uint + (i * 3) + 1) == DRV_ODT_UNKNOWN) seq_printf(m, - "[%2d]%s: %d (unknown) %c\n", + "[%2d]%s: %d (unknown) %c\n" + , i, drv_odt_msg[i], *(p_uint + (i * 3)), - (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*'); + (*(p_uint + (i * 3) + 2) == + DRV_ODT_SUSPEND_FIX) ? '\0' : '*' + ); else if (i < (ARRAY_SIZE(drv_odt_msg) - 2)) seq_printf(m, - "[%2d]%s: %d (%d ohm) %c\n", + "[%2d]%s: %d (%d ohm) %c\n" + , i, drv_odt_msg[i], *(p_uint + (i * 3)), *(p_uint + (i * 3) + 1), - (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*'); + (*(p_uint + (i * 3) + 2) == + DRV_ODT_SUSPEND_FIX) ? '\0' : '*' + ); else seq_printf(m, - "[%2d]%s: %d (%d %%) %c\n", + "[%2d]%s: %d (%d %%) %c\n" + , i, drv_odt_msg[i], *(p_uint + (i * 3)), *(p_uint + (i * 3) + 1), - (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*'); + (*(p_uint + (i * 3) + 2) == + DRV_ODT_SUSPEND_FIX) ? '\0' : '*' + ); } seq_printf(m, @@ -617,7 +558,8 @@ "eg: set soc side ca drv up and down to 20\n" " echo 6=20,7=20 > /proc/dmcdbg/drvodt\n" "Note: Please update both up and down at the same time.\n" - " (*) mean unsupported setting value\n"); + " (*) mean unsupported setting value\n" + ); return 0; } @@ -752,20 +694,28 @@ return -EPERM; } - seq_printf(m, "de-skew information:\n" - "\n" - "[group_number]name: value\n"); + seq_printf(m, + "de-skew information:\n" + "\n" + "[group_number]name: value\n" + ); for (group = 0; group < dmcdbg_data.skew_group_num; group++) { if (dmcdbg_data.skew_group[group].note != NULL) - seq_printf(m, "%s\n", - dmcdbg_data.skew_group[group].note); + seq_printf(m, + "%s\n" + , + dmcdbg_data.skew_group[group].note + ); p_uint = (unsigned int *)dmcdbg_data.skew_group[group].p_skew_info; for (i = 0; i < dmcdbg_data.skew_group[group].skew_num; i++) - seq_printf(m, "[%c%d_%d]%s: %d\n", - (i < 10) ? ' ' : '\0', group, i, - dmcdbg_data.skew_group[group].p_skew_timing[i], - *(p_uint + i)); + seq_printf(m, + "[%c%d_%d]%s: %d\n" + , + (i < 10) ? ' ' : '\0', group, i, + dmcdbg_data.skew_group[group].p_skew_timing[i], + *(p_uint + i) + ); } seq_printf(m, @@ -778,7 +728,8 @@ "Support for setting multiple parameters simultaneously.\n" "echo group_number=value,group_number=value,... > /proc/dmcdbg/deskew\n" "eg:\n" - " echo 0_1=8,1_2=8 > /proc/dmcdbg/deskew\n"); + " echo 0_1=8,1_2=8 > /proc/dmcdbg/deskew\n" + ); return 0; } @@ -925,13 +876,18 @@ } p_regsinfo = (struct registers_info *)dmcdbg_data.share_memory; - seq_printf(m, "registers base address information:\n" - "\n"); + seq_printf(m, + "registers base address information:\n" + "\n" + ); for (i = 0; i < p_regsinfo->regs_num; i++) { - seq_printf(m, "%s=0x%x\n", + seq_printf(m, + "%s=0x%x\n" + , p_regsinfo->regs[i].regs_name, - p_regsinfo->regs[i].regs_addr); + p_regsinfo->regs[i].regs_addr + ); } return 0; @@ -948,56 +904,6 @@ .llseek = seq_lseek, .release = single_release, }; - -static int rk_dmcdbg_sip_smc_match_ver(struct platform_device *pdev, - u32 match_ver) -{ - struct arm_smccc_res res; - - /* check ddr_debug_func version */ - res = sip_smc_dram(0, DDRDBG_FUNC_GET_VERSION, - ROCKCHIP_SIP_CONFIG_DRAM_DEBUG); - dev_notice(&pdev->dev, "current ATF ddr_debug_func version 0x%lx.\n", - res.a1); - /* - * [15:8] major version, [7:0] minor version - * major version must match both kernel dmcdbg and ATF ddr_debug_func. - */ - if (res.a0 || res.a1 < match_ver || ((res.a1 & 0xff00) != (match_ver & 0xff00))) { - dev_err(&pdev->dev, - "version invalid, need update to 0x%x or newer, the major version unmatch!\n", - match_ver); - - return -ENXIO; - } - - return 0; -} - -static int proc_dmcdbg_init(struct platform_device *pdev) -{ - struct arm_smccc_res res; - - /* request share memory for pass parameter */ - res = sip_smc_request_share_mem(DMCDBG_PAGE_NUMS, - SHARE_PAGE_TYPE_DDRDBG); - if (res.a0 != 0) { - dev_err(&pdev->dev, "request share mem error!\n"); - return -ENOMEM; - } - - dmcdbg_data.share_memory = (void __iomem *)res.a1; - dmcdbg_data.inited_flag = 1; - - /* create parent dir in /proc */ - proc_dmcdbg_dir = proc_mkdir(PROC_DMCDBG_DIR_NAME, NULL); - if (!proc_dmcdbg_dir) { - dev_err(&pdev->dev, "create proc dir error!\n"); - return -ENOENT; - } - - return 0; -} static int proc_regsinfo_init(void) { @@ -1062,18 +968,42 @@ static __maybe_unused int rv1126_dmcdbg_init(struct platform_device *pdev, struct rockchip_dmcdbg *dmcdbg) { - u32 version = 0x102; - int ret; + struct arm_smccc_res res; - ret = rk_dmcdbg_sip_smc_match_ver(pdev, version); - if (ret) - return ret; + /* check ddr_debug_func version */ + res = sip_smc_dram(0, DDRDBG_FUNC_GET_VERSION, + ROCKCHIP_SIP_CONFIG_DRAM_DEBUG); + dev_notice(&pdev->dev, "current ATF ddr_debug_func version 0x%lx.\n", + res.a1); + /* + * [15:8] major version, [7:0] minor version + * major version must match both kernel dmcdbg and ATF ddr_debug_func. + */ + if (res.a0 || res.a1 < 0x101 || ((res.a1 & 0xff00) != 0x100)) { + dev_err(&pdev->dev, + "version invalid,need update,the major version unmatch!\n"); + return -ENXIO; + } - ret = proc_dmcdbg_init(pdev); - if (ret) - return ret; + /* request share memory for pass parameter */ + res = sip_smc_request_share_mem(DMCDBG_PAGE_NUMS, + SHARE_PAGE_TYPE_DDRDBG); + if (res.a0 != 0) { + dev_err(&pdev->dev, "request share mem error\n"); + return -ENOMEM; + } + + dmcdbg_data.share_memory = (void __iomem *)res.a1; + dmcdbg_data.inited_flag = 1; rv1126_get_skew_parameter(); + + /* create parent dir in /proc */ + proc_dmcdbg_dir = proc_mkdir(PROC_DMCDBG_DIR_NAME, NULL); + if (!proc_dmcdbg_dir) { + dev_err(&pdev->dev, "create proc dir error!"); + return -ENOENT; + } proc_dmcinfo_init(); proc_powersave_init(); @@ -1083,54 +1013,8 @@ return 0; } -static __maybe_unused int px30_dmcdbg_init(struct platform_device *pdev, - struct rockchip_dmcdbg *dmcdbg) -{ - u32 version = 0x101; - int ret; - - ret = rk_dmcdbg_sip_smc_match_ver(pdev, version); - if (ret) - return ret; - - ret = proc_dmcdbg_init(pdev); - if (ret) - return ret; - - proc_dmcinfo_init(); - - return 0; -} - -static __maybe_unused int rk3568_dmcdbg_init(struct platform_device *pdev, - struct rockchip_dmcdbg *dmcdbg) -{ - u32 version = 0x101; - int ret; - - ret = rk_dmcdbg_sip_smc_match_ver(pdev, version); - if (ret) - return ret; - - ret = proc_dmcdbg_init(pdev); - if (ret) - return ret; - - proc_dmcinfo_init(); - - return 0; -} - static const struct of_device_id rockchip_dmcdbg_of_match[] = { -#ifdef CONFIG_CPU_PX30 - { .compatible = "rockchip,px30-dmcdbg", .data = px30_dmcdbg_init }, -#endif -#ifdef CONFIG_CPU_RV1126 - { .compatible = "rockchip,rv1126-dmcdbg", .data = rv1126_dmcdbg_init }, -#endif -#ifdef CONFIG_CPU_RK3568 - { .compatible = "rockchip,rk3568-dmcdbg", .data = rk3568_dmcdbg_init }, -#endif + { .compatible = "rockchip,rv1126-dmcdbg", .data = rv1126_dmcdbg_init}, { }, }; MODULE_DEVICE_TABLE(of, rockchip_dmcdbg_of_match); -- Gitblit v1.6.2