aboutsummaryrefslogtreecommitdiff
path: root/src/northbridge/intel/e7505/northbridge.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/northbridge/intel/e7505/northbridge.c')
-rw-r--r--src/northbridge/intel/e7505/northbridge.c107
1 files changed, 33 insertions, 74 deletions
diff --git a/src/northbridge/intel/e7505/northbridge.c b/src/northbridge/intel/e7505/northbridge.c
index ea8b4598f4..6d351a3117 100644
--- a/src/northbridge/intel/e7505/northbridge.c
+++ b/src/northbridge/intel/e7505/northbridge.c
@@ -31,84 +31,43 @@ unsigned long acpi_fill_mcfg(unsigned long current)
static void mch_domain_read_resources(struct device *dev)
{
+ int idx;
+ unsigned long tomk, tolmk;
+ unsigned long remapbasek, remaplimitk;
+ const unsigned long basek_4G = 4 * (GiB / KiB);
struct device *mc_dev;
- uint32_t pci_tolm;
pci_domain_read_resources(dev);
- pci_tolm = find_pci_tolm(dev->link_list);
- mc_dev = dev->link_list->children;
- if (mc_dev) {
- /* Figure out which areas are/should be occupied by RAM.
- * This is all computed in kilobytes and converted to/from
- * the memory controller right at the edges.
- * Having different variables in different units is
- * too confusing to get right. Kilobytes are good up to
- * 4 Terabytes of RAM...
- */
- uint16_t tolm_r, remapbase_r, remaplimit_r;
- unsigned long tomk, tolmk;
- unsigned long remapbasek, remaplimitk;
- int idx;
-
- /* Get the value of the highest DRB. This tells the end of
- * the physical memory. The units are ticks of 64MB
- * i.e. 1 means 64MB.
- */
- tomk = ((unsigned long)pci_read_config8(mc_dev, DRB_ROW_7)) << 16;
- /* Compute the top of Low memory */
- tolmk = pci_tolm >> 10;
- if (tolmk >= tomk) {
- /* The PCI hole does not overlap memory
- * we won't use the remap window.
- */
- tolmk = tomk;
- remapbasek = 0x3ff << 16;
- remaplimitk = 0 << 16;
- }
- else {
- /* The PCI memory hole overlaps memory
- * setup the remap window.
- */
- /* Find the bottom of the remap window
- * is it above 4G?
- */
- remapbasek = 4*1024*1024;
- if (tomk > remapbasek) {
- remapbasek = tomk;
- }
- /* Find the limit of the remap window */
- remaplimitk = (remapbasek + (4*1024*1024 - tolmk) - (1 << 16));
- }
- /* Write the RAM configuration registers,
- * preserving the reserved bits.
- */
- tolm_r = pci_read_config16(mc_dev, TOLM);
- tolm_r = ((tolmk >> 17) << 11) | (tolm_r & 0x7ff);
- pci_write_config16(mc_dev, TOLM, tolm_r);
-
- remapbase_r = pci_read_config16(mc_dev, REMAPBASE);
- remapbase_r = (remapbasek >> 16) | (remapbase_r & 0xfc00);
- pci_write_config16(mc_dev, REMAPBASE, remapbase_r);
-
- remaplimit_r = pci_read_config16(mc_dev, REMAPLIMIT);
- remaplimit_r = (remaplimitk >> 16) | (remaplimit_r & 0xfc00);
- pci_write_config16(mc_dev, REMAPLIMIT, remaplimit_r);
-
- /* Report the memory regions */
- idx = 10;
- ram_resource(dev, idx++, 0, 640);
- ram_resource(dev, idx++, 768, tolmk - 768);
- if (tomk > 4*1024*1024) {
- ram_resource(dev, idx++, 4096*1024, tomk - 4*1024*1024);
- }
- if (remaplimitk >= remapbasek) {
- ram_resource(dev, idx++, remapbasek,
- (remaplimitk + 64*1024) - remapbasek);
- }
-
- set_late_cbmem_top(tolmk * 1024);
- }
+ mc_dev = dev_find_slot(0, PCI_DEVFN(0x0, 0));
+ if (!mc_dev)
+ die("Could not find MCH device\n");
+
+ tolmk = pci_read_config16(mc_dev, TOLM) >> 11;
+ tolmk <<= 17;
+
+ tomk = pci_read_config8(mc_dev, DRB_ROW_7);
+ tomk <<= 16;
+
+ /* Remapped region with a 64 MiB granularity in register
+ definition. Limit is inclusive, so add one. */
+ remapbasek = pci_read_config16(mc_dev, REMAPBASE) & 0x3ff;
+ remapbasek <<= 16;
+
+ remaplimitk = pci_read_config16(mc_dev, REMAPLIMIT) & 0x3ff;
+ remaplimitk += 1;
+ remaplimitk <<= 16;
+
+ /* Report the memory regions */
+ idx = 10;
+ ram_resource(dev, idx++, 0, 640);
+ ram_resource(dev, idx++, 768, tolmk - 768);
+
+ if (tomk > basek_4G)
+ ram_resource(dev, idx++, basek_4G, tomk - basek_4G);
+
+ if (remaplimitk > remapbasek)
+ ram_resource(dev, idx++, remapbasek, remaplimitk - remapbasek);
}
static void mch_domain_set_resources(struct device *dev)