static void cpu_pci_domain_set_resources(device_t dev) { u32 pci_tolm = find_pci_tolm(dev->link_list); unsigned long tomk = 0, tolmk; int idx; tomk = get_memory_size(); printk(BIOS_DEBUG, "Detected %lu Kbytes (%lu MiB) RAM.\n", tomk, tomk / 1024); /* Compute the top of Low memory */ tolmk = pci_tolm >> 10; if (tolmk >= tomk) { /* The PCI hole does not overlap the memory. */ tolmk = tomk; } /* Report the memory regions. */ idx = 10; ram_resource(dev, idx++, 0, 640); ram_resource(dev, idx++, 768, tolmk - 768); set_top_of_ram(tomk * 1024); assign_resources(dev->link_list); }
static void nc_read_resources(struct device *dev) { unsigned long mmconf; unsigned long bmbound; unsigned long bmbound_hi; unsigned long smmrrh; unsigned long smmrrl; unsigned long base_k, size_k; const unsigned long four_gig_kib = (4 << (30 - 10)); int index = 0; /* Read standard PCI resources. */ pci_dev_read_resources(dev); /* PCIe memory-mapped config space access - 256 MiB. */ mmconf = iosf_bunit_read(BUNIT_MMCONF_REG) & ~((1 << 28) - 1); mmio_resource(dev, BUNIT_MMCONF_REG, RES_IN_KiB(mmconf), 256 * 1024); /* 0 -> 0xa0000 */ base_k = RES_IN_KiB(0); size_k = RES_IN_KiB(0xa0000) - base_k; ram_resource(dev, index++, base_k, size_k); /* The SMMRR registers are 1MiB granularity with smmrrh being * inclusive of the SMM region. */ smmrrl = (iosf_bunit_read(BUNIT_SMRRL) & 0xffff) << 10; smmrrh = ((iosf_bunit_read(BUNIT_SMRRH) & 0xffff) + 1) << 10; /* 0xc0000 -> smrrl - cacheable and usable */ base_k = RES_IN_KiB(0xc0000); size_k = smmrrl - base_k; ram_resource(dev, index++, base_k, size_k); if (smmrrh > smmrrl) reserved_ram_resource(dev, index++, smmrrl, smmrrh - smmrrl); /* All address space between bmbound and smmrrh is unusable. */ bmbound = RES_IN_KiB(nc_read_top_of_low_memory()); mmio_resource(dev, index++, smmrrh, bmbound - smmrrh); /* The BMBOUND_HI register matches register bits of 31:24 with address * bits of 35:28. Therefore, shift register to align properly. */ bmbound_hi = iosf_bunit_read(BUNIT_BMBOUND_HI) & ~((1 << 24) - 1); bmbound_hi = RES_IN_KiB(bmbound_hi) << 4; if (bmbound_hi > four_gig_kib) ram_resource(dev, index++, four_gig_kib, bmbound_hi - four_gig_kib); /* Reserve everything between A segment and 1MB: * * 0xa0000 - 0xbffff: legacy VGA * 0xc0000 - 0xfffff: RAM */ mmio_resource(dev, index++, (0xa0000 >> 10), (0xc0000 - 0xa0000) >> 10); reserved_ram_resource(dev, index++, (0xc0000 >> 10), (0x100000 - 0xc0000) >> 10); if (CONFIG(CHROMEOS)) chromeos_reserve_ram_oops(dev, index++); }
static void pci_domain_set_resources(device_t dev) { device_t mc_dev; uint32_t pci_tolm; printk(BIOS_DEBUG, "Entered with dev vid = %x\n", dev->vendor); printk(BIOS_DEBUG, "Entered with dev did = %x\n", dev->device); pci_tolm = find_pci_tolm(dev->link_list); mc_dev = dev->link_list->children->sibling; printk(BIOS_DEBUG, "MC dev vendor = %x\n", mc_dev->vendor); printk(BIOS_DEBUG, "MC dev device = %x\n", mc_dev->device); 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... */ unsigned long tomk, tolmk; int idx; /* Get the value of the highest DRB. This tells the end of * the physical memory. The units are ticks of 32MB * i.e. 1 means 32MB. */ tomk = (unsigned long)pci_read_config8(mc_dev, 0x43); tomk = tomk * 32 * 1024; /* add vga_mem detection */ tomk = tomk - 16 * 1024; /* Compute the top of Low memory */ tolmk = pci_tolm >> 10; if (tolmk >= tomk) { /* The PCI hole does not overlap memory */ tolmk = tomk; } /* Write the ram configuration registers, * preserving the reserved bits. */ /* Report the memory regions */ printk(BIOS_DEBUG, "tomk = %ld\n", tomk); printk(BIOS_DEBUG, "tolmk = %ld\n", tolmk); idx = 10; /* avoid pam region */ ram_resource(dev, idx++, 0, 640); /* ram_resource(dev, idx++, 1024, tolmk - 1024); */ ram_resource(dev, idx++, 768, tolmk - 768); /* Leave some space for ACPI, PIRQ and MP tables */ high_tables_base = (tomk * 1024) - HIGH_MEMORY_SIZE; high_tables_size = HIGH_MEMORY_SIZE; } assign_resources(dev->link_list); }
static void pci_domain_set_resources(device_t dev) { device_t mc_dev; int igd_memory = 0; mc_dev = dev->link_list->children; if (!mc_dev) return; unsigned long tomk, tomk_stolen; int idx, drp_value; u8 reg8; reg8 = pci_read_config8(mc_dev, SMRAM); reg8 &= 0xc0; switch (reg8) { case 0xc0: igd_memory = 1024; printk(BIOS_DEBUG, "%dKB IGD UMA\n", igd_memory); break; case 0x80: igd_memory = 512; printk(BIOS_DEBUG, "%dKB IGD UMA\n", igd_memory); break; default: igd_memory = 0; printk(BIOS_DEBUG, "No IGD UMA Memory\n"); break; } /* Get the value for DIMM 0 and translate it to MB. */ drp_value = pci_read_config8(mc_dev, DRP); tomk = (unsigned long)(translate_i82810_to_mb[drp_value & 0x0f]); /* Get the value for DIMM 1 and translate it to MB. */ drp_value = drp_value >> 4; tomk += (unsigned long)(translate_i82810_to_mb[drp_value]); /* Convert tomk from MB to KB. */ tomk = tomk << 10; tomk_stolen = tomk - igd_memory; /* For reserving UMA memory in the memory map */ uma_memory_base = tomk_stolen * 1024ULL; uma_memory_size = igd_memory * 1024ULL; printk(BIOS_DEBUG, "Available memory: %ldKB\n", tomk_stolen); /* Report the memory regions. */ idx = 10; ram_resource(dev, idx++, 0, 640); ram_resource(dev, idx++, 768, tomk - 768); uma_resource(dev, idx++, uma_memory_base >> 10, uma_memory_size >> 10); set_top_of_ram(tomk_stolen * 1024); assign_resources(dev->link_list); }
static void pci_domain_set_resources(device_t dev) { device_t mc_dev; u32 pci_tolm; unsigned char reg; unsigned long tomk, tolmk; unsigned char rambits; int idx; pci_tolm = find_pci_tolm(dev->link_list); mc_dev = dev_find_device(PCI_VENDOR_ID_VIA, 0x3324, 0); rambits = pci_read_config8(mc_dev, 0x88); rambits >>= 2; /* Get memory size and frame buffer from northbridge's registers. * * If register contains an invalid value we set frame buffer size to a * default of 32M, but that probably won't happen. */ reg = pci_read_config8(mc_dev, 0xa1); reg &= 0x70; reg = reg >> 4; /* TOP 1M SMM Memory */ if (reg == 0x0 || reg == 0x6 || reg == 0x7) tomk = (((rambits << 6) - 32 - 1) * 1024); // Set frame buffer 32M for default else tomk = (((rambits << 6) - (4 << reg) - 1) * 1024); /* Compute the top of Low memory */ tolmk = pci_tolm >> 10; if (tolmk >= tomk) { /* The PCI hole does does not overlap the memory. */ tolmk = tomk; tolmk -= 1024; // TOP 1M SM Memory } #if CONFIG_WRITE_HIGH_TABLES == 1 high_tables_base = (tolmk * 1024) - HIGH_MEMORY_SIZE; high_tables_size = HIGH_MEMORY_SIZE; printk(BIOS_DEBUG, "tom: %lx, high_tables_base: %llx, high_tables_size: %llx\n", tomk*1024, high_tables_base, high_tables_size); #endif /* Report the memory regions */ idx = 10; /* TODO: Hole needed? Should this go elsewhere? */ ram_resource(dev, idx++, 0, 640); /* first 640k */ ram_resource(dev, idx++, 768, (tolmk - 768)); /* leave a hole for vga */ assign_resources(dev->link_list); }
static void pci_domain_set_resources(device_t dev) { static const uint8_t ramregs[] = {0x5a, 0x5b, 0x5c, 0x5d }; device_t mc_dev; uint32_t pci_tolm; printk(BIOS_SPEW, "Entering vt8623 pci_domain_set_resources.\n"); pci_tolm = find_pci_tolm(dev->link_list); mc_dev = dev->link_list->children; if (mc_dev) { unsigned long tomk, tolmk; unsigned char rambits; int i, idx; for(rambits = 0, i = 0; i < ARRAY_SIZE(ramregs); i++) { unsigned char reg; reg = pci_read_config8(mc_dev, ramregs[i]); /* these are ENDING addresses, not sizes. * if there is memory in this slot, then reg will be > rambits. * So we just take the max, that gives us total. * We take the highest one to cover for once and future coreboot * bugs. We warn about bugs. */ if (reg > rambits) rambits = reg; if (reg < rambits) printk(BIOS_ERR, "ERROR! register 0x%x is not set!\n", ramregs[i]); } printk(BIOS_DEBUG, "I would set ram size to 0x%x Kbytes\n", (rambits)*16*1024); tomk = rambits*16*1024 - 32768; /* Compute the top of Low memory */ tolmk = pci_tolm >> 10; if (tolmk >= tomk) { /* The PCI hole does does not overlap the memory. */ tolmk = tomk; } #if CONFIG_WRITE_HIGH_TABLES == 1 high_tables_base = (tolmk - HIGH_TABLES_SIZE) * 1024; high_tables_size = HIGH_TABLES_SIZE* 1024; printk(BIOS_DEBUG, "tom: %lx, high_tables_base: %llx, high_tables_size: %llx\n", tomk*1024, high_tables_base, high_tables_size); #endif /* Report the memory regions */ idx = 10; ram_resource(dev, idx++, 0, 640); /* first 640k */ ram_resource(dev, idx++, 768, tolmk - 768); /* leave a hole for vga */ } assign_resources(dev->link_list); }
/* this sucks, but for now, fb size/location are hardcoded. * Will break if we get 2. Sigh. * We assume it's all multiples of MiB for MMUs sake. */ static void soc_enable(device_t dev) { u32 lcdbase = fb_base_mb(); unsigned long fb_size = FB_SIZE_MB; ram_resource(dev, 0, CONFIG_SYS_SDRAM_BASE/KiB, (sdram_max_addressable_mb() - fb_size)*KiB - CONFIG_SYS_SDRAM_BASE/KiB); mmio_resource(dev, 1, lcdbase*KiB, fb_size*KiB); u32 sdram_end_mb = sdram_size_mb() + CONFIG_SYS_SDRAM_BASE/MiB; if (sdram_end_mb > sdram_max_addressable_mb()) ram_resource(dev, 2, sdram_max_addressable_mb()*KiB, (sdram_end_mb - sdram_max_addressable_mb())*KiB); }
/* this sucks, but for now, fb size/location are hardcoded. * Will break if we get 2. Sigh. * We assume it's all multiples of MiB for MMUs sake. */ static void soc_enable(device_t dev) { u32 lcdbase = fb_base_mb(); unsigned long fb_size = FB_SIZE_MB; ram_resource(dev, 0, (uintptr_t)_dram/KiB, (sdram_max_addressable_mb() - fb_size)*KiB - (uintptr_t)_dram/KiB); mmio_resource(dev, 1, lcdbase*KiB, fb_size*KiB); u32 sdram_end_mb = sdram_size_mb() + (uintptr_t)_dram/MiB; if (sdram_end_mb > sdram_max_addressable_mb()) ram_resource(dev, 2, sdram_max_addressable_mb()*KiB, (sdram_end_mb - sdram_max_addressable_mb())*KiB); }
static void nc_read_resources(struct device *dev) { unsigned long base_k; int index = 0; unsigned long size_k; /* Read standard PCI resources. */ pci_dev_read_resources(dev); /* 0 -> 0xa0000 */ base_k = 0; size_k = 0xa0000 - base_k; ram_resource(dev, index++, RES_IN_KIB(base_k), RES_IN_KIB(size_k)); /* * Reserve everything between A segment and 1MB: * * 0xa0000 - 0xbffff: legacy VGA * 0xc0000 - 0xdffff: RAM * 0xe0000 - 0xfffff: ROM shadow */ base_k += size_k; size_k = 0xc0000 - base_k; mmio_resource(dev, index++, RES_IN_KIB(base_k), RES_IN_KIB(size_k)); base_k += size_k; size_k = 0x100000 - base_k; reserved_ram_resource(dev, index++, RES_IN_KIB(base_k), RES_IN_KIB(size_k)); /* 0x100000 -> cbmem_top - cacheable and usable */ base_k += size_k; size_k = (unsigned long)cbmem_top() - base_k; ram_resource(dev, index++, RES_IN_KIB(base_k), RES_IN_KIB(size_k)); /* cbmem_top -> 0xc0000000 - reserved */ base_k += size_k; size_k = 0xc0000000 - base_k; reserved_ram_resource(dev, index++, RES_IN_KIB(base_k), RES_IN_KIB(size_k)); /* 0xc0000000 -> 4GiB is mmio. */ base_k += size_k; size_k = 0x100000000ull - base_k; mmio_resource(dev, index++, RES_IN_KIB(base_k), RES_IN_KIB(size_k)); }
static void cpu_enable_resources(struct device *dev) { ram_resource(dev, 0, (uintptr_t)_dram/KiB, CONFIG_DRAM_SIZE_MB << 10); /* TODO: Declare CBFS cache as reserved? There's no guarantee we won't * overwrite it. It seems to stay intact, being so high in RAM */ }
static void i440lx_domain_set_resources(device_t dev) { device_t mc_dev; uint32_t pci_tolm; pci_tolm = find_pci_tolm(dev->link_list); mc_dev = dev->link_list->children; if (mc_dev) { unsigned long tomk, tolmk; int idx; /* Figure out which areas are/should be occupied by RAM. The * value of the highest DRB denotes the end of the physical * memory (in units of 8MB). */ tomk = ((unsigned long)pci_read_config8(mc_dev, DRB7)); /* Convert to KB. */ tomk *= (8 * 1024); printk(BIOS_DEBUG, "Setting RAM size to %lu MB\n", tomk / 1024); /* Compute the top of low memory. */ tolmk = pci_tolm / 1024; if (tolmk >= tomk) { /* The PCI hole does not overlap the memory. */ tolmk = tomk; } /* Report the memory regions. */ idx = 10; ram_resource(dev, idx++, 0, 640); ram_resource(dev, idx++, 768, tolmk - 768); #if CONFIG_WRITE_HIGH_TABLES==1 /* Leave some space for ACPI, PIRQ and MP tables */ high_tables_base = (tomk * 1024) - HIGH_MEMORY_SIZE; high_tables_size = HIGH_MEMORY_SIZE; #endif } assign_resources(dev->link_list); }
static void soc_init(device_t dev) { ram_resource(dev, 0, (uintptr_t)_dram/KiB, sdram_size_mb()*(MiB/KiB)); if (vboot_skip_display_init()) printk(BIOS_INFO, "Skipping display init.\n"); #if !IS_ENABLED(CONFIG_SKIP_DISPLAY_INIT_HACK) else rk_display_init(dev, (uintptr_t)_framebuffer, _framebuffer_size); #endif }
static void mainboard_enable(device_t dev) { if (!dev) { printk(BIOS_EMERG, "No dev0; die\n"); while (1); } ram_resource(dev, 0, 2048, 32768); cbmem_recovery(0); }
static void soc_read_resources(device_t dev) { unsigned long index = 0; int i; uintptr_t begin, end; size_t size; for (i = 0; i < CARVEOUT_NUM; i++) { carveout_range(i, &begin, &size); if (size == 0) continue; reserved_ram_resource(dev, index++, begin * KiB, size * KiB); } memory_in_range_below_4gb(&begin, &end); size = end - begin; ram_resource(dev, index++, begin * KiB, size * KiB); memory_in_range_above_4gb(&begin, &end); size = end - begin; ram_resource(dev, index++, begin * KiB, size * KiB); }
static void i440bx_domain_set_resources(device_t dev) { device_t mc_dev; uint32_t pci_tolm; pci_tolm = find_pci_tolm(dev->link_list); mc_dev = dev->link_list->children; if (mc_dev) { unsigned long tomk, tolmk; int idx; /* Figure out which areas are/should be occupied by RAM. The * value of the highest DRB denotes the end of the physical * memory (in units of 8MB). */ tomk = ((unsigned long)pci_read_config8(mc_dev, DRB7)); /* Convert to KB. */ tomk *= (8 * 1024); printk(BIOS_DEBUG, "Setting RAM size to %ld MB\n", tomk / 1024); /* Compute the top of low memory. */ tolmk = pci_tolm / 1024; if (tolmk >= tomk) { /* The PCI hole does not overlap the memory. */ tolmk = tomk; } /* Report the memory regions. */ idx = 10; ram_resource(dev, idx++, 0, 640); ram_resource(dev, idx++, 768, tolmk - 768); set_top_of_ram(tomk * 1024); } assign_resources(dev->link_list); }
static void pci_domain_set_resources(device_t dev) { static const uint8_t ramregs[] = { 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x56, 0x57 }; device_t mc_dev; uint32_t pci_tolm; pci_tolm = find_pci_tolm(dev->link_list); mc_dev = dev->link_list->children; if (mc_dev) { unsigned long tomk, tolmk; unsigned char rambits; int i, idx; for(rambits = 0, i = 0; i < ARRAY_SIZE(ramregs); i++) { unsigned char reg; reg = pci_read_config8(mc_dev, ramregs[i]); /* these are ENDING addresses, not sizes. * if there is memory in this slot, then reg will be > rambits. * So we just take the max, that gives us total. * We take the highest one to cover for once and future coreboot * bugs. We warn about bugs. */ if (reg > rambits) rambits = reg; if (reg < rambits) printk(BIOS_ERR, "ERROR! register 0x%x is not set!\n", ramregs[i]); } printk(BIOS_DEBUG, "I would set ram size to 0x%x Kbytes\n", (rambits)*8*1024); tomk = rambits*8*1024; /* Compute the top of Low memory */ tolmk = pci_tolm >> 10; if (tolmk >= tomk) { /* The PCI hole does does not overlap the memory. */ tolmk = tomk; } set_top_of_ram(tolmk * 1024); /* Report the memory regions */ idx = 10; ram_resource(dev, idx++, 0, tolmk); } assign_resources(dev->link_list); }
static void mc_add_dram_resources(device_t dev) { u32 bmbound, bsmmrrl; int index = 0; uint64_t highmem_size = 0; uint32_t fsp_mem_base = 0; GetHighMemorySize(&highmem_size); fsp_mem_base=(uint32_t)cbmem_top(); bmbound = iosf_bunit_read(BUNIT_BMBOUND); bsmmrrl = iosf_bunit_read(BUNIT_SMRRL) << 20; if (bsmmrrl){ printk(BIOS_DEBUG, "UMA, GTT & SMM memory location: 0x%x\n" "UMA, GTT & SMM memory size: %dM\n", bsmmrrl, (bmbound - bsmmrrl) >> 20); printk(BIOS_DEBUG, "FSP memory location: 0x%x\nFSP memory size: %dM\n", fsp_mem_base, (bsmmrrl - fsp_mem_base) >> 20); } printk(BIOS_INFO, "Available memory below 4GB: 0x%08x (%dM)\n", fsp_mem_base, fsp_mem_base >> 20); /* Report the memory regions. */ ram_resource(dev, index++, 0, legacy_hole_base_k); ram_resource(dev, index++, legacy_hole_base_k + legacy_hole_size_k, ((fsp_mem_base >> 10) - (legacy_hole_base_k + legacy_hole_size_k))); /* Mark SMM & FSP regions reserved */ mmio_resource(dev, index++, fsp_mem_base >> 10, (bmbound - fsp_mem_base) >> 10); if (highmem_size) { ram_resource(dev, index++, 0x100000000 >> 10, highmem_size >> 10 ); } printk(BIOS_INFO, "Available memory above 4GB: %lluM\n", highmem_size >> 20); index = add_fixed_resources(dev, index); }
static void mc_add_dram_resources(device_t dev) { u32 tomlow, bmbound, bsmmrrl, bsmmrrh; u64 bmbound_hi; int index = 0; /* * These are the host memory ranges : * - 0 -> SMM (SMMRRL) : cacheable * - SMM -> LOW TOM (BMBOUND) : cacheable WP * - 4GB -> HIGH TOM (BMBOUND_HI): cacheable * */ tomlow = bmbound = sideband_read(B_UNIT, BMBOUND); printk(BIOS_SPEW, "Top of Low Used DRAM (BMBOUND): 0x%08x\n", bmbound); bmbound_hi = (u64)(sideband_read(B_UNIT, BMBOUND_HI)) << 4; printk(BIOS_SPEW, "Top of Upper Used DRAM (BMBOUND_HI): 0x%llx\n", bmbound_hi); bsmmrrl = sideband_read(B_UNIT, BSMMRRL) << 20; bsmmrrh = ((sideband_read(B_UNIT, BSMMRRH) + 1) << 20) - 1; if (bsmmrrl) { tomlow = bsmmrrl; printk(BIOS_DEBUG, "SMM memory location: 0x%x SMM memory size: 0x%x\n", bsmmrrl, (bsmmrrh - bsmmrrl + 1)); printk(BIOS_DEBUG, "Subtracting %dM for SMM\n", (bmbound - bsmmrrl) >> 20); } tomlow -= FSP_RESERVE_MEMORY_SIZE; printk(BIOS_SPEW, "Available memory below 4GB: 0x%08x (%dM)\n", tomlow, tomlow >> 20); /* Report the memory regions. */ ram_resource(dev, index++, 0, legacy_hole_base_k); ram_resource(dev, index++, legacy_hole_base_k + legacy_hole_size_k, ((tomlow >> 10) - (legacy_hole_base_k + legacy_hole_size_k))); mmio_resource(dev, index++, tomlow >> 10, (bmbound - bsmmrrl) >> 10); if (bmbound_hi > 0x100000000) { ram_resource(dev, index++, 0x100000000 >> 10, (bmbound_hi - 0x100000000) >> 10 ); printk(BIOS_INFO, "Available memory above 4GB: %lluM\n", (bmbound_hi - 0x100000000) >> 20); }
static void soc_read_resources(device_t dev) { ram_resource(dev, 0, (uintptr_t)_dram / KiB, CONFIG_DRAM_SIZE_MB * KiB); }
static void cpu_pci_domain_read_resources(struct device *dev) { u16 nbid = pci_read_config16(dev_find_slot(0, 0), PCI_DEVICE_ID); int i440fx = (nbid == 0x1237); int q35 = (nbid == 0x29c0); struct resource *res; unsigned long tomk = 0, high; int idx = 10; int size; pci_domain_read_resources(dev); size = fw_cfg_check_file("etc/e820"); if (size > 0) { /* supported by qemu 1.7+ */ FwCfgE820Entry *list = malloc(size); int i; fw_cfg_load_file("etc/e820", list); for (i = 0; i < size/sizeof(*list); i++) { switch (list[i].type) { case 1: /* ram */ printk(BIOS_DEBUG, "QEMU: e820/ram: 0x%08llx +0x%08llx\n", list[i].address, list[i].length); if (list[i].address == 0) { tomk = list[i].length / 1024; ram_resource(dev, idx++, 0, 640); ram_resource(dev, idx++, 768, tomk - 768); } else { ram_resource(dev, idx++, list[i].address / 1024, list[i].length / 1024); } break; case 2: /* reserved */ printk(BIOS_DEBUG, "QEMU: e820/res: 0x%08llx +0x%08llx\n", list[i].address, list[i].length); res = new_resource(dev, idx++); res->base = list[i].address; res->size = list[i].length; res->limit = 0xffffffff; res->flags = IORESOURCE_MEM | IORESOURCE_FIXED | IORESOURCE_STORED | IORESOURCE_ASSIGNED; break; default: /* skip unknown */ break; } } free(list); } if (!tomk) { /* qemu older than 1.7, or reading etc/e820 failed. Fallback to cmos. */ tomk = qemu_get_memory_size(); high = qemu_get_high_memory_size(); printk(BIOS_DEBUG, "QEMU: cmos: %lu MiB RAM below 4G.\n", tomk / 1024); printk(BIOS_DEBUG, "QEMU: cmos: %lu MiB RAM above 4G.\n", high / 1024); /* Report the memory regions. */ ram_resource(dev, idx++, 0, 640); ram_resource(dev, idx++, 768, tomk - 768); if (high) ram_resource(dev, idx++, 4 * 1024 * 1024, high); } /* Reserve I/O ports used by QEMU */ qemu_reserve_ports(dev, idx++, 0x0510, 0x02, "firmware-config"); qemu_reserve_ports(dev, idx++, 0x5658, 0x01, "vmware-port"); if (i440fx) { qemu_reserve_ports(dev, idx++, 0xae00, 0x10, "pci-hotplug"); qemu_reserve_ports(dev, idx++, 0xaf00, 0x20, "cpu-hotplug"); qemu_reserve_ports(dev, idx++, 0xafe0, 0x04, "piix4-gpe0"); } if (inb(CONFIG_CONSOLE_QEMU_DEBUGCON_PORT) == 0xe9) { qemu_reserve_ports(dev, idx++, CONFIG_CONSOLE_QEMU_DEBUGCON_PORT, 1, "debugcon"); } if (q35 && ((tomk * 1024) < 0xb0000000)) { /* * Reserve the region between top-of-ram and the * mmconf xbar (ar 0xb0000000), so coreboot doesn't * place pci bars there. The region isn't declared as * pci io window in the acpi tables (\_SB.PCI0._CRS). */ res = new_resource(dev, idx++); res->base = tomk * 1024; res->size = 0xb0000000 - tomk * 1024; res->limit = 0xffffffff; res->flags = IORESOURCE_MEM | IORESOURCE_FIXED | IORESOURCE_STORED | IORESOURCE_ASSIGNED; } if (i440fx) { /* Reserve space for the IOAPIC. This should be in * the southbridge, but I couldn't tell which device * to put it in. */ res = new_resource(dev, 2); res->base = IO_APIC_ADDR; res->size = 0x100000UL; res->limit = 0xffffffffUL; res->flags = IORESOURCE_MEM | IORESOURCE_FIXED | IORESOURCE_STORED | IORESOURCE_ASSIGNED; } /* Reserve space for the LAPIC. There's one in every processor, but * the space only needs to be reserved once, so we do it here. */ res = new_resource(dev, 3); res->base = LOCAL_APIC_ADDR; res->size = 0x10000UL; res->limit = 0xffffffffUL; res->flags = IORESOURCE_MEM | IORESOURCE_FIXED | IORESOURCE_STORED | IORESOURCE_ASSIGNED; }
static void cpu_enable(device_t dev) { ram_resource(dev, 0, RAM_BASE_KB, RAM_SIZE_KB - FB_SIZE_KB); }
static void soc_read_resources(struct device *dev) { ram_resource(dev, 0, (uintptr_t)_dram / KiB, DRAMSIZE4GB / KiB); reserved_ram_resource(dev, 1, (uintptr_t)_dram_reserved / KiB, _dram_reserved_size / KiB); }
static void soc_read_resources(struct device *dev) { ram_resource(dev, 0, (uintptr_t)_dram / KiB, (CONFIG_DRAM_SIZE_MB * MiB) / KiB); }
static void pci_domain_set_resources(device_t dev) { /* * the order is important to find the correct RAM size. */ u8 ramregs[] = { 0x43, 0x42, 0x41, 0x40 }; device_t mc_dev; u32 pci_tolm; u8 reg; printk(BIOS_SPEW, "Entering vx800 pci_domain_set_resources.\n"); pci_tolm = find_pci_tolm(dev->link_list); mc_dev = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX855_MEMCTRL, 0); if (mc_dev) { unsigned long tomk, tolmk; unsigned char rambits; u8 i, idx; /* * once the register value is not zero, the ramsize is * this register's value multiply 64 * 1024 * 1024 */ for (rambits = 0, i = 0; i < ARRAY_SIZE(ramregs); i++) { rambits = pci_read_config8(mc_dev, ramregs[i]); if (rambits != 0) break; } /* Get memory size and frame buffer from northbridge's registers. if register with invalid value we set frame buffer size to 32M for default, but it won't happen. */ reg = pci_read_config8(mc_dev, 0xa1); reg &= 0x70; reg = reg >> 4; /* TOP 1M SM Memory */ if (reg == 0x0) tomk = (((rambits << 6) - 32 - VIACONFIG_TOP_SM_SIZE_MB) * 1024); // Set frame buffer 32M for default else tomk = (((rambits << 6) - (4 << reg) - VIACONFIG_TOP_SM_SIZE_MB) * 1024); printk(BIOS_SPEW, "tomk is 0x%lx\n", tomk); /* Compute the Top Of Low Memory, in Kb */ tolmk = pci_tolm >> 10; if (tolmk >= tomk) { /* The PCI hole does does not overlap the memory. */ tolmk = tomk; } /* Report the memory regions */ idx = 10; /* TODO: Hole needed? */ ram_resource(dev, idx++, 0, 640); /* first 640k */ /* Leave a hole for vga, 0xa0000 - 0xc0000 */ ram_resource(dev, idx++, 768, (tolmk - 768)); } assign_resources(dev->link_list); }
static void soc_init(device_t dev) { ram_resource(dev, 0, (uintptr_t)_dram/KiB, sdram_size_mb()*(MiB/KiB)); usb_init(); }
static void soc_read_resources(struct device *dev) { ram_resource(dev, 0, (uintptr_t)_dram / KiB, sdram_size() / KiB); }
static void mch_domain_read_resources(device_t dev) { u64 tom, touud; u32 tomk, tsegk, tolud, usable_tomk; u32 pcie_config_base, pcie_config_size; u32 uma_sizek = 0; /* 1024KiB TSEG */ tsegk = 1 << 10; pci_domain_read_resources(dev); /* Top of Upper Usable DRAM, including remap */ touud = pci_read_config16(dev, D0F0_TOUUD); touud <<= 20; /* Top of Lower Usable DRAM */ tolud = pci_read_config16(dev, D0F0_TOLUD) & 0xfff0; tolud <<= 16; /* Top of Memory - does not account for any UMA */ tom = pci_read_config16(dev, D0F0_TOM) & 0x01ff; tom <<= 26; printk(BIOS_DEBUG, "TOUUD 0x%llx TOLUD 0x%08x TOM 0x%llx\n", touud, tolud, tom); tomk = tolud >> 10; /* Graphics memory comes next */ const u16 ggc = pci_read_config16(dev, D0F0_GGC); printk(BIOS_DEBUG, "IGD decoded, subtracting "); /* Graphics memory */ const u32 gms_sizek = decode_igd_memory_size((ggc >> 4) & 0xf); printk(BIOS_DEBUG, "%uM UMA", gms_sizek >> 10); /* GTT Graphics Stolen Memory Size (GGMS) */ const u32 gsm_sizek = decode_igd_gtt_size((ggc >> 8) & 0xf); printk(BIOS_DEBUG, " and %uM GTT\n", gsm_sizek >> 10); uma_sizek = gms_sizek + gsm_sizek + tsegk; usable_tomk = tomk - uma_sizek; printk(BIOS_INFO, "Available memory below 4GB: %uM\n", usable_tomk >> 10); /* Report the memory regions */ ram_resource(dev, 3, 0, legacy_hole_base_k); ram_resource(dev, 4, legacy_hole_base_k + legacy_hole_size_k, (usable_tomk - (legacy_hole_base_k + legacy_hole_size_k))); /* * If >= 4GB installed then memory from TOLUD to 4GB * is remapped above TOM, TOUUD will account for both */ touud >>= 10; /* Convert to KB */ if (touud > 4096 * 1024) { ram_resource(dev, 5, 4096 * 1024, touud - (4096 * 1024)); printk(BIOS_INFO, "Available memory above 4GB: %lluM\n", (touud >> 10) - 4096); }