MIPS queue for December 16th, 2019
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJd93ikAAoJENSXKoln91plq9cIAIz2H0elbEqBoW29n7ts/J92 GnJkgaFcjzxUARzV30NdI45V2k3V69gsqqfapy+AqBYexBE9QRxSJ8JVZvnPYqXN brtROwYJCsclHwHxZ3AWg4U8i3ffw4cdOcPov0ZPhy8X+fsoiM/CJYH32czNgTBB 2wva5w3PUhkdcUsaBBKIMvcNKRftMTto+eSPPCKp9A3/IqyQHkBemRNTC+h47f5t 2uxiVPfyaBdWxuuACeYQ2WtnoGlbD/Nr974QrnSVVfg3omPylTDKoNKzvr6NjeAp zCaXcGS4r/tjiehYbUzxbMLBOOpxlt5/JQqb0dKTrH+AFrMUBOdzptdhq9TJRBI= =uwM/ -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/amarkovic/tags/mips-queue-dec-16-2019' into staging MIPS queue for December 16th, 2019 # gpg: Signature made Mon 16 Dec 2019 12:29:24 GMT # gpg: using RSA key D4972A8967F75A65 # gpg: Good signature from "Aleksandar Markovic <amarkovic@wavecomp.com>" [full] # Primary key fingerprint: 8526 FBF1 5DA3 811F 4A01 DD75 D497 2A89 67F7 5A65 * remotes/amarkovic/tags/mips-queue-dec-16-2019: MAINTAINERS: Add a file to MIPS section MAINTAINERS: Add three files to Malta section MAINTAINERS: Adjust maintainership for Malta board MAINTAINERS: Adjust maintainership for Fulong 2E board MAINTAINERS: Add a section on UI translation hw/mips: Deprecate the r4k machine mips: fulong 2e: Renovate coding style mips: r4000: Renovate coding style mips: mipssim: Renovate coding style mips: malta: Renovate coding style mips: jazz: Renovate coding style Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
cb88904a54
17
MAINTAINERS
17
MAINTAINERS
|
@ -221,6 +221,7 @@ F: include/hw/intc/mips_gic.h
|
||||||
F: include/hw/mips/
|
F: include/hw/mips/
|
||||||
F: include/hw/misc/mips_*
|
F: include/hw/misc/mips_*
|
||||||
F: include/hw/timer/mips_gictimer.h
|
F: include/hw/timer/mips_gictimer.h
|
||||||
|
F: tests/acceptance/linux_ssh_mips_malta.py
|
||||||
F: tests/tcg/mips/
|
F: tests/tcg/mips/
|
||||||
K: ^Subject:.*(?i)mips
|
K: ^Subject:.*(?i)mips
|
||||||
|
|
||||||
|
@ -955,11 +956,15 @@ F: hw/display/jazz_led.c
|
||||||
F: hw/dma/rc4030.c
|
F: hw/dma/rc4030.c
|
||||||
|
|
||||||
Malta
|
Malta
|
||||||
M: Aurelien Jarno <aurelien@aurel32.net>
|
M: Aleksandar Markovic <amarkovic@wavecomp.com>
|
||||||
R: Aleksandar Rikalo <aleksandar.rikalo@rt-rk.com>
|
M: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||||
|
R: Aurelien Jarno <aurelien@aurel32.net>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: hw/isa/piix4.c
|
||||||
|
F: hw/acpi/piix4.c
|
||||||
F: hw/mips/mips_malta.c
|
F: hw/mips/mips_malta.c
|
||||||
F: hw/mips/gt64xxx_pci.c
|
F: hw/mips/gt64xxx_pci.c
|
||||||
|
F: include/hw/southbridge/piix.h
|
||||||
F: tests/acceptance/linux_ssh_mips_malta.py
|
F: tests/acceptance/linux_ssh_mips_malta.py
|
||||||
|
|
||||||
Mipssim
|
Mipssim
|
||||||
|
@ -972,12 +977,12 @@ F: hw/net/mipsnet.c
|
||||||
R4000
|
R4000
|
||||||
M: Aurelien Jarno <aurelien@aurel32.net>
|
M: Aurelien Jarno <aurelien@aurel32.net>
|
||||||
R: Aleksandar Rikalo <aleksandar.rikalo@rt-rk.com>
|
R: Aleksandar Rikalo <aleksandar.rikalo@rt-rk.com>
|
||||||
S: Maintained
|
S: Obsolete
|
||||||
F: hw/mips/mips_r4k.c
|
F: hw/mips/mips_r4k.c
|
||||||
|
|
||||||
Fulong 2E
|
Fulong 2E
|
||||||
|
M: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||||
M: Aleksandar Markovic <amarkovic@wavecomp.com>
|
M: Aleksandar Markovic <amarkovic@wavecomp.com>
|
||||||
R: Aleksandar Rikalo <aleksandar.rikalo@rt-rk.com>
|
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
F: hw/mips/mips_fulong2e.c
|
F: hw/mips/mips_fulong2e.c
|
||||||
F: hw/isa/vt82c686.c
|
F: hw/isa/vt82c686.c
|
||||||
|
@ -2715,6 +2720,10 @@ M: Daniel P. Berrange <berrange@redhat.com>
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
F: scripts/git-submodule.sh
|
F: scripts/git-submodule.sh
|
||||||
|
|
||||||
|
UI translations
|
||||||
|
M: Aleksandar Markovic <aleksandar.m.mail@gmail.com>
|
||||||
|
F: po/*.po
|
||||||
|
|
||||||
Sphinx documentation configuration and build machinery
|
Sphinx documentation configuration and build machinery
|
||||||
M: Peter Maydell <peter.maydell@linaro.org>
|
M: Peter Maydell <peter.maydell@linaro.org>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
|
@ -90,25 +90,25 @@ static void draw_horizontal_line(DisplaySurface *ds,
|
||||||
|
|
||||||
bpp = (surface_bits_per_pixel(ds) + 7) >> 3;
|
bpp = (surface_bits_per_pixel(ds) + 7) >> 3;
|
||||||
d = surface_data(ds) + surface_stride(ds) * posy + bpp * posx1;
|
d = surface_data(ds) + surface_stride(ds) * posy + bpp * posx1;
|
||||||
switch(bpp) {
|
switch (bpp) {
|
||||||
case 1:
|
case 1:
|
||||||
for (x = posx1; x <= posx2; x++) {
|
for (x = posx1; x <= posx2; x++) {
|
||||||
*((uint8_t *)d) = color;
|
*((uint8_t *)d) = color;
|
||||||
d++;
|
d++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
for (x = posx1; x <= posx2; x++) {
|
for (x = posx1; x <= posx2; x++) {
|
||||||
*((uint16_t *)d) = color;
|
*((uint16_t *)d) = color;
|
||||||
d += 2;
|
d += 2;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
for (x = posx1; x <= posx2; x++) {
|
for (x = posx1; x <= posx2; x++) {
|
||||||
*((uint32_t *)d) = color;
|
*((uint32_t *)d) = color;
|
||||||
d += 4;
|
d += 4;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,25 +121,25 @@ static void draw_vertical_line(DisplaySurface *ds,
|
||||||
|
|
||||||
bpp = (surface_bits_per_pixel(ds) + 7) >> 3;
|
bpp = (surface_bits_per_pixel(ds) + 7) >> 3;
|
||||||
d = surface_data(ds) + surface_stride(ds) * posy1 + bpp * posx;
|
d = surface_data(ds) + surface_stride(ds) * posy1 + bpp * posx;
|
||||||
switch(bpp) {
|
switch (bpp) {
|
||||||
case 1:
|
case 1:
|
||||||
for (y = posy1; y <= posy2; y++) {
|
for (y = posy1; y <= posy2; y++) {
|
||||||
*((uint8_t *)d) = color;
|
*((uint8_t *)d) = color;
|
||||||
d += surface_stride(ds);
|
d += surface_stride(ds);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
for (y = posy1; y <= posy2; y++) {
|
for (y = posy1; y <= posy2; y++) {
|
||||||
*((uint16_t *)d) = color;
|
*((uint16_t *)d) = color;
|
||||||
d += surface_stride(ds);
|
d += surface_stride(ds);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
for (y = posy1; y <= posy2; y++) {
|
for (y = posy1; y <= posy2; y++) {
|
||||||
*((uint32_t *)d) = color;
|
*((uint32_t *)d) = color;
|
||||||
d += surface_stride(ds);
|
d += surface_stride(ds);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,28 +164,28 @@ static void jazz_led_update_display(void *opaque)
|
||||||
if (s->state & REDRAW_SEGMENTS) {
|
if (s->state & REDRAW_SEGMENTS) {
|
||||||
/* set colors according to bpp */
|
/* set colors according to bpp */
|
||||||
switch (surface_bits_per_pixel(surface)) {
|
switch (surface_bits_per_pixel(surface)) {
|
||||||
case 8:
|
case 8:
|
||||||
color_segment = rgb_to_pixel8(0xaa, 0xaa, 0xaa);
|
color_segment = rgb_to_pixel8(0xaa, 0xaa, 0xaa);
|
||||||
color_led = rgb_to_pixel8(0x00, 0xff, 0x00);
|
color_led = rgb_to_pixel8(0x00, 0xff, 0x00);
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
color_segment = rgb_to_pixel15(0xaa, 0xaa, 0xaa);
|
color_segment = rgb_to_pixel15(0xaa, 0xaa, 0xaa);
|
||||||
color_led = rgb_to_pixel15(0x00, 0xff, 0x00);
|
color_led = rgb_to_pixel15(0x00, 0xff, 0x00);
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
color_segment = rgb_to_pixel16(0xaa, 0xaa, 0xaa);
|
color_segment = rgb_to_pixel16(0xaa, 0xaa, 0xaa);
|
||||||
color_led = rgb_to_pixel16(0x00, 0xff, 0x00);
|
color_led = rgb_to_pixel16(0x00, 0xff, 0x00);
|
||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
color_segment = rgb_to_pixel24(0xaa, 0xaa, 0xaa);
|
color_segment = rgb_to_pixel24(0xaa, 0xaa, 0xaa);
|
||||||
color_led = rgb_to_pixel24(0x00, 0xff, 0x00);
|
color_led = rgb_to_pixel24(0x00, 0xff, 0x00);
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
color_segment = rgb_to_pixel32(0xaa, 0xaa, 0xaa);
|
color_segment = rgb_to_pixel32(0xaa, 0xaa, 0xaa);
|
||||||
color_led = rgb_to_pixel32(0x00, 0xff, 0x00);
|
color_led = rgb_to_pixel32(0x00, 0xff, 0x00);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* display segments */
|
/* display segments */
|
||||||
|
@ -205,8 +205,9 @@ static void jazz_led_update_display(void *opaque)
|
||||||
(s->segments & 0x80) ? color_segment : 0);
|
(s->segments & 0x80) ? color_segment : 0);
|
||||||
|
|
||||||
/* display led */
|
/* display led */
|
||||||
if (!(s->segments & 0x01))
|
if (!(s->segments & 0x01)) {
|
||||||
color_led = 0; /* black */
|
color_led = 0; /* black */
|
||||||
|
}
|
||||||
draw_horizontal_line(surface, 68, 50, 50, color_led);
|
draw_horizontal_line(surface, 68, 50, 50, color_led);
|
||||||
draw_horizontal_line(surface, 69, 49, 51, color_led);
|
draw_horizontal_line(surface, 69, 49, 51, color_led);
|
||||||
draw_horizontal_line(surface, 70, 48, 52, color_led);
|
draw_horizontal_line(surface, 70, 48, 52, color_led);
|
||||||
|
|
|
@ -397,10 +397,11 @@ static void update_jazz_irq(rc4030State *s)
|
||||||
|
|
||||||
pending = s->isr_jazz & s->imr_jazz;
|
pending = s->isr_jazz & s->imr_jazz;
|
||||||
|
|
||||||
if (pending != 0)
|
if (pending != 0) {
|
||||||
qemu_irq_raise(s->jazz_bus_irq);
|
qemu_irq_raise(s->jazz_bus_irq);
|
||||||
else
|
} else {
|
||||||
qemu_irq_lower(s->jazz_bus_irq);
|
qemu_irq_lower(s->jazz_bus_irq);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rc4030_irq_jazz_request(void *opaque, int irq, int level)
|
static void rc4030_irq_jazz_request(void *opaque, int irq, int level)
|
||||||
|
@ -588,7 +589,8 @@ static const VMStateDescription vmstate_rc4030 = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void rc4030_do_dma(void *opaque, int n, uint8_t *buf, int len, int is_write)
|
static void rc4030_do_dma(void *opaque, int n, uint8_t *buf,
|
||||||
|
int len, int is_write)
|
||||||
{
|
{
|
||||||
rc4030State *s = opaque;
|
rc4030State *s = opaque;
|
||||||
hwaddr dma_addr;
|
hwaddr dma_addr;
|
||||||
|
@ -643,8 +645,8 @@ static rc4030_dma *rc4030_allocate_dmas(void *opaque, int n)
|
||||||
struct rc4030DMAState *p;
|
struct rc4030DMAState *p;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
s = (rc4030_dma *)g_malloc0(sizeof(rc4030_dma) * n);
|
s = (rc4030_dma *)g_new0(rc4030_dma, n);
|
||||||
p = (struct rc4030DMAState *)g_malloc0(sizeof(struct rc4030DMAState) * n);
|
p = (struct rc4030DMAState *)g_new0(struct rc4030DMAState, n);
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
p->opaque = opaque;
|
p->opaque = opaque;
|
||||||
p->n = i;
|
p->n = i;
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#include "qemu/timer.h"
|
#include "qemu/timer.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
//#define DEBUG_VT82C686B
|
/* #define DEBUG_VT82C686B */
|
||||||
|
|
||||||
#ifdef DEBUG_VT82C686B
|
#ifdef DEBUG_VT82C686B
|
||||||
#define DPRINTF(fmt, ...) fprintf(stderr, "%s: " fmt, __func__, ##__VA_ARGS__)
|
#define DPRINTF(fmt, ...) fprintf(stderr, "%s: " fmt, __func__, ##__VA_ARGS__)
|
||||||
|
@ -35,8 +35,7 @@
|
||||||
#define DPRINTF(fmt, ...)
|
#define DPRINTF(fmt, ...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct SuperIOConfig
|
typedef struct SuperIOConfig {
|
||||||
{
|
|
||||||
uint8_t config[0x100];
|
uint8_t config[0x100];
|
||||||
uint8_t index;
|
uint8_t index;
|
||||||
uint8_t data;
|
uint8_t data;
|
||||||
|
@ -102,7 +101,7 @@ static uint64_t superio_ioport_readb(void *opaque, hwaddr addr, unsigned size)
|
||||||
SuperIOConfig *superio_conf = opaque;
|
SuperIOConfig *superio_conf = opaque;
|
||||||
|
|
||||||
DPRINTF("superio_ioport_readb address 0x%x\n", addr);
|
DPRINTF("superio_ioport_readb address 0x%x\n", addr);
|
||||||
return (superio_conf->config[superio_conf->index]);
|
return superio_conf->config[superio_conf->index];
|
||||||
}
|
}
|
||||||
|
|
||||||
static const MemoryRegionOps superio_ops = {
|
static const MemoryRegionOps superio_ops = {
|
||||||
|
@ -143,7 +142,7 @@ static void vt82c686b_isa_reset(DeviceState *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write config pci function0 registers. PCI-ISA bridge */
|
/* write config pci function0 registers. PCI-ISA bridge */
|
||||||
static void vt82c686b_write_config(PCIDevice * d, uint32_t address,
|
static void vt82c686b_write_config(PCIDevice *d, uint32_t address,
|
||||||
uint32_t val, int len)
|
uint32_t val, int len)
|
||||||
{
|
{
|
||||||
VT82C686BState *vt686 = VT82C686B_DEVICE(d);
|
VT82C686BState *vt686 = VT82C686B_DEVICE(d);
|
||||||
|
@ -365,7 +364,7 @@ static void vt82c686b_pm_realize(PCIDevice *dev, Error **errp)
|
||||||
pci_set_long(pci_conf + 0x48, 0x00000001);
|
pci_set_long(pci_conf + 0x48, 0x00000001);
|
||||||
|
|
||||||
/* SMB ports:0xeee0~0xeeef */
|
/* SMB ports:0xeee0~0xeeef */
|
||||||
s->smb_io_base =((s->smb_io_base & 0xfff0) + 0x0);
|
s->smb_io_base = ((s->smb_io_base & 0xfff0) + 0x0);
|
||||||
pci_conf[0x90] = s->smb_io_base | 1;
|
pci_conf[0x90] = s->smb_io_base | 1;
|
||||||
pci_conf[0x91] = s->smb_io_base >> 8;
|
pci_conf[0x91] = s->smb_io_base >> 8;
|
||||||
pci_conf[0xd2] = 0x90;
|
pci_conf[0xd2] = 0x90;
|
||||||
|
@ -462,16 +461,18 @@ static void vt82c686b_realize(PCIDevice *d, Error **errp)
|
||||||
|
|
||||||
wmask = d->wmask;
|
wmask = d->wmask;
|
||||||
for (i = 0x00; i < 0xff; i++) {
|
for (i = 0x00; i < 0xff; i++) {
|
||||||
if (i<=0x03 || (i>=0x08 && i<=0x3f)) {
|
if (i <= 0x03 || (i >= 0x08 && i <= 0x3f)) {
|
||||||
wmask[i] = 0x00;
|
wmask[i] = 0x00;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memory_region_init_io(&vt82c->superio, OBJECT(d), &superio_ops,
|
memory_region_init_io(&vt82c->superio, OBJECT(d), &superio_ops,
|
||||||
&vt82c->superio_conf, "superio", 2);
|
&vt82c->superio_conf, "superio", 2);
|
||||||
memory_region_set_enabled(&vt82c->superio, false);
|
memory_region_set_enabled(&vt82c->superio, false);
|
||||||
/* The floppy also uses 0x3f0 and 0x3f1.
|
/*
|
||||||
* But we do not emulate a floppy, so just set it here. */
|
* The floppy also uses 0x3f0 and 0x3f1.
|
||||||
|
* But we do not emulate a floppy, so just set it here.
|
||||||
|
*/
|
||||||
memory_region_add_subregion(isa_bus->address_space_io, 0x3f0,
|
memory_region_add_subregion(isa_bus->address_space_io, 0x3f0,
|
||||||
&vt82c->superio);
|
&vt82c->superio);
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,8 +52,7 @@
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "qemu/help_option.h"
|
#include "qemu/help_option.h"
|
||||||
|
|
||||||
enum jazz_model_e
|
enum jazz_model_e {
|
||||||
{
|
|
||||||
JAZZ_MAGNUM,
|
JAZZ_MAGNUM,
|
||||||
JAZZ_PICA61,
|
JAZZ_PICA61,
|
||||||
};
|
};
|
||||||
|
@ -90,16 +89,20 @@ static const MemoryRegionOps rtc_ops = {
|
||||||
static uint64_t dma_dummy_read(void *opaque, hwaddr addr,
|
static uint64_t dma_dummy_read(void *opaque, hwaddr addr,
|
||||||
unsigned size)
|
unsigned size)
|
||||||
{
|
{
|
||||||
/* Nothing to do. That is only to ensure that
|
/*
|
||||||
* the current DMA acknowledge cycle is completed. */
|
* Nothing to do. That is only to ensure that
|
||||||
|
* the current DMA acknowledge cycle is completed.
|
||||||
|
*/
|
||||||
return 0xff;
|
return 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dma_dummy_write(void *opaque, hwaddr addr,
|
static void dma_dummy_write(void *opaque, hwaddr addr,
|
||||||
uint64_t val, unsigned size)
|
uint64_t val, unsigned size)
|
||||||
{
|
{
|
||||||
/* Nothing to do. That is only to ensure that
|
/*
|
||||||
* the current DMA acknowledge cycle is completed. */
|
* Nothing to do. That is only to ensure that
|
||||||
|
* the current DMA acknowledge cycle is completed.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static const MemoryRegionOps dma_dummy_ops = {
|
static const MemoryRegionOps dma_dummy_ops = {
|
||||||
|
@ -109,8 +112,8 @@ static const MemoryRegionOps dma_dummy_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAGNUM_BIOS_SIZE_MAX 0x7e000
|
#define MAGNUM_BIOS_SIZE_MAX 0x7e000
|
||||||
#define MAGNUM_BIOS_SIZE (BIOS_SIZE < MAGNUM_BIOS_SIZE_MAX ? BIOS_SIZE : MAGNUM_BIOS_SIZE_MAX)
|
#define MAGNUM_BIOS_SIZE \
|
||||||
|
(BIOS_SIZE < MAGNUM_BIOS_SIZE_MAX ? BIOS_SIZE : MAGNUM_BIOS_SIZE_MAX)
|
||||||
static void (*real_do_transaction_failed)(CPUState *cpu, hwaddr physaddr,
|
static void (*real_do_transaction_failed)(CPUState *cpu, hwaddr physaddr,
|
||||||
vaddr addr, unsigned size,
|
vaddr addr, unsigned size,
|
||||||
MMUAccessType access_type,
|
MMUAccessType access_type,
|
||||||
|
@ -201,8 +204,9 @@ static void mips_jazz_init(MachineState *machine,
|
||||||
memory_region_add_subregion(address_space, 0xfff00000LL, bios2);
|
memory_region_add_subregion(address_space, 0xfff00000LL, bios2);
|
||||||
|
|
||||||
/* load the BIOS image. */
|
/* load the BIOS image. */
|
||||||
if (bios_name == NULL)
|
if (bios_name == NULL) {
|
||||||
bios_name = BIOS_FILENAME;
|
bios_name = BIOS_FILENAME;
|
||||||
|
}
|
||||||
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
|
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
|
||||||
if (filename) {
|
if (filename) {
|
||||||
bios_size = load_image_targphys(filename, 0xfff00000LL,
|
bios_size = load_image_targphys(filename, 0xfff00000LL,
|
||||||
|
@ -229,7 +233,8 @@ static void mips_jazz_init(MachineState *machine,
|
||||||
sysbus_mmio_get_region(sysbus, 0));
|
sysbus_mmio_get_region(sysbus, 0));
|
||||||
memory_region_add_subregion(address_space, 0xf0000000,
|
memory_region_add_subregion(address_space, 0xf0000000,
|
||||||
sysbus_mmio_get_region(sysbus, 1));
|
sysbus_mmio_get_region(sysbus, 1));
|
||||||
memory_region_init_io(dma_dummy, NULL, &dma_dummy_ops, NULL, "dummy_dma", 0x1000);
|
memory_region_init_io(dma_dummy, NULL, &dma_dummy_ops,
|
||||||
|
NULL, "dummy_dma", 0x1000);
|
||||||
memory_region_add_subregion(address_space, 0x8000d000, dma_dummy);
|
memory_region_add_subregion(address_space, 0x8000d000, dma_dummy);
|
||||||
|
|
||||||
/* ISA bus: IO space at 0x90000000, mem space at 0x91000000 */
|
/* ISA bus: IO space at 0x90000000, mem space at 0x91000000 */
|
||||||
|
@ -276,8 +281,9 @@ static void mips_jazz_init(MachineState *machine,
|
||||||
/* Network controller */
|
/* Network controller */
|
||||||
for (n = 0; n < nb_nics; n++) {
|
for (n = 0; n < nb_nics; n++) {
|
||||||
nd = &nd_table[n];
|
nd = &nd_table[n];
|
||||||
if (!nd->model)
|
if (!nd->model) {
|
||||||
nd->model = g_strdup("dp83932");
|
nd->model = g_strdup("dp83932");
|
||||||
|
}
|
||||||
if (strcmp(nd->model, "dp83932") == 0) {
|
if (strcmp(nd->model, "dp83932") == 0) {
|
||||||
qemu_check_nic_model(nd, "dp83932");
|
qemu_check_nic_model(nd, "dp83932");
|
||||||
|
|
||||||
|
@ -338,12 +344,12 @@ static void mips_jazz_init(MachineState *machine,
|
||||||
/* Serial ports */
|
/* Serial ports */
|
||||||
if (serial_hd(0)) {
|
if (serial_hd(0)) {
|
||||||
serial_mm_init(address_space, 0x80006000, 0,
|
serial_mm_init(address_space, 0x80006000, 0,
|
||||||
qdev_get_gpio_in(rc4030, 8), 8000000/16,
|
qdev_get_gpio_in(rc4030, 8), 8000000 / 16,
|
||||||
serial_hd(0), DEVICE_NATIVE_ENDIAN);
|
serial_hd(0), DEVICE_NATIVE_ENDIAN);
|
||||||
}
|
}
|
||||||
if (serial_hd(1)) {
|
if (serial_hd(1)) {
|
||||||
serial_mm_init(address_space, 0x80007000, 0,
|
serial_mm_init(address_space, 0x80007000, 0,
|
||||||
qdev_get_gpio_in(rc4030, 9), 8000000/16,
|
qdev_get_gpio_in(rc4030, 9), 8000000 / 16,
|
||||||
serial_hd(1), DEVICE_NATIVE_ENDIAN);
|
serial_hd(1), DEVICE_NATIVE_ENDIAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -137,7 +137,8 @@ static void malta_fpga_update_display(void *opaque)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
# define logout(fmt, ...) fprintf(stderr, "MALTA\t%-24s" fmt, __func__, ## __VA_ARGS__)
|
# define logout(fmt, ...) \
|
||||||
|
fprintf(stderr, "MALTA\t%-24s" fmt, __func__, ## __VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
# define logout(fmt, ...) ((void)0)
|
# define logout(fmt, ...) ((void)0)
|
||||||
#endif
|
#endif
|
||||||
|
@ -359,7 +360,6 @@ static uint64_t malta_fpga_read(void *opaque, hwaddr addr,
|
||||||
|
|
||||||
/* SWITCH Register */
|
/* SWITCH Register */
|
||||||
case 0x00200:
|
case 0x00200:
|
||||||
/* ori a3, a3, low(ram_low_size) */
|
|
||||||
val = 0x00000000;
|
val = 0x00000000;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -569,7 +569,7 @@ static MaltaFPGAState *malta_fpga_init(MemoryRegion *address_space,
|
||||||
MaltaFPGAState *s;
|
MaltaFPGAState *s;
|
||||||
Chardev *chr;
|
Chardev *chr;
|
||||||
|
|
||||||
s = (MaltaFPGAState *)g_malloc0(sizeof(MaltaFPGAState));
|
s = g_new0(MaltaFPGAState, 1);
|
||||||
|
|
||||||
memory_region_init_io(&s->iomem, NULL, &malta_fpga_ops, s,
|
memory_region_init_io(&s->iomem, NULL, &malta_fpga_ops, s,
|
||||||
"malta-fpga", 0x100000);
|
"malta-fpga", 0x100000);
|
||||||
|
@ -844,24 +844,24 @@ static void write_bootloader(uint8_t *base, int64_t run_addr,
|
||||||
/* Small bootloader */
|
/* Small bootloader */
|
||||||
p = (uint32_t *)base;
|
p = (uint32_t *)base;
|
||||||
|
|
||||||
stl_p(p++, 0x08000000 | /* j 0x1fc00580 */
|
stl_p(p++, 0x08000000 | /* j 0x1fc00580 */
|
||||||
((run_addr + 0x580) & 0x0fffffff) >> 2);
|
((run_addr + 0x580) & 0x0fffffff) >> 2);
|
||||||
stl_p(p++, 0x00000000); /* nop */
|
stl_p(p++, 0x00000000); /* nop */
|
||||||
|
|
||||||
/* YAMON service vector */
|
/* YAMON service vector */
|
||||||
stl_p(base + 0x500, run_addr + 0x0580); /* start: */
|
stl_p(base + 0x500, run_addr + 0x0580); /* start: */
|
||||||
stl_p(base + 0x504, run_addr + 0x083c); /* print_count: */
|
stl_p(base + 0x504, run_addr + 0x083c); /* print_count: */
|
||||||
stl_p(base + 0x520, run_addr + 0x0580); /* start: */
|
stl_p(base + 0x520, run_addr + 0x0580); /* start: */
|
||||||
stl_p(base + 0x52c, run_addr + 0x0800); /* flush_cache: */
|
stl_p(base + 0x52c, run_addr + 0x0800); /* flush_cache: */
|
||||||
stl_p(base + 0x534, run_addr + 0x0808); /* print: */
|
stl_p(base + 0x534, run_addr + 0x0808); /* print: */
|
||||||
stl_p(base + 0x538, run_addr + 0x0800); /* reg_cpu_isr: */
|
stl_p(base + 0x538, run_addr + 0x0800); /* reg_cpu_isr: */
|
||||||
stl_p(base + 0x53c, run_addr + 0x0800); /* unred_cpu_isr: */
|
stl_p(base + 0x53c, run_addr + 0x0800); /* unred_cpu_isr: */
|
||||||
stl_p(base + 0x540, run_addr + 0x0800); /* reg_ic_isr: */
|
stl_p(base + 0x540, run_addr + 0x0800); /* reg_ic_isr: */
|
||||||
stl_p(base + 0x544, run_addr + 0x0800); /* unred_ic_isr: */
|
stl_p(base + 0x544, run_addr + 0x0800); /* unred_ic_isr: */
|
||||||
stl_p(base + 0x548, run_addr + 0x0800); /* reg_esr: */
|
stl_p(base + 0x548, run_addr + 0x0800); /* reg_esr: */
|
||||||
stl_p(base + 0x54c, run_addr + 0x0800); /* unreg_esr: */
|
stl_p(base + 0x54c, run_addr + 0x0800); /* unreg_esr: */
|
||||||
stl_p(base + 0x550, run_addr + 0x0800); /* getchar: */
|
stl_p(base + 0x550, run_addr + 0x0800); /* getchar: */
|
||||||
stl_p(base + 0x554, run_addr + 0x0800); /* syscon_read: */
|
stl_p(base + 0x554, run_addr + 0x0800); /* syscon_read: */
|
||||||
|
|
||||||
|
|
||||||
/* Second part of the bootloader */
|
/* Second part of the bootloader */
|
||||||
|
@ -869,9 +869,9 @@ static void write_bootloader(uint8_t *base, int64_t run_addr,
|
||||||
|
|
||||||
if (semihosting_get_argc()) {
|
if (semihosting_get_argc()) {
|
||||||
/* Preserve a0 content as arguments have been passed */
|
/* Preserve a0 content as arguments have been passed */
|
||||||
stl_p(p++, 0x00000000); /* nop */
|
stl_p(p++, 0x00000000); /* nop */
|
||||||
} else {
|
} else {
|
||||||
stl_p(p++, 0x24040002); /* addiu a0, zero, 2 */
|
stl_p(p++, 0x24040002); /* addiu a0, zero, 2 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* lui sp, high(ENVP_ADDR) */
|
/* lui sp, high(ENVP_ADDR) */
|
||||||
|
@ -892,104 +892,106 @@ static void write_bootloader(uint8_t *base, int64_t run_addr,
|
||||||
stl_p(p++, 0x34e70000 | (loaderparams.ram_low_size & 0xffff));
|
stl_p(p++, 0x34e70000 | (loaderparams.ram_low_size & 0xffff));
|
||||||
|
|
||||||
/* Load BAR registers as done by YAMON */
|
/* Load BAR registers as done by YAMON */
|
||||||
stl_p(p++, 0x3c09b400); /* lui t1, 0xb400 */
|
stl_p(p++, 0x3c09b400); /* lui t1, 0xb400 */
|
||||||
|
|
||||||
#ifdef TARGET_WORDS_BIGENDIAN
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
stl_p(p++, 0x3c08df00); /* lui t0, 0xdf00 */
|
stl_p(p++, 0x3c08df00); /* lui t0, 0xdf00 */
|
||||||
#else
|
#else
|
||||||
stl_p(p++, 0x340800df); /* ori t0, r0, 0x00df */
|
stl_p(p++, 0x340800df); /* ori t0, r0, 0x00df */
|
||||||
#endif
|
#endif
|
||||||
stl_p(p++, 0xad280068); /* sw t0, 0x0068(t1) */
|
stl_p(p++, 0xad280068); /* sw t0, 0x0068(t1) */
|
||||||
|
|
||||||
stl_p(p++, 0x3c09bbe0); /* lui t1, 0xbbe0 */
|
stl_p(p++, 0x3c09bbe0); /* lui t1, 0xbbe0 */
|
||||||
|
|
||||||
#ifdef TARGET_WORDS_BIGENDIAN
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
stl_p(p++, 0x3c08c000); /* lui t0, 0xc000 */
|
stl_p(p++, 0x3c08c000); /* lui t0, 0xc000 */
|
||||||
#else
|
#else
|
||||||
stl_p(p++, 0x340800c0); /* ori t0, r0, 0x00c0 */
|
stl_p(p++, 0x340800c0); /* ori t0, r0, 0x00c0 */
|
||||||
#endif
|
#endif
|
||||||
stl_p(p++, 0xad280048); /* sw t0, 0x0048(t1) */
|
stl_p(p++, 0xad280048); /* sw t0, 0x0048(t1) */
|
||||||
#ifdef TARGET_WORDS_BIGENDIAN
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
stl_p(p++, 0x3c084000); /* lui t0, 0x4000 */
|
stl_p(p++, 0x3c084000); /* lui t0, 0x4000 */
|
||||||
#else
|
#else
|
||||||
stl_p(p++, 0x34080040); /* ori t0, r0, 0x0040 */
|
stl_p(p++, 0x34080040); /* ori t0, r0, 0x0040 */
|
||||||
#endif
|
#endif
|
||||||
stl_p(p++, 0xad280050); /* sw t0, 0x0050(t1) */
|
stl_p(p++, 0xad280050); /* sw t0, 0x0050(t1) */
|
||||||
|
|
||||||
#ifdef TARGET_WORDS_BIGENDIAN
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
stl_p(p++, 0x3c088000); /* lui t0, 0x8000 */
|
stl_p(p++, 0x3c088000); /* lui t0, 0x8000 */
|
||||||
#else
|
#else
|
||||||
stl_p(p++, 0x34080080); /* ori t0, r0, 0x0080 */
|
stl_p(p++, 0x34080080); /* ori t0, r0, 0x0080 */
|
||||||
#endif
|
#endif
|
||||||
stl_p(p++, 0xad280058); /* sw t0, 0x0058(t1) */
|
stl_p(p++, 0xad280058); /* sw t0, 0x0058(t1) */
|
||||||
#ifdef TARGET_WORDS_BIGENDIAN
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
stl_p(p++, 0x3c083f00); /* lui t0, 0x3f00 */
|
stl_p(p++, 0x3c083f00); /* lui t0, 0x3f00 */
|
||||||
#else
|
#else
|
||||||
stl_p(p++, 0x3408003f); /* ori t0, r0, 0x003f */
|
stl_p(p++, 0x3408003f); /* ori t0, r0, 0x003f */
|
||||||
#endif
|
#endif
|
||||||
stl_p(p++, 0xad280060); /* sw t0, 0x0060(t1) */
|
stl_p(p++, 0xad280060); /* sw t0, 0x0060(t1) */
|
||||||
|
|
||||||
#ifdef TARGET_WORDS_BIGENDIAN
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
stl_p(p++, 0x3c08c100); /* lui t0, 0xc100 */
|
stl_p(p++, 0x3c08c100); /* lui t0, 0xc100 */
|
||||||
#else
|
#else
|
||||||
stl_p(p++, 0x340800c1); /* ori t0, r0, 0x00c1 */
|
stl_p(p++, 0x340800c1); /* ori t0, r0, 0x00c1 */
|
||||||
#endif
|
#endif
|
||||||
stl_p(p++, 0xad280080); /* sw t0, 0x0080(t1) */
|
stl_p(p++, 0xad280080); /* sw t0, 0x0080(t1) */
|
||||||
#ifdef TARGET_WORDS_BIGENDIAN
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
stl_p(p++, 0x3c085e00); /* lui t0, 0x5e00 */
|
stl_p(p++, 0x3c085e00); /* lui t0, 0x5e00 */
|
||||||
#else
|
#else
|
||||||
stl_p(p++, 0x3408005e); /* ori t0, r0, 0x005e */
|
stl_p(p++, 0x3408005e); /* ori t0, r0, 0x005e */
|
||||||
#endif
|
#endif
|
||||||
stl_p(p++, 0xad280088); /* sw t0, 0x0088(t1) */
|
stl_p(p++, 0xad280088); /* sw t0, 0x0088(t1) */
|
||||||
|
|
||||||
/* Jump to kernel code */
|
/* Jump to kernel code */
|
||||||
stl_p(p++, 0x3c1f0000 | ((kernel_entry >> 16) & 0xffff)); /* lui ra, high(kernel_entry) */
|
stl_p(p++, 0x3c1f0000 |
|
||||||
stl_p(p++, 0x37ff0000 | (kernel_entry & 0xffff)); /* ori ra, ra, low(kernel_entry) */
|
((kernel_entry >> 16) & 0xffff)); /* lui ra, high(kernel_entry) */
|
||||||
stl_p(p++, 0x03e00009); /* jalr ra */
|
stl_p(p++, 0x37ff0000 |
|
||||||
stl_p(p++, 0x00000000); /* nop */
|
(kernel_entry & 0xffff)); /* ori ra, ra, low(kernel_entry) */
|
||||||
|
stl_p(p++, 0x03e00009); /* jalr ra */
|
||||||
|
stl_p(p++, 0x00000000); /* nop */
|
||||||
|
|
||||||
/* YAMON subroutines */
|
/* YAMON subroutines */
|
||||||
p = (uint32_t *) (base + 0x800);
|
p = (uint32_t *) (base + 0x800);
|
||||||
stl_p(p++, 0x03e00009); /* jalr ra */
|
stl_p(p++, 0x03e00009); /* jalr ra */
|
||||||
stl_p(p++, 0x24020000); /* li v0,0 */
|
stl_p(p++, 0x24020000); /* li v0,0 */
|
||||||
/* 808 YAMON print */
|
/* 808 YAMON print */
|
||||||
stl_p(p++, 0x03e06821); /* move t5,ra */
|
stl_p(p++, 0x03e06821); /* move t5,ra */
|
||||||
stl_p(p++, 0x00805821); /* move t3,a0 */
|
stl_p(p++, 0x00805821); /* move t3,a0 */
|
||||||
stl_p(p++, 0x00a05021); /* move t2,a1 */
|
stl_p(p++, 0x00a05021); /* move t2,a1 */
|
||||||
stl_p(p++, 0x91440000); /* lbu a0,0(t2) */
|
stl_p(p++, 0x91440000); /* lbu a0,0(t2) */
|
||||||
stl_p(p++, 0x254a0001); /* addiu t2,t2,1 */
|
stl_p(p++, 0x254a0001); /* addiu t2,t2,1 */
|
||||||
stl_p(p++, 0x10800005); /* beqz a0,834 */
|
stl_p(p++, 0x10800005); /* beqz a0,834 */
|
||||||
stl_p(p++, 0x00000000); /* nop */
|
stl_p(p++, 0x00000000); /* nop */
|
||||||
stl_p(p++, 0x0ff0021c); /* jal 870 */
|
stl_p(p++, 0x0ff0021c); /* jal 870 */
|
||||||
stl_p(p++, 0x00000000); /* nop */
|
stl_p(p++, 0x00000000); /* nop */
|
||||||
stl_p(p++, 0x1000fff9); /* b 814 */
|
stl_p(p++, 0x1000fff9); /* b 814 */
|
||||||
stl_p(p++, 0x00000000); /* nop */
|
stl_p(p++, 0x00000000); /* nop */
|
||||||
stl_p(p++, 0x01a00009); /* jalr t5 */
|
stl_p(p++, 0x01a00009); /* jalr t5 */
|
||||||
stl_p(p++, 0x01602021); /* move a0,t3 */
|
stl_p(p++, 0x01602021); /* move a0,t3 */
|
||||||
/* 0x83c YAMON print_count */
|
/* 0x83c YAMON print_count */
|
||||||
stl_p(p++, 0x03e06821); /* move t5,ra */
|
stl_p(p++, 0x03e06821); /* move t5,ra */
|
||||||
stl_p(p++, 0x00805821); /* move t3,a0 */
|
stl_p(p++, 0x00805821); /* move t3,a0 */
|
||||||
stl_p(p++, 0x00a05021); /* move t2,a1 */
|
stl_p(p++, 0x00a05021); /* move t2,a1 */
|
||||||
stl_p(p++, 0x00c06021); /* move t4,a2 */
|
stl_p(p++, 0x00c06021); /* move t4,a2 */
|
||||||
stl_p(p++, 0x91440000); /* lbu a0,0(t2) */
|
stl_p(p++, 0x91440000); /* lbu a0,0(t2) */
|
||||||
stl_p(p++, 0x0ff0021c); /* jal 870 */
|
stl_p(p++, 0x0ff0021c); /* jal 870 */
|
||||||
stl_p(p++, 0x00000000); /* nop */
|
stl_p(p++, 0x00000000); /* nop */
|
||||||
stl_p(p++, 0x254a0001); /* addiu t2,t2,1 */
|
stl_p(p++, 0x254a0001); /* addiu t2,t2,1 */
|
||||||
stl_p(p++, 0x258cffff); /* addiu t4,t4,-1 */
|
stl_p(p++, 0x258cffff); /* addiu t4,t4,-1 */
|
||||||
stl_p(p++, 0x1580fffa); /* bnez t4,84c */
|
stl_p(p++, 0x1580fffa); /* bnez t4,84c */
|
||||||
stl_p(p++, 0x00000000); /* nop */
|
stl_p(p++, 0x00000000); /* nop */
|
||||||
stl_p(p++, 0x01a00009); /* jalr t5 */
|
stl_p(p++, 0x01a00009); /* jalr t5 */
|
||||||
stl_p(p++, 0x01602021); /* move a0,t3 */
|
stl_p(p++, 0x01602021); /* move a0,t3 */
|
||||||
/* 0x870 */
|
/* 0x870 */
|
||||||
stl_p(p++, 0x3c08b800); /* lui t0,0xb400 */
|
stl_p(p++, 0x3c08b800); /* lui t0,0xb400 */
|
||||||
stl_p(p++, 0x350803f8); /* ori t0,t0,0x3f8 */
|
stl_p(p++, 0x350803f8); /* ori t0,t0,0x3f8 */
|
||||||
stl_p(p++, 0x91090005); /* lbu t1,5(t0) */
|
stl_p(p++, 0x91090005); /* lbu t1,5(t0) */
|
||||||
stl_p(p++, 0x00000000); /* nop */
|
stl_p(p++, 0x00000000); /* nop */
|
||||||
stl_p(p++, 0x31290040); /* andi t1,t1,0x40 */
|
stl_p(p++, 0x31290040); /* andi t1,t1,0x40 */
|
||||||
stl_p(p++, 0x1120fffc); /* beqz t1,878 <outch+0x8> */
|
stl_p(p++, 0x1120fffc); /* beqz t1,878 <outch+0x8> */
|
||||||
stl_p(p++, 0x00000000); /* nop */
|
stl_p(p++, 0x00000000); /* nop */
|
||||||
stl_p(p++, 0x03e00009); /* jalr ra */
|
stl_p(p++, 0x03e00009); /* jalr ra */
|
||||||
stl_p(p++, 0xa1040000); /* sb a0,0(t0) */
|
stl_p(p++, 0xa1040000); /* sb a0,0(t0) */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1242,7 +1244,7 @@ void mips_malta_init(MachineState *machine)
|
||||||
/*
|
/*
|
||||||
* The whole address space decoded by the GT-64120A doesn't generate
|
* The whole address space decoded by the GT-64120A doesn't generate
|
||||||
* exception when accessing invalid memory. Create an empty slot to
|
* exception when accessing invalid memory. Create an empty slot to
|
||||||
* emulate this feature.\
|
* emulate this feature.
|
||||||
*/
|
*/
|
||||||
empty_slot_init(0, 0x20000000);
|
empty_slot_init(0, 0x20000000);
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
* ISA memory at the 0x10000000 (PHYS, 16Mb in size).
|
* ISA memory at the 0x10000000 (PHYS, 16Mb in size).
|
||||||
* All peripherial devices are attached to this "bus" with
|
* All peripherial devices are attached to this "bus" with
|
||||||
* the standard PC ISA addresses.
|
* the standard PC ISA addresses.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/units.h"
|
#include "qemu/units.h"
|
||||||
|
@ -54,17 +54,18 @@ static struct _loaderparams {
|
||||||
const char *initrd_filename;
|
const char *initrd_filename;
|
||||||
} loaderparams;
|
} loaderparams;
|
||||||
|
|
||||||
static void mips_qemu_write (void *opaque, hwaddr addr,
|
static void mips_qemu_write(void *opaque, hwaddr addr,
|
||||||
uint64_t val, unsigned size)
|
uint64_t val, unsigned size)
|
||||||
{
|
{
|
||||||
if ((addr & 0xffff) == 0 && val == 42)
|
if ((addr & 0xffff) == 0 && val == 42) {
|
||||||
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
|
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
|
||||||
else if ((addr & 0xffff) == 4 && val == 42)
|
} else if ((addr & 0xffff) == 4 && val == 42) {
|
||||||
qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
|
qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t mips_qemu_read (void *opaque, hwaddr addr,
|
static uint64_t mips_qemu_read(void *opaque, hwaddr addr,
|
||||||
unsigned size)
|
unsigned size)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -100,8 +101,9 @@ static int64_t load_kernel(void)
|
||||||
(uint64_t *)&kernel_high, big_endian,
|
(uint64_t *)&kernel_high, big_endian,
|
||||||
EM_MIPS, 1, 0);
|
EM_MIPS, 1, 0);
|
||||||
if (kernel_size >= 0) {
|
if (kernel_size >= 0) {
|
||||||
if ((entry & ~0x7fffffffULL) == 0x80000000)
|
if ((entry & ~0x7fffffffULL) == 0x80000000) {
|
||||||
entry = (int32_t)entry;
|
entry = (int32_t)entry;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
error_report("could not load kernel '%s': %s",
|
error_report("could not load kernel '%s': %s",
|
||||||
loaderparams.kernel_filename,
|
loaderparams.kernel_filename,
|
||||||
|
@ -113,9 +115,10 @@ static int64_t load_kernel(void)
|
||||||
initrd_size = 0;
|
initrd_size = 0;
|
||||||
initrd_offset = 0;
|
initrd_offset = 0;
|
||||||
if (loaderparams.initrd_filename) {
|
if (loaderparams.initrd_filename) {
|
||||||
initrd_size = get_image_size (loaderparams.initrd_filename);
|
initrd_size = get_image_size(loaderparams.initrd_filename);
|
||||||
if (initrd_size > 0) {
|
if (initrd_size > 0) {
|
||||||
initrd_offset = (kernel_high + ~INITRD_PAGE_MASK) & INITRD_PAGE_MASK;
|
initrd_offset = (kernel_high + ~INITRD_PAGE_MASK) &
|
||||||
|
INITRD_PAGE_MASK;
|
||||||
if (initrd_offset + initrd_size > ram_size) {
|
if (initrd_offset + initrd_size > ram_size) {
|
||||||
error_report("memory too small for initial ram disk '%s'",
|
error_report("memory too small for initial ram disk '%s'",
|
||||||
loaderparams.initrd_filename);
|
loaderparams.initrd_filename);
|
||||||
|
@ -139,11 +142,13 @@ static int64_t load_kernel(void)
|
||||||
params_buf[1] = tswap32(0x12345678);
|
params_buf[1] = tswap32(0x12345678);
|
||||||
|
|
||||||
if (initrd_size > 0) {
|
if (initrd_size > 0) {
|
||||||
snprintf((char *)params_buf + 8, 256, "rd_start=0x%" PRIx64 " rd_size=%" PRId64 " %s",
|
snprintf((char *)params_buf + 8, 256,
|
||||||
|
"rd_start=0x%" PRIx64 " rd_size=%" PRId64 " %s",
|
||||||
cpu_mips_phys_to_kseg0(NULL, initrd_offset),
|
cpu_mips_phys_to_kseg0(NULL, initrd_offset),
|
||||||
initrd_size, loaderparams.kernel_cmdline);
|
initrd_size, loaderparams.kernel_cmdline);
|
||||||
} else {
|
} else {
|
||||||
snprintf((char *)params_buf + 8, 256, "%s", loaderparams.kernel_cmdline);
|
snprintf((char *)params_buf + 8, 256,
|
||||||
|
"%s", loaderparams.kernel_cmdline);
|
||||||
}
|
}
|
||||||
|
|
||||||
rom_add_blob_fixed("params", params_buf, params_size,
|
rom_add_blob_fixed("params", params_buf, params_size,
|
||||||
|
@ -207,15 +212,21 @@ void mips_r4k_init(MachineState *machine)
|
||||||
|
|
||||||
memory_region_add_subregion(address_space_mem, 0, ram);
|
memory_region_add_subregion(address_space_mem, 0, ram);
|
||||||
|
|
||||||
memory_region_init_io(iomem, NULL, &mips_qemu_ops, NULL, "mips-qemu", 0x10000);
|
memory_region_init_io(iomem, NULL, &mips_qemu_ops,
|
||||||
|
NULL, "mips-qemu", 0x10000);
|
||||||
|
|
||||||
memory_region_add_subregion(address_space_mem, 0x1fbf0000, iomem);
|
memory_region_add_subregion(address_space_mem, 0x1fbf0000, iomem);
|
||||||
|
|
||||||
/* Try to load a BIOS image. If this fails, we continue regardless,
|
/*
|
||||||
but initialize the hardware ourselves. When a kernel gets
|
* Try to load a BIOS image. If this fails, we continue regardless,
|
||||||
preloaded we also initialize the hardware, since the BIOS wasn't
|
* but initialize the hardware ourselves. When a kernel gets
|
||||||
run. */
|
* preloaded we also initialize the hardware, since the BIOS wasn't
|
||||||
if (bios_name == NULL)
|
* run.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (bios_name == NULL) {
|
||||||
bios_name = BIOS_FILENAME;
|
bios_name = BIOS_FILENAME;
|
||||||
|
}
|
||||||
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
|
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
|
||||||
if (filename) {
|
if (filename) {
|
||||||
bios_size = get_image_size(filename);
|
bios_size = get_image_size(filename);
|
||||||
|
@ -227,6 +238,7 @@ void mips_r4k_init(MachineState *machine)
|
||||||
#else
|
#else
|
||||||
be = 0;
|
be = 0;
|
||||||
#endif
|
#endif
|
||||||
|
dinfo = drive_get(IF_PFLASH, 0, 0);
|
||||||
if ((bios_size > 0) && (bios_size <= BIOS_SIZE)) {
|
if ((bios_size > 0) && (bios_size <= BIOS_SIZE)) {
|
||||||
bios = g_new(MemoryRegion, 1);
|
bios = g_new(MemoryRegion, 1);
|
||||||
memory_region_init_ram(bios, NULL, "mips_r4k.bios", BIOS_SIZE,
|
memory_region_init_ram(bios, NULL, "mips_r4k.bios", BIOS_SIZE,
|
||||||
|
@ -235,7 +247,7 @@ void mips_r4k_init(MachineState *machine)
|
||||||
memory_region_add_subregion(get_system_memory(), 0x1fc00000, bios);
|
memory_region_add_subregion(get_system_memory(), 0x1fc00000, bios);
|
||||||
|
|
||||||
load_image_targphys(filename, 0x1fc00000, BIOS_SIZE);
|
load_image_targphys(filename, 0x1fc00000, BIOS_SIZE);
|
||||||
} else if ((dinfo = drive_get(IF_PFLASH, 0, 0)) != NULL) {
|
} else if (dinfo != NULL) {
|
||||||
uint32_t mips_rom = 0x00400000;
|
uint32_t mips_rom = 0x00400000;
|
||||||
if (!pflash_cfi01_register(0x1fc00000, "mips_r4k.bios", mips_rom,
|
if (!pflash_cfi01_register(0x1fc00000, "mips_r4k.bios", mips_rom,
|
||||||
blk_by_legacy_dinfo(dinfo),
|
blk_by_legacy_dinfo(dinfo),
|
||||||
|
@ -280,11 +292,12 @@ void mips_r4k_init(MachineState *machine)
|
||||||
|
|
||||||
isa_vga_init(isa_bus);
|
isa_vga_init(isa_bus);
|
||||||
|
|
||||||
if (nd_table[0].used)
|
if (nd_table[0].used) {
|
||||||
isa_ne2000_init(isa_bus, 0x300, 9, &nd_table[0]);
|
isa_ne2000_init(isa_bus, 0x300, 9, &nd_table[0]);
|
||||||
|
}
|
||||||
|
|
||||||
ide_drive_get(hd, ARRAY_SIZE(hd));
|
ide_drive_get(hd, ARRAY_SIZE(hd));
|
||||||
for(i = 0; i < MAX_IDE_BUS; i++)
|
for (i = 0; i < MAX_IDE_BUS; i++)
|
||||||
isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i], ide_irq[i],
|
isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i], ide_irq[i],
|
||||||
hd[MAX_IDE_DEVS * i],
|
hd[MAX_IDE_DEVS * i],
|
||||||
hd[MAX_IDE_DEVS * i + 1]);
|
hd[MAX_IDE_DEVS * i + 1]);
|
||||||
|
@ -294,6 +307,7 @@ void mips_r4k_init(MachineState *machine)
|
||||||
|
|
||||||
static void mips_machine_init(MachineClass *mc)
|
static void mips_machine_init(MachineClass *mc)
|
||||||
{
|
{
|
||||||
|
mc->deprecation_reason = "use malta machine type instead";
|
||||||
mc->desc = "mips r4k platform";
|
mc->desc = "mips r4k platform";
|
||||||
mc->init = mips_r4k_init;
|
mc->init = mips_r4k_init;
|
||||||
mc->block_default_type = IF_IDE;
|
mc->block_default_type = IF_IDE;
|
||||||
|
|
|
@ -9,19 +9,19 @@
|
||||||
|
|
||||||
/* MIPSnet register offsets */
|
/* MIPSnet register offsets */
|
||||||
|
|
||||||
#define MIPSNET_DEV_ID 0x00
|
#define MIPSNET_DEV_ID 0x00
|
||||||
#define MIPSNET_BUSY 0x08
|
#define MIPSNET_BUSY 0x08
|
||||||
#define MIPSNET_RX_DATA_COUNT 0x0c
|
#define MIPSNET_RX_DATA_COUNT 0x0c
|
||||||
#define MIPSNET_TX_DATA_COUNT 0x10
|
#define MIPSNET_TX_DATA_COUNT 0x10
|
||||||
#define MIPSNET_INT_CTL 0x14
|
#define MIPSNET_INT_CTL 0x14
|
||||||
# define MIPSNET_INTCTL_TXDONE 0x00000001
|
# define MIPSNET_INTCTL_TXDONE 0x00000001
|
||||||
# define MIPSNET_INTCTL_RXDONE 0x00000002
|
# define MIPSNET_INTCTL_RXDONE 0x00000002
|
||||||
# define MIPSNET_INTCTL_TESTBIT 0x80000000
|
# define MIPSNET_INTCTL_TESTBIT 0x80000000
|
||||||
#define MIPSNET_INTERRUPT_INFO 0x18
|
#define MIPSNET_INTERRUPT_INFO 0x18
|
||||||
#define MIPSNET_RX_DATA_BUFFER 0x1c
|
#define MIPSNET_RX_DATA_BUFFER 0x1c
|
||||||
#define MIPSNET_TX_DATA_BUFFER 0x20
|
#define MIPSNET_TX_DATA_BUFFER 0x20
|
||||||
|
|
||||||
#define MAX_ETH_FRAME_SIZE 1514
|
#define MAX_ETH_FRAME_SIZE 1514
|
||||||
|
|
||||||
#define TYPE_MIPS_NET "mipsnet"
|
#define TYPE_MIPS_NET "mipsnet"
|
||||||
#define MIPS_NET(obj) OBJECT_CHECK(MIPSnetState, (obj), TYPE_MIPS_NET)
|
#define MIPS_NET(obj) OBJECT_CHECK(MIPSnetState, (obj), TYPE_MIPS_NET)
|
||||||
|
@ -64,8 +64,9 @@ static void mipsnet_update_irq(MIPSnetState *s)
|
||||||
|
|
||||||
static int mipsnet_buffer_full(MIPSnetState *s)
|
static int mipsnet_buffer_full(MIPSnetState *s)
|
||||||
{
|
{
|
||||||
if (s->rx_count >= MAX_ETH_FRAME_SIZE)
|
if (s->rx_count >= MAX_ETH_FRAME_SIZE) {
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,18 +74,21 @@ static int mipsnet_can_receive(NetClientState *nc)
|
||||||
{
|
{
|
||||||
MIPSnetState *s = qemu_get_nic_opaque(nc);
|
MIPSnetState *s = qemu_get_nic_opaque(nc);
|
||||||
|
|
||||||
if (s->busy)
|
if (s->busy) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
return !mipsnet_buffer_full(s);
|
return !mipsnet_buffer_full(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t mipsnet_receive(NetClientState *nc, const uint8_t *buf, size_t size)
|
static ssize_t mipsnet_receive(NetClientState *nc,
|
||||||
|
const uint8_t *buf, size_t size)
|
||||||
{
|
{
|
||||||
MIPSnetState *s = qemu_get_nic_opaque(nc);
|
MIPSnetState *s = qemu_get_nic_opaque(nc);
|
||||||
|
|
||||||
trace_mipsnet_receive(size);
|
trace_mipsnet_receive(size);
|
||||||
if (!mipsnet_can_receive(nc))
|
if (!mipsnet_can_receive(nc)) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (size >= sizeof(s->rx_buffer)) {
|
if (size >= sizeof(s->rx_buffer)) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -115,10 +119,10 @@ static uint64_t mipsnet_ioport_read(void *opaque, hwaddr addr,
|
||||||
addr &= 0x3f;
|
addr &= 0x3f;
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case MIPSNET_DEV_ID:
|
case MIPSNET_DEV_ID:
|
||||||
ret = be32_to_cpu(0x4d495053); /* MIPS */
|
ret = be32_to_cpu(0x4d495053); /* MIPS */
|
||||||
break;
|
break;
|
||||||
case MIPSNET_DEV_ID + 4:
|
case MIPSNET_DEV_ID + 4:
|
||||||
ret = be32_to_cpu(0x4e455430); /* NET0 */
|
ret = be32_to_cpu(0x4e455430); /* NET0 */
|
||||||
break;
|
break;
|
||||||
case MIPSNET_BUSY:
|
case MIPSNET_BUSY:
|
||||||
ret = s->busy;
|
ret = s->busy;
|
||||||
|
|
|
@ -14,7 +14,8 @@
|
||||||
* fulong 2e mini pc has a bonito north bridge.
|
* fulong 2e mini pc has a bonito north bridge.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* what is the meaning of devfn in qemu and IDSEL in bonito northbridge?
|
/*
|
||||||
|
* what is the meaning of devfn in qemu and IDSEL in bonito northbridge?
|
||||||
*
|
*
|
||||||
* devfn pci_slot<<3 + funno
|
* devfn pci_slot<<3 + funno
|
||||||
* one pci bus can have 32 devices and each device can have 8 functions.
|
* one pci bus can have 32 devices and each device can have 8 functions.
|
||||||
|
@ -49,7 +50,7 @@
|
||||||
#include "sysemu/runstate.h"
|
#include "sysemu/runstate.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
//#define DEBUG_BONITO
|
/* #define DEBUG_BONITO */
|
||||||
|
|
||||||
#ifdef DEBUG_BONITO
|
#ifdef DEBUG_BONITO
|
||||||
#define DPRINTF(fmt, ...) fprintf(stderr, "%s: " fmt, __func__, ##__VA_ARGS__)
|
#define DPRINTF(fmt, ...) fprintf(stderr, "%s: " fmt, __func__, ##__VA_ARGS__)
|
||||||
|
@ -60,45 +61,45 @@
|
||||||
/* from linux soure code. include/asm-mips/mips-boards/bonito64.h*/
|
/* from linux soure code. include/asm-mips/mips-boards/bonito64.h*/
|
||||||
#define BONITO_BOOT_BASE 0x1fc00000
|
#define BONITO_BOOT_BASE 0x1fc00000
|
||||||
#define BONITO_BOOT_SIZE 0x00100000
|
#define BONITO_BOOT_SIZE 0x00100000
|
||||||
#define BONITO_BOOT_TOP (BONITO_BOOT_BASE+BONITO_BOOT_SIZE-1)
|
#define BONITO_BOOT_TOP (BONITO_BOOT_BASE + BONITO_BOOT_SIZE - 1)
|
||||||
#define BONITO_FLASH_BASE 0x1c000000
|
#define BONITO_FLASH_BASE 0x1c000000
|
||||||
#define BONITO_FLASH_SIZE 0x03000000
|
#define BONITO_FLASH_SIZE 0x03000000
|
||||||
#define BONITO_FLASH_TOP (BONITO_FLASH_BASE+BONITO_FLASH_SIZE-1)
|
#define BONITO_FLASH_TOP (BONITO_FLASH_BASE + BONITO_FLASH_SIZE - 1)
|
||||||
#define BONITO_SOCKET_BASE 0x1f800000
|
#define BONITO_SOCKET_BASE 0x1f800000
|
||||||
#define BONITO_SOCKET_SIZE 0x00400000
|
#define BONITO_SOCKET_SIZE 0x00400000
|
||||||
#define BONITO_SOCKET_TOP (BONITO_SOCKET_BASE+BONITO_SOCKET_SIZE-1)
|
#define BONITO_SOCKET_TOP (BONITO_SOCKET_BASE + BONITO_SOCKET_SIZE - 1)
|
||||||
#define BONITO_REG_BASE 0x1fe00000
|
#define BONITO_REG_BASE 0x1fe00000
|
||||||
#define BONITO_REG_SIZE 0x00040000
|
#define BONITO_REG_SIZE 0x00040000
|
||||||
#define BONITO_REG_TOP (BONITO_REG_BASE+BONITO_REG_SIZE-1)
|
#define BONITO_REG_TOP (BONITO_REG_BASE + BONITO_REG_SIZE - 1)
|
||||||
#define BONITO_DEV_BASE 0x1ff00000
|
#define BONITO_DEV_BASE 0x1ff00000
|
||||||
#define BONITO_DEV_SIZE 0x00100000
|
#define BONITO_DEV_SIZE 0x00100000
|
||||||
#define BONITO_DEV_TOP (BONITO_DEV_BASE+BONITO_DEV_SIZE-1)
|
#define BONITO_DEV_TOP (BONITO_DEV_BASE + BONITO_DEV_SIZE - 1)
|
||||||
#define BONITO_PCILO_BASE 0x10000000
|
#define BONITO_PCILO_BASE 0x10000000
|
||||||
#define BONITO_PCILO_BASE_VA 0xb0000000
|
#define BONITO_PCILO_BASE_VA 0xb0000000
|
||||||
#define BONITO_PCILO_SIZE 0x0c000000
|
#define BONITO_PCILO_SIZE 0x0c000000
|
||||||
#define BONITO_PCILO_TOP (BONITO_PCILO_BASE+BONITO_PCILO_SIZE-1)
|
#define BONITO_PCILO_TOP (BONITO_PCILO_BASE + BONITO_PCILO_SIZE - 1)
|
||||||
#define BONITO_PCILO0_BASE 0x10000000
|
#define BONITO_PCILO0_BASE 0x10000000
|
||||||
#define BONITO_PCILO1_BASE 0x14000000
|
#define BONITO_PCILO1_BASE 0x14000000
|
||||||
#define BONITO_PCILO2_BASE 0x18000000
|
#define BONITO_PCILO2_BASE 0x18000000
|
||||||
#define BONITO_PCIHI_BASE 0x20000000
|
#define BONITO_PCIHI_BASE 0x20000000
|
||||||
#define BONITO_PCIHI_SIZE 0x20000000
|
#define BONITO_PCIHI_SIZE 0x20000000
|
||||||
#define BONITO_PCIHI_TOP (BONITO_PCIHI_BASE+BONITO_PCIHI_SIZE-1)
|
#define BONITO_PCIHI_TOP (BONITO_PCIHI_BASE + BONITO_PCIHI_SIZE - 1)
|
||||||
#define BONITO_PCIIO_BASE 0x1fd00000
|
#define BONITO_PCIIO_BASE 0x1fd00000
|
||||||
#define BONITO_PCIIO_BASE_VA 0xbfd00000
|
#define BONITO_PCIIO_BASE_VA 0xbfd00000
|
||||||
#define BONITO_PCIIO_SIZE 0x00010000
|
#define BONITO_PCIIO_SIZE 0x00010000
|
||||||
#define BONITO_PCIIO_TOP (BONITO_PCIIO_BASE+BONITO_PCIIO_SIZE-1)
|
#define BONITO_PCIIO_TOP (BONITO_PCIIO_BASE + BONITO_PCIIO_SIZE - 1)
|
||||||
#define BONITO_PCICFG_BASE 0x1fe80000
|
#define BONITO_PCICFG_BASE 0x1fe80000
|
||||||
#define BONITO_PCICFG_SIZE 0x00080000
|
#define BONITO_PCICFG_SIZE 0x00080000
|
||||||
#define BONITO_PCICFG_TOP (BONITO_PCICFG_BASE+BONITO_PCICFG_SIZE-1)
|
#define BONITO_PCICFG_TOP (BONITO_PCICFG_BASE + BONITO_PCICFG_SIZE - 1)
|
||||||
|
|
||||||
|
|
||||||
#define BONITO_PCICONFIGBASE 0x00
|
#define BONITO_PCICONFIGBASE 0x00
|
||||||
#define BONITO_REGBASE 0x100
|
#define BONITO_REGBASE 0x100
|
||||||
|
|
||||||
#define BONITO_PCICONFIG_BASE (BONITO_PCICONFIGBASE+BONITO_REG_BASE)
|
#define BONITO_PCICONFIG_BASE (BONITO_PCICONFIGBASE + BONITO_REG_BASE)
|
||||||
#define BONITO_PCICONFIG_SIZE (0x100)
|
#define BONITO_PCICONFIG_SIZE (0x100)
|
||||||
|
|
||||||
#define BONITO_INTERNAL_REG_BASE (BONITO_REGBASE+BONITO_REG_BASE)
|
#define BONITO_INTERNAL_REG_BASE (BONITO_REGBASE + BONITO_REG_BASE)
|
||||||
#define BONITO_INTERNAL_REG_SIZE (0x70)
|
#define BONITO_INTERNAL_REG_SIZE (0x70)
|
||||||
|
|
||||||
#define BONITO_SPCICONFIG_BASE (BONITO_PCICFG_BASE)
|
#define BONITO_SPCICONFIG_BASE (BONITO_PCICFG_BASE)
|
||||||
|
@ -111,7 +112,7 @@
|
||||||
|
|
||||||
#define BONITO_BONPONCFG (0x00 >> 2) /* 0x100 */
|
#define BONITO_BONPONCFG (0x00 >> 2) /* 0x100 */
|
||||||
#define BONITO_BONGENCFG_OFFSET 0x4
|
#define BONITO_BONGENCFG_OFFSET 0x4
|
||||||
#define BONITO_BONGENCFG (BONITO_BONGENCFG_OFFSET>>2) /*0x104 */
|
#define BONITO_BONGENCFG (BONITO_BONGENCFG_OFFSET >> 2) /*0x104 */
|
||||||
|
|
||||||
/* 2. IO & IDE configuration */
|
/* 2. IO & IDE configuration */
|
||||||
#define BONITO_IODEVCFG (0x08 >> 2) /* 0x108 */
|
#define BONITO_IODEVCFG (0x08 >> 2) /* 0x108 */
|
||||||
|
@ -177,15 +178,15 @@
|
||||||
/* idsel BIT = pci slot number +12 */
|
/* idsel BIT = pci slot number +12 */
|
||||||
#define PCI_SLOT_BASE 12
|
#define PCI_SLOT_BASE 12
|
||||||
#define PCI_IDSEL_VIA686B_BIT (17)
|
#define PCI_IDSEL_VIA686B_BIT (17)
|
||||||
#define PCI_IDSEL_VIA686B (1<<PCI_IDSEL_VIA686B_BIT)
|
#define PCI_IDSEL_VIA686B (1 << PCI_IDSEL_VIA686B_BIT)
|
||||||
|
|
||||||
#define PCI_ADDR(busno,devno,funno,regno) \
|
#define PCI_ADDR(busno , devno , funno , regno) \
|
||||||
((((busno)<<16)&0xff0000) + (((devno)<<11)&0xf800) + (((funno)<<8)&0x700) + (regno))
|
((((busno) << 16) & 0xff0000) + (((devno) << 11) & 0xf800) + \
|
||||||
|
(((funno) << 8) & 0x700) + (regno))
|
||||||
|
|
||||||
typedef struct BonitoState BonitoState;
|
typedef struct BonitoState BonitoState;
|
||||||
|
|
||||||
typedef struct PCIBonitoState
|
typedef struct PCIBonitoState {
|
||||||
{
|
|
||||||
PCIDevice dev;
|
PCIDevice dev;
|
||||||
|
|
||||||
BonitoState *pcihost;
|
BonitoState *pcihost;
|
||||||
|
@ -239,7 +240,8 @@ static void bonito_writel(void *opaque, hwaddr addr,
|
||||||
|
|
||||||
saddr = addr >> 2;
|
saddr = addr >> 2;
|
||||||
|
|
||||||
DPRINTF("bonito_writel "TARGET_FMT_plx" val %x saddr %x\n", addr, val, saddr);
|
DPRINTF("bonito_writel "TARGET_FMT_plx" val %x saddr %x\n",
|
||||||
|
addr, val, saddr);
|
||||||
switch (saddr) {
|
switch (saddr) {
|
||||||
case BONITO_BONPONCFG:
|
case BONITO_BONPONCFG:
|
||||||
case BONITO_IODEVCFG:
|
case BONITO_IODEVCFG:
|
||||||
|
@ -363,7 +365,7 @@ static uint64_t bonito_ldma_readl(void *opaque, hwaddr addr,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
val = ((uint32_t *)(&s->bonldma))[addr/sizeof(uint32_t)];
|
val = ((uint32_t *)(&s->bonldma))[addr / sizeof(uint32_t)];
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
@ -377,7 +379,7 @@ static void bonito_ldma_writel(void *opaque, hwaddr addr,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
((uint32_t *)(&s->bonldma))[addr/sizeof(uint32_t)] = val & 0xffffffff;
|
((uint32_t *)(&s->bonldma))[addr / sizeof(uint32_t)] = val & 0xffffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const MemoryRegionOps bonito_ldma_ops = {
|
static const MemoryRegionOps bonito_ldma_ops = {
|
||||||
|
@ -400,7 +402,7 @@ static uint64_t bonito_cop_readl(void *opaque, hwaddr addr,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
val = ((uint32_t *)(&s->boncop))[addr/sizeof(uint32_t)];
|
val = ((uint32_t *)(&s->boncop))[addr / sizeof(uint32_t)];
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
@ -414,7 +416,7 @@ static void bonito_cop_writel(void *opaque, hwaddr addr,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
((uint32_t *)(&s->boncop))[addr/sizeof(uint32_t)] = val & 0xffffffff;
|
((uint32_t *)(&s->boncop))[addr / sizeof(uint32_t)] = val & 0xffffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const MemoryRegionOps bonito_cop_ops = {
|
static const MemoryRegionOps bonito_cop_ops = {
|
||||||
|
@ -446,7 +448,8 @@ static uint32_t bonito_sbridge_pciaddr(void *opaque, hwaddr addr)
|
||||||
cfgaddr = addr & 0xffff;
|
cfgaddr = addr & 0xffff;
|
||||||
cfgaddr |= (s->regs[BONITO_PCIMAP_CFG] & 0xffff) << 16;
|
cfgaddr |= (s->regs[BONITO_PCIMAP_CFG] & 0xffff) << 16;
|
||||||
|
|
||||||
idsel = (cfgaddr & BONITO_PCICONF_IDSEL_MASK) >> BONITO_PCICONF_IDSEL_OFFSET;
|
idsel = (cfgaddr & BONITO_PCICONF_IDSEL_MASK) >>
|
||||||
|
BONITO_PCICONF_IDSEL_OFFSET;
|
||||||
devno = ctz32(idsel);
|
devno = ctz32(idsel);
|
||||||
funno = (cfgaddr & BONITO_PCICONF_FUN_MASK) >> BONITO_PCICONF_FUN_OFFSET;
|
funno = (cfgaddr & BONITO_PCICONF_FUN_MASK) >> BONITO_PCICONF_FUN_OFFSET;
|
||||||
regno = (cfgaddr & BONITO_PCICONF_REG_MASK) >> BONITO_PCICONF_REG_OFFSET;
|
regno = (cfgaddr & BONITO_PCICONF_REG_MASK) >> BONITO_PCICONF_REG_OFFSET;
|
||||||
|
@ -550,7 +553,7 @@ static void pci_bonito_set_irq(void *opaque, int irq_num, int level)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* map the original irq (0~3) to bonito irq (16~47, but 16~31 are unused) */
|
/* map the original irq (0~3) to bonito irq (16~47, but 16~31 are unused) */
|
||||||
static int pci_bonito_map_irq(PCIDevice * pci_dev, int irq_num)
|
static int pci_bonito_map_irq(PCIDevice *pci_dev, int irq_num)
|
||||||
{
|
{
|
||||||
int slot;
|
int slot;
|
||||||
|
|
||||||
|
@ -618,7 +621,10 @@ static void bonito_realize(PCIDevice *dev, Error **errp)
|
||||||
SysBusDevice *sysbus = SYS_BUS_DEVICE(s->pcihost);
|
SysBusDevice *sysbus = SYS_BUS_DEVICE(s->pcihost);
|
||||||
PCIHostState *phb = PCI_HOST_BRIDGE(s->pcihost);
|
PCIHostState *phb = PCI_HOST_BRIDGE(s->pcihost);
|
||||||
|
|
||||||
/* Bonito North Bridge, built on FPGA, VENDOR_ID/DEVICE_ID are "undefined" */
|
/*
|
||||||
|
* Bonito North Bridge, built on FPGA,
|
||||||
|
* VENDOR_ID/DEVICE_ID are "undefined"
|
||||||
|
*/
|
||||||
pci_config_set_prog_interface(dev->config, 0x00);
|
pci_config_set_prog_interface(dev->config, 0x00);
|
||||||
|
|
||||||
/* set the north bridge register mapping */
|
/* set the north bridge register mapping */
|
||||||
|
|
|
@ -261,6 +261,11 @@ The 'scsi-disk' device is deprecated. Users should use 'scsi-hd' or
|
||||||
|
|
||||||
@section System emulator machines
|
@section System emulator machines
|
||||||
|
|
||||||
|
@subsection mips r4k platform (since 4.2)
|
||||||
|
|
||||||
|
This machine type is very old and unmaintained. Users should use the 'malta'
|
||||||
|
machine type instead.
|
||||||
|
|
||||||
@subsection pc-0.12, pc-0.13, pc-0.14 and pc-0.15 (since 4.0)
|
@subsection pc-0.12, pc-0.13, pc-0.14 and pc-0.15 (since 4.0)
|
||||||
|
|
||||||
These machine types are very old and likely can not be used for live migration
|
These machine types are very old and likely can not be used for live migration
|
||||||
|
|
|
@ -99,10 +99,12 @@ class LinuxSSH(Test):
|
||||||
def ssh_command(self, command, is_root=True):
|
def ssh_command(self, command, is_root=True):
|
||||||
self.ssh_logger.info(command)
|
self.ssh_logger.info(command)
|
||||||
result = self.ssh_session.cmd(command)
|
result = self.ssh_session.cmd(command)
|
||||||
stdout_lines = [line.rstrip() for line in result.stdout_text.splitlines()]
|
stdout_lines = [line.rstrip() for line
|
||||||
|
in result.stdout_text.splitlines()]
|
||||||
for line in stdout_lines:
|
for line in stdout_lines:
|
||||||
self.ssh_logger.info(line)
|
self.ssh_logger.info(line)
|
||||||
stderr_lines = [line.rstrip() for line in result.stderr_text.splitlines()]
|
stderr_lines = [line.rstrip() for line
|
||||||
|
in result.stderr_text.splitlines()]
|
||||||
for line in stderr_lines:
|
for line in stderr_lines:
|
||||||
self.ssh_logger.warning(line)
|
self.ssh_logger.warning(line)
|
||||||
return stdout_lines, stderr_lines
|
return stdout_lines, stderr_lines
|
||||||
|
|
Loading…
Reference in a new issue