Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

memory: tegra20-emc: Support matching timings by LPDDR2 configuration

ASUS Transformer TF101 doesn't provide RAM code and in this case memory
timings should be selected based on identity information read out from
SDRAM chip. Support matching timings by LPDDR2 configuration.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Link: https://lore.kernel.org/r/20211006224659.21434-10-digetx@gmail.com
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>

authored by

Dmitry Osipenko and committed by
Krzysztof Kozlowski
131dd9a4 38322cf4

+186 -14
+1
drivers/memory/tegra/Kconfig
··· 16 16 depends on ARCH_TEGRA_2x_SOC || COMPILE_TEST 17 17 select DEVFREQ_GOV_SIMPLE_ONDEMAND 18 18 select PM_DEVFREQ 19 + select DDR 19 20 help 20 21 This driver is for the External Memory Controller (EMC) found on 21 22 Tegra20 chips. The EMC controls the external DRAM on the board.
+185 -14
drivers/memory/tegra/tegra20-emc.c
··· 5 5 * Author: Dmitry Osipenko <digetx@gmail.com> 6 6 */ 7 7 8 + #include <linux/bitfield.h> 8 9 #include <linux/clk.h> 9 10 #include <linux/clk/tegra.h> 10 11 #include <linux/debugfs.h> ··· 28 27 #include <soc/tegra/common.h> 29 28 #include <soc/tegra/fuse.h> 30 29 30 + #include "../jedec_ddr.h" 31 + #include "../of_memory.h" 32 + 31 33 #include "mc.h" 32 34 33 35 #define EMC_INTSTATUS 0x000 34 36 #define EMC_INTMASK 0x004 35 37 #define EMC_DBG 0x008 38 + #define EMC_ADR_CFG_0 0x010 36 39 #define EMC_TIMING_CONTROL 0x028 37 40 #define EMC_RC 0x02c 38 41 #define EMC_RFC 0x030 ··· 73 68 #define EMC_QUSE_EXTRA 0x0ac 74 69 #define EMC_ODT_WRITE 0x0b0 75 70 #define EMC_ODT_READ 0x0b4 71 + #define EMC_MRR 0x0ec 76 72 #define EMC_FBIO_CFG5 0x104 77 73 #define EMC_FBIO_CFG6 0x114 78 74 #define EMC_STAT_CONTROL 0x160 ··· 100 94 101 95 #define EMC_REFRESH_OVERFLOW_INT BIT(3) 102 96 #define EMC_CLKCHANGE_COMPLETE_INT BIT(4) 97 + #define EMC_MRR_DIVLD_INT BIT(5) 103 98 104 99 #define EMC_DBG_READ_MUX_ASSEMBLY BIT(0) 105 100 #define EMC_DBG_WRITE_MUX_ACTIVE BIT(1) ··· 109 102 #define EMC_DBG_CFG_PRIORITY BIT(24) 110 103 111 104 #define EMC_FBIO_CFG5_DRAM_WIDTH_X16 BIT(4) 105 + #define EMC_FBIO_CFG5_DRAM_TYPE GENMASK(1, 0) 106 + 107 + #define EMC_MRR_DEV_SELECTN GENMASK(31, 30) 108 + #define EMC_MRR_MRR_MA GENMASK(23, 16) 109 + #define EMC_MRR_MRR_DATA GENMASK(15, 0) 110 + 111 + #define EMC_ADR_CFG_0_EMEM_NUMDEV GENMASK(25, 24) 112 112 113 113 #define EMC_PWR_GATHER_CLEAR (1 << 8) 114 114 #define EMC_PWR_GATHER_DISABLE (2 << 8) 115 115 #define EMC_PWR_GATHER_ENABLE (3 << 8) 116 + 117 + enum emc_dram_type { 118 + DRAM_TYPE_RESERVED, 119 + DRAM_TYPE_DDR1, 120 + DRAM_TYPE_LPDDR2, 121 + DRAM_TYPE_DDR2, 122 + }; 116 123 117 124 static const u16 emc_timing_registers[] = { 118 125 EMC_RC, ··· 222 201 struct mutex rate_lock; 223 202 224 203 struct devfreq_simple_ondemand_data ondemand_data; 204 + 205 + /* memory chip identity information */ 206 + union lpddr2_basic_config4 basic_conf4; 207 + unsigned int manufacturer_id; 208 + unsigned int revision_id1; 209 + unsigned int revision_id2; 210 + 211 + bool mrr_error; 225 212 }; 226 213 227 214 static irqreturn_t tegra_emc_isr(int irq, void *data) ··· 426 397 if (!emc->timings) 427 398 return -ENOMEM; 428 399 429 - emc->num_timings = child_count; 430 400 timing = emc->timings; 431 401 432 402 for_each_child_of_node(node, child) { 403 + if (of_node_name_eq(child, "lpddr2")) 404 + continue; 405 + 433 406 err = load_one_timing_from_dt(emc, timing++, child); 434 407 if (err) { 435 408 of_node_put(child); 436 409 return err; 437 410 } 411 + 412 + emc->num_timings++; 438 413 } 439 414 440 415 sort(emc->timings, emc->num_timings, sizeof(*timing), cmp_timings, ··· 455 422 } 456 423 457 424 static struct device_node * 458 - tegra_emc_find_node_by_ram_code(struct device *dev) 425 + tegra_emc_find_node_by_ram_code(struct tegra_emc *emc) 459 426 { 427 + struct device *dev = emc->dev; 460 428 struct device_node *np; 461 429 u32 value, ram_code; 462 430 int err; 431 + 432 + if (emc->mrr_error) { 433 + dev_warn(dev, "memory timings skipped due to MRR error\n"); 434 + return NULL; 435 + } 463 436 464 437 if (of_get_child_count(dev->of_node) == 0) { 465 438 dev_info_once(dev, "device-tree doesn't have memory timings\n"); ··· 481 442 np = of_find_node_by_name(np, "emc-tables")) { 482 443 err = of_property_read_u32(np, "nvidia,ram-code", &value); 483 444 if (err || value != ram_code) { 484 - of_node_put(np); 485 - continue; 445 + struct device_node *lpddr2_np; 446 + bool cfg_mismatches = false; 447 + 448 + lpddr2_np = of_find_node_by_name(np, "lpddr2"); 449 + if (lpddr2_np) { 450 + const struct lpddr2_info *info; 451 + 452 + info = of_lpddr2_get_info(lpddr2_np, dev); 453 + if (info) { 454 + if (info->manufacturer_id >= 0 && 455 + info->manufacturer_id != emc->manufacturer_id) 456 + cfg_mismatches = true; 457 + 458 + if (info->revision_id1 >= 0 && 459 + info->revision_id1 != emc->revision_id1) 460 + cfg_mismatches = true; 461 + 462 + if (info->revision_id2 >= 0 && 463 + info->revision_id2 != emc->revision_id2) 464 + cfg_mismatches = true; 465 + 466 + if (info->density != emc->basic_conf4.density) 467 + cfg_mismatches = true; 468 + 469 + if (info->io_width != emc->basic_conf4.io_width) 470 + cfg_mismatches = true; 471 + 472 + if (info->arch_type != emc->basic_conf4.arch_type) 473 + cfg_mismatches = true; 474 + } else { 475 + dev_err(dev, "failed to parse %pOF\n", lpddr2_np); 476 + cfg_mismatches = true; 477 + } 478 + 479 + of_node_put(lpddr2_np); 480 + } else { 481 + cfg_mismatches = true; 482 + } 483 + 484 + if (cfg_mismatches) { 485 + of_node_put(np); 486 + continue; 487 + } 486 488 } 487 489 488 490 return np; ··· 535 455 return NULL; 536 456 } 537 457 458 + static int emc_read_lpddr_mode_register(struct tegra_emc *emc, 459 + unsigned int emem_dev, 460 + unsigned int register_addr, 461 + unsigned int *register_data) 462 + { 463 + u32 memory_dev = emem_dev + 1; 464 + u32 val, mr_mask = 0xff; 465 + int err; 466 + 467 + /* clear data-valid interrupt status */ 468 + writel_relaxed(EMC_MRR_DIVLD_INT, emc->regs + EMC_INTSTATUS); 469 + 470 + /* issue mode register read request */ 471 + val = FIELD_PREP(EMC_MRR_DEV_SELECTN, memory_dev); 472 + val |= FIELD_PREP(EMC_MRR_MRR_MA, register_addr); 473 + 474 + writel_relaxed(val, emc->regs + EMC_MRR); 475 + 476 + /* wait for the LPDDR2 data-valid interrupt */ 477 + err = readl_relaxed_poll_timeout_atomic(emc->regs + EMC_INTSTATUS, val, 478 + val & EMC_MRR_DIVLD_INT, 479 + 1, 100); 480 + if (err) { 481 + dev_err(emc->dev, "mode register %u read failed: %d\n", 482 + register_addr, err); 483 + emc->mrr_error = true; 484 + return err; 485 + } 486 + 487 + /* read out mode register data */ 488 + val = readl_relaxed(emc->regs + EMC_MRR); 489 + *register_data = FIELD_GET(EMC_MRR_MRR_DATA, val) & mr_mask; 490 + 491 + return 0; 492 + } 493 + 494 + static void emc_read_lpddr_sdram_info(struct tegra_emc *emc, 495 + unsigned int emem_dev, 496 + bool print_out) 497 + { 498 + /* these registers are standard for all LPDDR JEDEC memory chips */ 499 + emc_read_lpddr_mode_register(emc, emem_dev, 5, &emc->manufacturer_id); 500 + emc_read_lpddr_mode_register(emc, emem_dev, 6, &emc->revision_id1); 501 + emc_read_lpddr_mode_register(emc, emem_dev, 7, &emc->revision_id2); 502 + emc_read_lpddr_mode_register(emc, emem_dev, 8, &emc->basic_conf4.value); 503 + 504 + if (!print_out) 505 + return; 506 + 507 + dev_info(emc->dev, "SDRAM[dev%u]: manufacturer: 0x%x (%s) rev1: 0x%x rev2: 0x%x prefetch: S%u density: %uMbit iowidth: %ubit\n", 508 + emem_dev, emc->manufacturer_id, 509 + lpddr2_jedec_manufacturer(emc->manufacturer_id), 510 + emc->revision_id1, emc->revision_id2, 511 + 4 >> emc->basic_conf4.arch_type, 512 + 64 << emc->basic_conf4.density, 513 + 32 >> emc->basic_conf4.io_width); 514 + } 515 + 538 516 static int emc_setup_hw(struct tegra_emc *emc) 539 517 { 518 + u32 emc_cfg, emc_dbg, emc_fbio, emc_adr_cfg; 540 519 u32 intmask = EMC_REFRESH_OVERFLOW_INT; 541 - u32 emc_cfg, emc_dbg, emc_fbio; 520 + static bool print_sdram_info_once; 521 + enum emc_dram_type dram_type; 522 + const char *dram_type_str; 523 + unsigned int emem_numdev; 542 524 543 525 emc_cfg = readl_relaxed(emc->regs + EMC_CFG_2); 544 526 ··· 638 496 else 639 497 emc->dram_bus_width = 32; 640 498 641 - dev_info_once(emc->dev, "%ubit DRAM bus\n", emc->dram_bus_width); 499 + dram_type = FIELD_GET(EMC_FBIO_CFG5_DRAM_TYPE, emc_fbio); 500 + 501 + switch (dram_type) { 502 + case DRAM_TYPE_RESERVED: 503 + dram_type_str = "INVALID"; 504 + break; 505 + case DRAM_TYPE_DDR1: 506 + dram_type_str = "DDR1"; 507 + break; 508 + case DRAM_TYPE_LPDDR2: 509 + dram_type_str = "LPDDR2"; 510 + break; 511 + case DRAM_TYPE_DDR2: 512 + dram_type_str = "DDR2"; 513 + break; 514 + } 515 + 516 + emc_adr_cfg = readl_relaxed(emc->regs + EMC_ADR_CFG_0); 517 + emem_numdev = FIELD_GET(EMC_ADR_CFG_0_EMEM_NUMDEV, emc_adr_cfg) + 1; 518 + 519 + dev_info_once(emc->dev, "%ubit DRAM bus, %u %s %s attached\n", 520 + emc->dram_bus_width, emem_numdev, dram_type_str, 521 + emem_numdev == 2 ? "devices" : "device"); 522 + 523 + if (dram_type == DRAM_TYPE_LPDDR2) { 524 + while (emem_numdev--) 525 + emc_read_lpddr_sdram_info(emc, emem_numdev, 526 + !print_sdram_info_once); 527 + print_sdram_info_once = true; 528 + } 642 529 643 530 return 0; 644 531 } ··· 1220 1049 emc->clk_nb.notifier_call = tegra_emc_clk_change_notify; 1221 1050 emc->dev = &pdev->dev; 1222 1051 1223 - np = tegra_emc_find_node_by_ram_code(&pdev->dev); 1224 - if (np) { 1225 - err = tegra_emc_load_timings_from_dt(emc, np); 1226 - of_node_put(np); 1227 - if (err) 1228 - return err; 1229 - } 1230 - 1231 1052 emc->regs = devm_platform_ioremap_resource(pdev, 0); 1232 1053 if (IS_ERR(emc->regs)) 1233 1054 return PTR_ERR(emc->regs); ··· 1227 1064 err = emc_setup_hw(emc); 1228 1065 if (err) 1229 1066 return err; 1067 + 1068 + np = tegra_emc_find_node_by_ram_code(emc); 1069 + if (np) { 1070 + err = tegra_emc_load_timings_from_dt(emc, np); 1071 + of_node_put(np); 1072 + if (err) 1073 + return err; 1074 + } 1230 1075 1231 1076 err = devm_request_irq(&pdev->dev, irq, tegra_emc_isr, 0, 1232 1077 dev_name(&pdev->dev), emc);