blob: 2f8a4f8aef57c69e6876bcfbbdeb9f144c0dd929 [file] [log] [blame]
Angel Pons585495e2020-04-03 01:21:38 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Stefan Reinauer597ff872013-01-07 13:21:22 -08002
3#include <cbmem.h>
Patrick Rudolph69d5ef92018-11-11 12:43:48 +01004#include <arch/io.h>
Kyösti Mälkkif0a3d442019-08-18 08:02:23 +03005#include <arch/romstage.h>
Patrick Rudolph69d5ef92018-11-11 12:43:48 +01006#include "memory.h"
Thomas Heijligen8d010db2019-01-10 19:45:47 +01007#include "fw_cfg.h"
Stefan Reinauer597ff872013-01-07 13:21:22 -08008
9#define CMOS_ADDR_PORT 0x70
10#define CMOS_DATA_PORT 0x71
Gerd Hoffmann9839a382013-06-17 12:26:17 +020011
Stefan Reinauer597ff872013-01-07 13:21:22 -080012#define HIGH_RAM_ADDR 0x35
13#define LOW_RAM_ADDR 0x34
14
Gerd Hoffmann9839a382013-06-17 12:26:17 +020015#define HIGH_HIGHRAM_ADDR 0x5d
16#define MID_HIGHRAM_ADDR 0x5c
17#define LOW_HIGHRAM_ADDR 0x5b
18
Patrick Rudolph69d5ef92018-11-11 12:43:48 +010019unsigned long qemu_get_high_memory_size(void)
20{
21 unsigned long high;
22 outb(HIGH_HIGHRAM_ADDR, CMOS_ADDR_PORT);
23 high = ((unsigned long) inb(CMOS_DATA_PORT)) << 22;
24 outb(MID_HIGHRAM_ADDR, CMOS_ADDR_PORT);
25 high |= ((unsigned long) inb(CMOS_DATA_PORT)) << 14;
26 outb(LOW_HIGHRAM_ADDR, CMOS_ADDR_PORT);
27 high |= ((unsigned long) inb(CMOS_DATA_PORT)) << 6;
28 return high;
29}
30
31unsigned long qemu_get_memory_size(void)
Stefan Reinauer597ff872013-01-07 13:21:22 -080032{
33 unsigned long tomk;
Patrick Rudolph69d5ef92018-11-11 12:43:48 +010034 outb(HIGH_RAM_ADDR, CMOS_ADDR_PORT);
Stefan Reinauer597ff872013-01-07 13:21:22 -080035 tomk = ((unsigned long) inb(CMOS_DATA_PORT)) << 14;
Patrick Rudolph69d5ef92018-11-11 12:43:48 +010036 outb(LOW_RAM_ADDR, CMOS_ADDR_PORT);
Stefan Reinauer597ff872013-01-07 13:21:22 -080037 tomk |= ((unsigned long) inb(CMOS_DATA_PORT)) << 6;
38 tomk += 16 * 1024;
39 return tomk;
40}
41
Arthur Heymans340e4b82019-10-23 17:25:58 +020042void *cbmem_top_chipset(void)
Stefan Reinauer597ff872013-01-07 13:21:22 -080043{
Thomas Heijligen8d010db2019-01-10 19:45:47 +010044 uintptr_t top = 0;
45
46 top = fw_cfg_tolud();
47 if (!top)
48 top = (uintptr_t)qemu_get_memory_size() * 1024;
49
50 return (void *)top;
Stefan Reinauer597ff872013-01-07 13:21:22 -080051}
Kyösti Mälkkif0a3d442019-08-18 08:02:23 +030052
53/* Nothing to do, MTRRs are no-op on QEMU. */
54void fill_postcar_frame(struct postcar_frame *pcf)
55{
56}