hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
 * Copyright (c) 2011 The Chromium OS Authors.
 * (C) Copyright 2010,2011 NVIDIA Corporation <www.nvidia.com>
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#ifndef _ARCH_EMC_H_
#define _ARCH_EMC_H_
 
#include <asm/types.h>
 
#define TEGRA_EMC_NUM_REGS    46
 
/* EMC Registers */
struct emc_ctlr {
   u32 cfg;        /* 0x00: EMC_CFG */
   u32 reserved0[3];    /* 0x04 ~ 0x0C */
   u32 adr_cfg;        /* 0x10: EMC_ADR_CFG */
   u32 adr_cfg1;        /* 0x14: EMC_ADR_CFG_1 */
   u32 reserved1[2];    /* 0x18 ~ 0x18 */
   u32 refresh_ctrl;    /* 0x20: EMC_REFCTRL */
   u32 pin;        /* 0x24: EMC_PIN */
   u32 timing_ctrl;    /* 0x28: EMC_TIMING_CONTROL */
   u32 rc;            /* 0x2C: EMC_RC */
   u32 rfc;        /* 0x30: EMC_RFC */
   u32 ras;        /* 0x34: EMC_RAS */
   u32 rp;            /* 0x38: EMC_RP */
   u32 r2w;        /* 0x3C: EMC_R2W */
   u32 w2r;        /* 0x40: EMC_W2R */
   u32 r2p;        /* 0x44: EMC_R2P */
   u32 w2p;        /* 0x48: EMC_W2P */
   u32 rd_rcd;        /* 0x4C: EMC_RD_RCD */
   u32 wd_rcd;        /* 0x50: EMC_WD_RCD */
   u32 rrd;        /* 0x54: EMC_RRD */
   u32 rext;        /* 0x58: EMC_REXT */
   u32 wdv;        /* 0x5C: EMC_WDV */
   u32 quse;        /* 0x60: EMC_QUSE */
   u32 qrst;        /* 0x64: EMC_QRST */
   u32 qsafe;        /* 0x68: EMC_QSAFE */
   u32 rdv;        /* 0x6C: EMC_RDV */
   u32 refresh;        /* 0x70: EMC_REFRESH */
   u32 burst_refresh_num;    /* 0x74: EMC_BURST_REFRESH_NUM */
   u32 pdex2wr;        /* 0x78: EMC_PDEX2WR */
   u32 pdex2rd;        /* 0x7c: EMC_PDEX2RD */
   u32 pchg2pden;        /* 0x80: EMC_PCHG2PDEN */
   u32 act2pden;        /* 0x84: EMC_ACT2PDEN */
   u32 ar2pden;        /* 0x88: EMC_AR2PDEN */
   u32 rw2pden;        /* 0x8C: EMC_RW2PDEN */
   u32 txsr;        /* 0x90: EMC_TXSR */
   u32 tcke;        /* 0x94: EMC_TCKE */
   u32 tfaw;        /* 0x98: EMC_TFAW */
   u32 trpab;        /* 0x9C: EMC_TRPAB */
   u32 tclkstable;        /* 0xA0: EMC_TCLKSTABLE */
   u32 tclkstop;        /* 0xA4: EMC_TCLKSTOP */
   u32 trefbw;        /* 0xA8: EMC_TREFBW */
   u32 quse_extra;        /* 0xAC: EMC_QUSE_EXTRA */
   u32 odt_write;        /* 0xB0: EMC_ODT_WRITE */
   u32 odt_read;        /* 0xB4: EMC_ODT_READ */
   u32 reserved2[5];    /* 0xB8 ~ 0xC8 */
   u32 mrs;        /* 0xCC: EMC_MRS */
   u32 emrs;        /* 0xD0: EMC_EMRS */
   u32 ref;        /* 0xD4: EMC_REF */
   u32 pre;        /* 0xD8: EMC_PRE */
   u32 nop;        /* 0xDC: EMC_NOP */
   u32 self_ref;        /* 0xE0: EMC_SELF_REF */
   u32 dpd;        /* 0xE4: EMC_DPD */
   u32 mrw;        /* 0xE8: EMC_MRW */
   u32 mrr;        /* 0xEC: EMC_MRR */
   u32 reserved3;        /* 0xF0: */
   u32 fbio_cfg1;        /* 0xF4: EMC_FBIO_CFG1 */
   u32 fbio_dqsib_dly;    /* 0xF8: EMC_FBIO_DQSIB_DLY */
   u32 fbio_dqsib_dly_msb;    /* 0xFC: EMC_FBIO_DQSIB_DLY_MSG */
   u32 fbio_spare;        /* 0x100: SBIO_SPARE */
               /* There are more registers ... */
};
 
/**
 * Set up the EMC for the given rate. The timing parameters are retrieved
 * from the device tree "nvidia,tegra20-emc" node and its
 * "nvidia,tegra20-emc-table" sub-nodes.
 *
 * @param blob    Device tree blob
 * @param rate    Clock speed of memory controller in Hz (=2x memory bus rate)
 * @return 0 if ok, else -ve error code (look in emc.c to decode it)
 */
int tegra_set_emc(const void *blob, unsigned rate);
 
/**
 * Get a pointer to the EMC controller from the device tree.
 *
 * @param blob    Device tree blob
 * @return pointer to EMC controller
 */
struct emc_ctlr *emc_get_controller(const void *blob);
 
#endif