Lines Matching +full:valid +full:- +full:mask
1 // SPDX-License-Identifier: GPL-2.0-only
32 * struct emif_data - Per device static data for driver's use
37 * to this EMIF - read from MR4 register. If there
42 * @base: base address of memory-mapped IO registers.
46 * frequencies, to avoid re-calculating them on
79 u32 type = emif->plat_data->device_info->type; in do_emif_regdump_show()
80 u32 ip_rev = emif->plat_data->ip_rev; in do_emif_regdump_show()
83 regs->freq/1000000); in do_emif_regdump_show()
85 seq_printf(s, "ref_ctrl_shdw\t: 0x%08x\n", regs->ref_ctrl_shdw); in do_emif_regdump_show()
86 seq_printf(s, "sdram_tim1_shdw\t: 0x%08x\n", regs->sdram_tim1_shdw); in do_emif_regdump_show()
87 seq_printf(s, "sdram_tim2_shdw\t: 0x%08x\n", regs->sdram_tim2_shdw); in do_emif_regdump_show()
88 seq_printf(s, "sdram_tim3_shdw\t: 0x%08x\n", regs->sdram_tim3_shdw); in do_emif_regdump_show()
92 regs->read_idle_ctrl_shdw_normal); in do_emif_regdump_show()
94 regs->read_idle_ctrl_shdw_volt_ramp); in do_emif_regdump_show()
97 regs->dll_calib_ctrl_shdw_normal); in do_emif_regdump_show()
99 regs->dll_calib_ctrl_shdw_volt_ramp); in do_emif_regdump_show()
104 regs->ref_ctrl_shdw_derated); in do_emif_regdump_show()
106 regs->sdram_tim1_shdw_derated); in do_emif_regdump_show()
108 regs->sdram_tim3_shdw_derated); in do_emif_regdump_show()
114 struct emif_data *emif = s->private; in emif_regdump_show()
118 if (emif->duplicate) in emif_regdump_show()
119 regs_cache = emif1->regs_cache; in emif_regdump_show()
121 regs_cache = emif->regs_cache; in emif_regdump_show()
135 struct emif_data *emif = s->private; in emif_mr4_show()
137 seq_printf(s, "MR4=%d\n", emif->temperature_level); in emif_mr4_show()
145 emif->debugfs_root = debugfs_create_dir(dev_name(emif->dev), NULL); in emif_debugfs_init()
146 debugfs_create_file("regcache_dump", S_IRUGO, emif->debugfs_root, emif, in emif_debugfs_init()
148 debugfs_create_file("mr4", S_IRUGO, emif->debugfs_root, emif, in emif_debugfs_init()
155 debugfs_remove_recursive(emif->debugfs_root); in emif_debugfs_exit()
156 emif->debugfs_root = NULL; in emif_debugfs_exit()
171 * bus width of the DDR devices used. For instance two 16-bit DDR devices
178 void __iomem *base = emif->base; in get_emif_bus_width()
190 void __iomem *base = emif->base; in set_lpmode()
193 * Workaround for errata i743 - LPDDR2 Power-Down State is Not in set_lpmode()
197 * The EMIF supports power-down state for low power. The EMIF in set_lpmode()
198 * automatically puts the SDRAM into power-down after the memory is in set_lpmode()
203 * power-down and precharge power-down modes. The EMIF waits and in set_lpmode()
206 * exit of power-down mode. Due to very short periods of power-down in set_lpmode()
209 * issuing ZQ calibration long commands when exiting self-refresh is in set_lpmode()
213 * Because there is no power consumption benefit of the power-down due in set_lpmode()
215 * is to not allow power-down state and, therefore, to not have set in set_lpmode()
218 if ((emif->plat_data->ip_rev == EMIF_4D) && in set_lpmode()
222 /* rollback LP_MODE to Self-refresh mode */ in set_lpmode()
240 * The EMIF automatically puts the SDRAM into self-refresh mode in do_freq_update()
246 * - The SR_TIMING counter expires in do_freq_update()
247 * - And frequency change is requested in do_freq_update()
248 * - And OCP access is requested in do_freq_update()
253 * is to disable the self-refresh when requesting a frequency in do_freq_update()
260 if (emif->lpmode == EMIF_LP_MODE_SELF_REFRESH) in do_freq_update()
271 if (emif->lpmode == EMIF_LP_MODE_SELF_REFRESH) in do_freq_update()
282 type = device_info->type; in get_addressing_table()
283 density = device_info->density; in get_addressing_table()
287 index = density - 1; in get_addressing_table()
296 index = density - 1; in get_addressing_table()
311 val = EMIF_ZQCS_INTERVAL_US * 1000 / addressing->tREFI_ns; in get_zq_config_reg()
314 val = DIV_ROUND_UP(T_ZQCL_DEFAULT_NS, T_ZQCS_DEFAULT_NS) - 1; in get_zq_config_reg()
317 val = DIV_ROUND_UP(T_ZQINIT_DEFAULT_NS, T_ZQCL_DEFAULT_NS) - 1; in get_zq_config_reg()
341 if (custom_configs && (custom_configs->mask & in get_temp_alert_config()
343 interval = custom_configs->temp_alert_poll_interval_ms; in get_temp_alert_config()
348 interval /= addressing->tREFI_ns; /* Convert to refresh cycles */ in get_temp_alert_config()
352 * sdram_io_width is in 'log2(x) - 1' form. Convert emif_bus_width in get_temp_alert_config()
356 emif_bus_width = __fls(emif_bus_width) - 1; in get_temp_alert_config()
357 devcnt = emif_bus_width - sdram_io_width; in get_temp_alert_config()
360 /* DEVWDT is in 'log2(x) - 3' form */ in get_temp_alert_config()
361 alert |= (sdram_io_width - 2) << TA_DEVWDT_SHIFT; in get_temp_alert_config()
377 u32 mask; in get_pwr_mgmt_ctrl() local
380 struct emif_custom_configs *cust_cfgs = emif->plat_data->custom_configs; in get_pwr_mgmt_ctrl()
382 if (cust_cfgs && (cust_cfgs->mask & EMIF_CUSTOM_CONFIG_LPMODE)) { in get_pwr_mgmt_ctrl()
383 lpmode = cust_cfgs->lpmode; in get_pwr_mgmt_ctrl()
384 timeout_perf = cust_cfgs->lpmode_timeout_performance; in get_pwr_mgmt_ctrl()
385 timeout_pwr = cust_cfgs->lpmode_timeout_power; in get_pwr_mgmt_ctrl()
386 freq_threshold = cust_cfgs->lpmode_freq_threshold; in get_pwr_mgmt_ctrl()
393 * The value to be set in register is "log2(timeout) - 3" in get_pwr_mgmt_ctrl()
400 if (timeout & (timeout - 1)) in get_pwr_mgmt_ctrl()
402 timeout = __fls(timeout) - 3; in get_pwr_mgmt_ctrl()
408 mask = CS_TIM_MASK; in get_pwr_mgmt_ctrl()
416 mask = SR_TIM_MASK; in get_pwr_mgmt_ctrl()
420 mask = PD_TIM_MASK; in get_pwr_mgmt_ctrl()
424 mask = 0; in get_pwr_mgmt_ctrl()
429 if (lpmode != EMIF_LP_MODE_DISABLE && timeout > mask >> shift) { in get_pwr_mgmt_ctrl()
430 pr_err("TIMEOUT Overflow - lpmode=%d perf=%d pwr=%d freq=%d\n", in get_pwr_mgmt_ctrl()
436 timeout, mask >> shift); in get_pwr_mgmt_ctrl()
437 timeout = mask >> shift; in get_pwr_mgmt_ctrl()
441 pwr_mgmt_ctrl = (timeout << shift) & mask; in get_pwr_mgmt_ctrl()
442 /* setup a default mask for rest of the modes */ in get_pwr_mgmt_ctrl()
444 ~mask; in get_pwr_mgmt_ctrl()
466 base = emif->base; in get_temperature_level()
474 if (emif->plat_data->device_info->cs1_used) { in get_temperature_level()
488 emif->temperature_level = temperature_level; in get_temperature_level()
492 * setup_temperature_sensitive_regs() - set the timings for temperature
503 void __iomem *base = emif->base; in setup_temperature_sensitive_regs()
506 type = emif->plat_data->device_info->type; in setup_temperature_sensitive_regs()
508 tim1 = regs->sdram_tim1_shdw; in setup_temperature_sensitive_regs()
509 tim3 = regs->sdram_tim3_shdw; in setup_temperature_sensitive_regs()
510 ref_ctrl = regs->ref_ctrl_shdw; in setup_temperature_sensitive_regs()
512 /* No de-rating for non-lpddr2 devices */ in setup_temperature_sensitive_regs()
516 temperature = emif->temperature_level; in setup_temperature_sensitive_regs()
518 ref_ctrl = regs->ref_ctrl_shdw_derated; in setup_temperature_sensitive_regs()
520 tim1 = regs->sdram_tim1_shdw_derated; in setup_temperature_sensitive_regs()
521 tim3 = regs->sdram_tim3_shdw_derated; in setup_temperature_sensitive_regs()
522 ref_ctrl = regs->ref_ctrl_shdw_derated; in setup_temperature_sensitive_regs()
538 old_temp_level = emif->temperature_level; in handle_temp_alert()
541 if (unlikely(emif->temperature_level == old_temp_level)) { in handle_temp_alert()
543 } else if (!emif->curr_regs) { in handle_temp_alert()
544 dev_err(emif->dev, "temperature alert before registers are calculated, not de-rating timings\n"); in handle_temp_alert()
548 custom_configs = emif->plat_data->custom_configs; in handle_temp_alert()
554 if (custom_configs && !(custom_configs->mask & in handle_temp_alert()
556 if (emif->temperature_level >= SDRAM_TEMP_HIGH_DERATE_REFRESH) { in handle_temp_alert()
557 dev_err(emif->dev, in handle_temp_alert()
559 __func__, emif->temperature_level); in handle_temp_alert()
561 * Temperature far too high - do kernel_power_off() in handle_temp_alert()
564 emif->temperature_level = SDRAM_TEMP_VERY_HIGH_SHUTDOWN; in handle_temp_alert()
570 if (emif->temperature_level < old_temp_level || in handle_temp_alert()
571 emif->temperature_level == SDRAM_TEMP_VERY_HIGH_SHUTDOWN) { in handle_temp_alert()
573 * Temperature coming down - defer handling to thread OR in handle_temp_alert()
574 * Temperature far too high - do kernel_power_off() from in handle_temp_alert()
579 /* Temperature is going up - handle immediately */ in handle_temp_alert()
580 setup_temperature_sensitive_regs(emif, emif->curr_regs); in handle_temp_alert()
593 void __iomem *base = emif->base; in emif_interrupt_handler()
594 struct device *dev = emif->dev; in emif_interrupt_handler()
610 dev_err(dev, "Access error from SYS port - %x\n", interrupts); in emif_interrupt_handler()
612 if (emif->plat_data->hw_caps & EMIF_HW_CAPS_LL_INTERFACE) { in emif_interrupt_handler()
618 dev_err(dev, "Access error from LL port - %x\n", in emif_interrupt_handler()
629 if (emif->temperature_level == SDRAM_TEMP_VERY_HIGH_SHUTDOWN) { in emif_threaded_isr()
630 dev_emerg(emif->dev, "SDRAM temperature exceeds operating limit.. Needs shut down!!!\n"); in emif_threaded_isr()
637 kernel_restart("SDRAM Over-temp Emergency restart"); in emif_threaded_isr()
644 if (emif->curr_regs) { in emif_threaded_isr()
645 setup_temperature_sensitive_regs(emif, emif->curr_regs); in emif_threaded_isr()
648 dev_err(emif->dev, "temperature alert before registers are calculated, not de-rating timings\n"); in emif_threaded_isr()
658 void __iomem *base = emif->base; in clear_all_interrupts()
662 if (emif->plat_data->hw_caps & EMIF_HW_CAPS_LL_INTERFACE) in clear_all_interrupts()
669 void __iomem *base = emif->base; in disable_and_clear_all_interrupts()
674 if (emif->plat_data->hw_caps & EMIF_HW_CAPS_LL_INTERFACE) in disable_and_clear_all_interrupts()
685 void __iomem *base = emif->base; in setup_interrupts()
687 type = emif->plat_data->device_info->type; in setup_interrupts()
698 if (emif->plat_data->hw_caps & EMIF_HW_CAPS_LL_INTERFACE) { in setup_interrupts()
705 return devm_request_threaded_irq(emif->dev, irq, in setup_interrupts()
708 0, dev_name(emif->dev), in setup_interrupts()
716 void __iomem *base = emif->base; in emif_onetime_settings()
720 device_info = emif->plat_data->device_info; in emif_onetime_settings()
729 emif->plat_data->ip_rev); in emif_onetime_settings()
730 emif->lpmode = (pwr_mgmt_ctrl & LP_MODE_MASK) >> LP_MODE_SHIFT; in emif_onetime_settings()
734 zq = get_zq_config_reg(addressing, device_info->cs1_used, in emif_onetime_settings()
735 device_info->cal_resistors_per_cs); in emif_onetime_settings()
740 if (emif->temperature_level == SDRAM_TEMP_VERY_HIGH_SHUTDOWN) in emif_onetime_settings()
741 dev_emerg(emif->dev, "SDRAM temperature exceeds operating limit.. Needs shut down!!!\n"); in emif_onetime_settings()
745 emif->plat_data->custom_configs, device_info->cs1_used, in emif_onetime_settings()
746 device_info->io_width, get_emif_bus_width(emif)); in emif_onetime_settings()
753 if (emif->plat_data->phy_type != EMIF_PHY_TYPE_INTELLIPHY) in emif_onetime_settings()
780 struct emif_platform_data *pd = emif->plat_data; in get_default_timings()
782 pd->timings = lpddr2_jedec_timings; in get_default_timings()
783 pd->timings_arr_size = ARRAY_SIZE(lpddr2_jedec_timings); in get_default_timings()
785 dev_warn(emif->dev, "%s: using default timings\n", __func__); in get_default_timings()
791 int valid; in is_dev_data_valid() local
793 valid = (type == DDR_TYPE_LPDDR2_S4 || in is_dev_data_valid()
803 valid = valid && (phy_type == EMIF_PHY_TYPE_ATTILAPHY); in is_dev_data_valid()
806 valid = valid && (phy_type == EMIF_PHY_TYPE_INTELLIPHY); in is_dev_data_valid()
809 valid = 0; in is_dev_data_valid()
812 if (!valid) in is_dev_data_valid()
814 return valid; in is_dev_data_valid()
820 int valid = 1; in is_custom_config_valid() local
822 if ((cust_cfgs->mask & EMIF_CUSTOM_CONFIG_LPMODE) && in is_custom_config_valid()
823 (cust_cfgs->lpmode != EMIF_LP_MODE_DISABLE)) in is_custom_config_valid()
824 valid = cust_cfgs->lpmode_freq_threshold && in is_custom_config_valid()
825 cust_cfgs->lpmode_timeout_performance && in is_custom_config_valid()
826 cust_cfgs->lpmode_timeout_power; in is_custom_config_valid()
828 if (cust_cfgs->mask & EMIF_CUSTOM_CONFIG_TEMP_ALERT_POLL_INTERVAL) in is_custom_config_valid()
829 valid = valid && cust_cfgs->temp_alert_poll_interval_ms; in is_custom_config_valid()
831 if (!valid) in is_custom_config_valid()
834 return valid; in is_custom_config_valid()
845 lpmode = of_get_property(np_emif, "low-power-mode", &len); in of_get_custom_configs()
846 poll_intvl = of_get_property(np_emif, "temp-alert-poll-interval", &len); in of_get_custom_configs()
849 cust_cfgs = devm_kzalloc(emif->dev, sizeof(*cust_cfgs), in of_get_custom_configs()
856 cust_cfgs->mask |= EMIF_CUSTOM_CONFIG_LPMODE; in of_get_custom_configs()
857 cust_cfgs->lpmode = be32_to_cpup(lpmode); in of_get_custom_configs()
859 "low-power-mode-timeout-performance", in of_get_custom_configs()
860 &cust_cfgs->lpmode_timeout_performance); in of_get_custom_configs()
862 "low-power-mode-timeout-power", in of_get_custom_configs()
863 &cust_cfgs->lpmode_timeout_power); in of_get_custom_configs()
865 "low-power-mode-freq-threshold", in of_get_custom_configs()
866 &cust_cfgs->lpmode_freq_threshold); in of_get_custom_configs()
870 cust_cfgs->mask |= in of_get_custom_configs()
872 cust_cfgs->temp_alert_poll_interval_ms = in of_get_custom_configs()
876 if (of_find_property(np_emif, "extended-temp-part", &len)) in of_get_custom_configs()
877 cust_cfgs->mask |= EMIF_CUSTOM_CONFIG_EXTENDED_TEMP_PART; in of_get_custom_configs()
879 if (!is_custom_config_valid(cust_cfgs, emif->dev)) { in of_get_custom_configs()
880 devm_kfree(emif->dev, cust_cfgs); in of_get_custom_configs()
884 emif->plat_data->custom_configs = cust_cfgs; in of_get_custom_configs()
894 if (of_find_property(np_emif, "cs1-used", &len)) in of_get_ddr_info()
895 dev_info->cs1_used = true; in of_get_ddr_info()
897 if (of_find_property(np_emif, "cal-resistor-per-cs", &len)) in of_get_ddr_info()
898 dev_info->cal_resistors_per_cs = true; in of_get_ddr_info()
900 if (of_device_is_compatible(np_ddr, "jedec,lpddr2-s4")) in of_get_ddr_info()
901 dev_info->type = DDR_TYPE_LPDDR2_S4; in of_get_ddr_info()
902 else if (of_device_is_compatible(np_ddr, "jedec,lpddr2-s2")) in of_get_ddr_info()
903 dev_info->type = DDR_TYPE_LPDDR2_S2; in of_get_ddr_info()
906 of_property_read_u32(np_ddr, "io-width", &io_width); in of_get_ddr_info()
909 if (density & (density - 1)) in of_get_ddr_info()
910 dev_info->density = 0; in of_get_ddr_info()
912 dev_info->density = __fls(density) - 5; in of_get_ddr_info()
915 if (io_width & (io_width - 1)) in of_get_ddr_info()
916 dev_info->io_width = 0; in of_get_ddr_info()
918 dev_info->io_width = __fls(io_width) - 1; in of_get_ddr_info()
930 np_ddr = of_parse_phandle(np_emif, "device-handle", 0); in of_get_memory_device_details()
943 emif->plat_data = pd; in of_get_memory_device_details()
944 pd->device_info = dev_info; in of_get_memory_device_details()
945 emif->dev = dev; in of_get_memory_device_details()
946 emif->np_ddr = np_ddr; in of_get_memory_device_details()
947 emif->temperature_level = SDRAM_TEMP_NOMINAL; in of_get_memory_device_details()
949 if (of_device_is_compatible(np_emif, "ti,emif-4d")) in of_get_memory_device_details()
950 emif->plat_data->ip_rev = EMIF_4D; in of_get_memory_device_details()
951 else if (of_device_is_compatible(np_emif, "ti,emif-4d5")) in of_get_memory_device_details()
952 emif->plat_data->ip_rev = EMIF_4D5; in of_get_memory_device_details()
954 of_property_read_u32(np_emif, "phy-type", &pd->phy_type); in of_get_memory_device_details()
956 if (of_find_property(np_emif, "hw-caps-ll-interface", &len)) in of_get_memory_device_details()
957 pd->hw_caps |= EMIF_HW_CAPS_LL_INTERFACE; in of_get_memory_device_details()
960 if (!is_dev_data_valid(pd->device_info->type, pd->device_info->density, in of_get_memory_device_details()
961 pd->device_info->io_width, pd->phy_type, pd->ip_rev, in of_get_memory_device_details()
962 emif->dev)) { in of_get_memory_device_details()
972 if (emif1 && emif1->np_ddr == np_ddr) { in of_get_memory_device_details()
973 emif->duplicate = true; in of_get_memory_device_details()
976 dev_warn(emif->dev, "%s: Non-symmetric DDR geometry\n", in of_get_memory_device_details()
981 emif->plat_data->timings = of_get_ddr_timings(np_ddr, emif->dev, in of_get_memory_device_details()
982 emif->plat_data->device_info->type, in of_get_memory_device_details()
983 &emif->plat_data->timings_arr_size); in of_get_memory_device_details()
985 emif->plat_data->min_tck = of_get_min_tck(np_ddr, emif->dev); in of_get_memory_device_details()
1014 pd = pdev->dev.platform_data; in get_device_details()
1015 dev = &pdev->dev; in get_device_details()
1017 if (!(pd && pd->device_info && is_dev_data_valid(pd->device_info->type, in get_device_details()
1018 pd->device_info->density, pd->device_info->io_width, in get_device_details()
1019 pd->phy_type, pd->ip_rev, dev))) { in get_device_details()
1033 memcpy(dev_info, pd->device_info, sizeof(*dev_info)); in get_device_details()
1035 pd->device_info = dev_info; in get_device_details()
1036 emif->plat_data = pd; in get_device_details()
1037 emif->dev = dev; in get_device_details()
1038 emif->temperature_level = SDRAM_TEMP_NOMINAL; in get_device_details()
1046 emif->duplicate = emif1 && (memcmp(dev_info, in get_device_details()
1047 emif1->plat_data->device_info, in get_device_details()
1050 if (emif->duplicate) { in get_device_details()
1051 pd->timings = NULL; in get_device_details()
1052 pd->min_tck = NULL; in get_device_details()
1055 dev_warn(emif->dev, "%s: Non-symmetric DDR geometry\n", in get_device_details()
1060 * Copy custom configs - ignore allocation error, if any, as in get_device_details()
1063 cust_cfgs = pd->custom_configs; in get_device_details()
1068 pd->custom_configs = temp; in get_device_details()
1072 * Copy timings and min-tck values from platform data. If it is not in get_device_details()
1075 size = sizeof(struct lpddr2_timings) * pd->timings_arr_size; in get_device_details()
1076 if (pd->timings) { in get_device_details()
1079 memcpy(temp, pd->timings, size); in get_device_details()
1080 pd->timings = temp; in get_device_details()
1088 if (pd->min_tck) { in get_device_details()
1089 temp = devm_kzalloc(dev, sizeof(*pd->min_tck), GFP_KERNEL); in get_device_details()
1091 memcpy(temp, pd->min_tck, sizeof(*pd->min_tck)); in get_device_details()
1092 pd->min_tck = temp; in get_device_details()
1094 pd->min_tck = &lpddr2_jedec_min_tck; in get_device_details()
1097 pd->min_tck = &lpddr2_jedec_min_tck; in get_device_details()
1112 if (pdev->dev.of_node) in emif_probe()
1113 emif = of_get_memory_device_details(pdev->dev.of_node, &pdev->dev); in emif_probe()
1122 list_add(&emif->node, &device_list); in emif_probe()
1125 emif->dev = &pdev->dev; in emif_probe()
1128 emif->base = devm_platform_ioremap_resource(pdev, 0); in emif_probe()
1129 if (IS_ERR(emif->base)) in emif_probe()
1143 /* One-time actions taken on probing the first device */ in emif_probe()
1154 dev_info(&pdev->dev, "%s: device configured with addr = %p and IRQ%d\n", in emif_probe()
1155 __func__, emif->base, irq); in emif_probe()
1159 return -ENODEV; in emif_probe()
1180 { .compatible = "ti,emif-4d" },
1181 { .compatible = "ti,emif-4d5" },