mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-10 02:54:58 -06:00
ppc4xx_sdram: Move ppc4xx_sdram_banks() to ppc4xx_sdram.c
This function is only used by the ppc4xx memory controller models so it can be made static. Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <b1504a82157a586aa284e8ee3b427b9a07b24169.1666194485.git.balaton@eik.bme.hu> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
parent
fa446fc540
commit
080741abc2
3 changed files with 69 additions and 74 deletions
|
@ -23,73 +23,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/units.h"
|
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "hw/ppc/ppc4xx.h"
|
#include "hw/ppc/ppc4xx.h"
|
||||||
#include "hw/qdev-properties.h"
|
#include "hw/qdev-properties.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* Split RAM between SDRAM banks.
|
|
||||||
*
|
|
||||||
* sdram_bank_sizes[] must be in descending order, that is sizes[i] > sizes[i+1]
|
|
||||||
* and must be 0-terminated.
|
|
||||||
*
|
|
||||||
* The 4xx SDRAM controller supports a small number of banks, and each bank
|
|
||||||
* must be one of a small set of sizes. The number of banks and the supported
|
|
||||||
* sizes varies by SoC.
|
|
||||||
*/
|
|
||||||
void ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
|
|
||||||
Ppc4xxSdramBank ram_banks[],
|
|
||||||
const ram_addr_t sdram_bank_sizes[])
|
|
||||||
{
|
|
||||||
ram_addr_t size_left = memory_region_size(ram);
|
|
||||||
ram_addr_t base = 0;
|
|
||||||
ram_addr_t bank_size;
|
|
||||||
int i;
|
|
||||||
int j;
|
|
||||||
|
|
||||||
for (i = 0; i < nr_banks; i++) {
|
|
||||||
for (j = 0; sdram_bank_sizes[j] != 0; j++) {
|
|
||||||
bank_size = sdram_bank_sizes[j];
|
|
||||||
if (bank_size <= size_left) {
|
|
||||||
char name[32];
|
|
||||||
|
|
||||||
ram_banks[i].base = base;
|
|
||||||
ram_banks[i].size = bank_size;
|
|
||||||
base += bank_size;
|
|
||||||
size_left -= bank_size;
|
|
||||||
snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
|
|
||||||
memory_region_init_alias(&ram_banks[i].ram, NULL, name, ram,
|
|
||||||
ram_banks[i].base, ram_banks[i].size);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!size_left) {
|
|
||||||
/* No need to use the remaining banks. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size_left) {
|
|
||||||
ram_addr_t used_size = memory_region_size(ram) - size_left;
|
|
||||||
GString *s = g_string_new(NULL);
|
|
||||||
|
|
||||||
for (i = 0; sdram_bank_sizes[i]; i++) {
|
|
||||||
g_string_append_printf(s, "%" PRIi64 "%s",
|
|
||||||
sdram_bank_sizes[i] / MiB,
|
|
||||||
sdram_bank_sizes[i + 1] ? ", " : "");
|
|
||||||
}
|
|
||||||
error_report("at most %d bank%s of %s MiB each supported",
|
|
||||||
nr_banks, nr_banks == 1 ? "" : "s", s->str);
|
|
||||||
error_printf("Possible valid RAM size: %" PRIi64 " MiB\n",
|
|
||||||
used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
|
|
||||||
|
|
||||||
g_string_free(s, true);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* MAL */
|
/* MAL */
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,67 @@
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Shared functions */
|
/* Shared functions */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Split RAM between SDRAM banks.
|
||||||
|
*
|
||||||
|
* sdram_bank_sizes[] must be in descending order, that is sizes[i] > sizes[i+1]
|
||||||
|
* and must be 0-terminated.
|
||||||
|
*
|
||||||
|
* The 4xx SDRAM controller supports a small number of banks, and each bank
|
||||||
|
* must be one of a small set of sizes. The number of banks and the supported
|
||||||
|
* sizes varies by SoC.
|
||||||
|
*/
|
||||||
|
static void ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
|
||||||
|
Ppc4xxSdramBank ram_banks[],
|
||||||
|
const ram_addr_t sdram_bank_sizes[])
|
||||||
|
{
|
||||||
|
ram_addr_t size_left = memory_region_size(ram);
|
||||||
|
ram_addr_t base = 0;
|
||||||
|
ram_addr_t bank_size;
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for (i = 0; i < nr_banks; i++) {
|
||||||
|
for (j = 0; sdram_bank_sizes[j] != 0; j++) {
|
||||||
|
bank_size = sdram_bank_sizes[j];
|
||||||
|
if (bank_size <= size_left) {
|
||||||
|
char name[32];
|
||||||
|
|
||||||
|
ram_banks[i].base = base;
|
||||||
|
ram_banks[i].size = bank_size;
|
||||||
|
base += bank_size;
|
||||||
|
size_left -= bank_size;
|
||||||
|
snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
|
||||||
|
memory_region_init_alias(&ram_banks[i].ram, NULL, name, ram,
|
||||||
|
ram_banks[i].base, ram_banks[i].size);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!size_left) {
|
||||||
|
/* No need to use the remaining banks. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size_left) {
|
||||||
|
ram_addr_t used_size = memory_region_size(ram) - size_left;
|
||||||
|
GString *s = g_string_new(NULL);
|
||||||
|
|
||||||
|
for (i = 0; sdram_bank_sizes[i]; i++) {
|
||||||
|
g_string_append_printf(s, "%" PRIi64 "%s",
|
||||||
|
sdram_bank_sizes[i] / MiB,
|
||||||
|
sdram_bank_sizes[i + 1] ? ", " : "");
|
||||||
|
}
|
||||||
|
error_report("at most %d bank%s of %s MiB each supported",
|
||||||
|
nr_banks, nr_banks == 1 ? "" : "s", s->str);
|
||||||
|
error_printf("Possible valid RAM size: %" PRIi64 " MiB\n",
|
||||||
|
used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
|
||||||
|
|
||||||
|
g_string_free(s, true);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void sdram_bank_map(Ppc4xxSdramBank *bank)
|
static void sdram_bank_map(Ppc4xxSdramBank *bank)
|
||||||
{
|
{
|
||||||
memory_region_init(&bank->container, NULL, "sdram-container", bank->size);
|
memory_region_init(&bank->container, NULL, "sdram-container", bank->size);
|
||||||
|
|
|
@ -29,18 +29,6 @@
|
||||||
#include "exec/memory.h"
|
#include "exec/memory.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
MemoryRegion ram;
|
|
||||||
MemoryRegion container; /* used for clipping */
|
|
||||||
hwaddr base;
|
|
||||||
hwaddr size;
|
|
||||||
uint32_t bcr;
|
|
||||||
} Ppc4xxSdramBank;
|
|
||||||
|
|
||||||
void ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
|
|
||||||
Ppc4xxSdramBank ram_banks[],
|
|
||||||
const ram_addr_t sdram_bank_sizes[]);
|
|
||||||
|
|
||||||
#define TYPE_PPC4xx_PCI_HOST_BRIDGE "ppc4xx-pcihost"
|
#define TYPE_PPC4xx_PCI_HOST_BRIDGE "ppc4xx-pcihost"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -111,6 +99,14 @@ struct Ppc4xxEbcState {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* SDRAM DDR controller */
|
/* SDRAM DDR controller */
|
||||||
|
typedef struct {
|
||||||
|
MemoryRegion ram;
|
||||||
|
MemoryRegion container; /* used for clipping */
|
||||||
|
hwaddr base;
|
||||||
|
hwaddr size;
|
||||||
|
uint32_t bcr;
|
||||||
|
} Ppc4xxSdramBank;
|
||||||
|
|
||||||
#define SDR0_DDR0_DDRM_ENCODE(n) ((((unsigned long)(n)) & 0x03) << 29)
|
#define SDR0_DDR0_DDRM_ENCODE(n) ((((unsigned long)(n)) & 0x03) << 29)
|
||||||
#define SDR0_DDR0_DDRM_DDR1 0x20000000
|
#define SDR0_DDR0_DDRM_DDR1 0x20000000
|
||||||
#define SDR0_DDR0_DDRM_DDR2 0x40000000
|
#define SDR0_DDR0_DDRM_DDR2 0x40000000
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue