From: "Hervé Poussineau" <hpoussin@reactos.org>
To: qemu-devel@nongnu.org
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
"Hervé Poussineau" <hpoussin@reactos.org>,
"Michael S. Tsirkin" <mst@redhat.com>
Subject: [Qemu-devel] [PATCH 05/17] i8257: make the DMA running method per controller
Date: Tue, 29 Dec 2015 09:04:42 +0100 [thread overview]
Message-ID: <1451376295-28834-6-git-send-email-hpoussin@reactos.org> (raw)
In-Reply-To: <1451376295-28834-1-git-send-email-hpoussin@reactos.org>
This removes some static/global variables, and we're now running only the
required controller (master or slave)
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/dma/i8257.c | 75 ++++++++++++++++++++++++++--------------------------------
1 file changed, 34 insertions(+), 41 deletions(-)
diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c
index aba4295..a3227a1 100644
--- a/hw/dma/i8257.c
+++ b/hw/dma/i8257.c
@@ -61,6 +61,10 @@ typedef struct I8257State {
struct dma_regs regs[4];
MemoryRegion channel_io;
MemoryRegion cont_io;
+
+ QEMUBH *dma_bh;
+ bool dma_bh_scheduled;
+ int running;
} I8257State;
static I8257State dma_controllers[2];
@@ -80,7 +84,7 @@ enum {
};
-static void i8257_dma_run(void);
+static void i8257_dma_run(void *opaque);
static int channels[8] = {-1, 2, 3, 1, -1, -1, -1, 0};
@@ -220,7 +224,7 @@ static void i8257_write_cont(void *opaque, hwaddr nport, uint64_t data,
d->status &= ~(1 << (ichan + 4));
}
d->status &= ~(1 << ichan);
- i8257_dma_run();
+ i8257_dma_run(d);
break;
case 0x02: /* single mask */
@@ -228,7 +232,7 @@ static void i8257_write_cont(void *opaque, hwaddr nport, uint64_t data,
d->mask |= 1 << (data & 3);
else
d->mask &= ~(1 << (data & 3));
- i8257_dma_run();
+ i8257_dma_run(d);
break;
case 0x03: /* mode */
@@ -263,12 +267,12 @@ static void i8257_write_cont(void *opaque, hwaddr nport, uint64_t data,
case 0x06: /* clear mask for all channels */
d->mask = 0;
- i8257_dma_run();
+ i8257_dma_run(d);
break;
case 0x07: /* write mask for all channels */
d->mask = data;
- i8257_dma_run();
+ i8257_dma_run(d);
break;
default:
@@ -320,7 +324,7 @@ void DMA_hold_DREQ (int nchan)
ichan = nchan & 3;
linfo ("held cont=%d chan=%d\n", ncont, ichan);
dma_controllers[ncont].status |= 1 << (ichan + 4);
- i8257_dma_run();
+ i8257_dma_run(&dma_controllers[ncont]);
}
void DMA_release_DREQ (int nchan)
@@ -331,13 +335,14 @@ void DMA_release_DREQ (int nchan)
ichan = nchan & 3;
linfo ("released cont=%d chan=%d\n", ncont, ichan);
dma_controllers[ncont].status &= ~(1 << (ichan + 4));
- i8257_dma_run();
+ i8257_dma_run(&dma_controllers[ncont]);
}
-static void i8257_channel_run(int ncont, int ichan)
+static void i8257_channel_run(I8257State *d, int ichan)
{
+ int ncont = d->dshift;
int n;
- struct dma_regs *r = &dma_controllers[ncont].regs[ichan];
+ struct dma_regs *r = &d->regs[ichan];
#ifdef DEBUG_DMA
int dir, opmode;
@@ -358,52 +363,38 @@ static void i8257_channel_run(int ncont, int ichan)
ldebug ("dma_pos %d size %d\n", n, (r->base[COUNT] + 1) << ncont);
}
-static QEMUBH *dma_bh;
-static bool dma_bh_scheduled;
-
-static void i8257_dma_run(void)
+static void i8257_dma_run(void *opaque)
{
- I8257State *d;
- int icont, ichan;
+ I8257State *d = opaque;
+ int ichan;
int rearm = 0;
- static int running = 0;
- if (running) {
+ if (d->running) {
rearm = 1;
goto out;
} else {
- running = 1;
+ d->running = 1;
}
- d = dma_controllers;
-
- for (icont = 0; icont < 2; icont++, d++) {
- for (ichan = 0; ichan < 4; ichan++) {
- int mask;
+ for (ichan = 0; ichan < 4; ichan++) {
+ int mask;
- mask = 1 << ichan;
+ mask = 1 << ichan;
- if ((0 == (d->mask & mask)) && (0 != (d->status & (mask << 4)))) {
- i8257_channel_run(icont, ichan);
- rearm = 1;
- }
+ if ((0 == (d->mask & mask)) && (0 != (d->status & (mask << 4)))) {
+ i8257_channel_run(d, ichan);
+ rearm = 1;
}
}
- running = 0;
+ d->running = 0;
out:
if (rearm) {
- qemu_bh_schedule_idle(dma_bh);
- dma_bh_scheduled = true;
+ qemu_bh_schedule_idle(d->dma_bh);
+ d->dma_bh_scheduled = true;
}
}
-static void i8257_dma_run_bh(void *unused)
-{
- dma_bh_scheduled = false;
- i8257_dma_run();
-}
-
void DMA_register_channel (int nchan,
DMA_transfer_handler transfer_handler,
void *opaque)
@@ -468,7 +459,8 @@ int DMA_write_memory (int nchan, void *buf, int pos, int len)
*/
void DMA_schedule(void)
{
- if (dma_bh_scheduled) {
+ if (dma_controllers[0].dma_bh_scheduled ||
+ dma_controllers[1].dma_bh_scheduled) {
qemu_notify_event();
}
}
@@ -551,6 +543,8 @@ static void dma_init2(I8257State *d, int base, int dshift,
for (i = 0; i < ARRAY_SIZE (d->regs); ++i) {
d->regs[i].transfer_handler = i8257_phony_handler;
}
+
+ d->dma_bh = qemu_bh_new(i8257_dma_run, d);
}
static const VMStateDescription vmstate_dma_regs = {
@@ -571,7 +565,8 @@ static const VMStateDescription vmstate_dma_regs = {
static int i8257_post_load(void *opaque, int version_id)
{
- i8257_dma_run();
+ I8257State *d = opaque;
+ i8257_dma_run(d);
return 0;
}
@@ -598,6 +593,4 @@ void DMA_init(ISABus *bus, int high_page_enable)
dma_init2(&dma_controllers[1], 0xc0, 1, 0x88, high_page_enable ? 0x488 : -1);
vmstate_register (NULL, 0, &vmstate_dma, &dma_controllers[0]);
vmstate_register (NULL, 1, &vmstate_dma, &dma_controllers[1]);
-
- dma_bh = qemu_bh_new(i8257_dma_run_bh, NULL);
}
--
2.1.4
next prev parent reply other threads:[~2015-12-29 8:05 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-29 8:04 [Qemu-devel] [PATCH 00/17] ISA DMA controllers cleanup (i8257, i82374) Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 01/17] i82374: device only existed as ISA device, so simplify device Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 02/17] i8257: pass ISA bus to DMA_init() function Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 03/17] i8257: rename struct dma_cont to I8257State Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 04/17] i8257: rename functions to start with i8257_ prefix Hervé Poussineau
2015-12-29 8:04 ` Hervé Poussineau [this message]
2015-12-29 8:04 ` [Qemu-devel] [PATCH 06/17] i8257: add missing const Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 07/17] i8257: QOM'ify Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 08/17] isa: add an ISA DMA interface, and store it within the ISA bus Hervé Poussineau
2016-01-05 23:49 ` John Snow
2015-12-29 8:04 ` [Qemu-devel] [PATCH 09/17] i8257: implement the IsaDma interface Hervé Poussineau
2016-01-05 21:59 ` John Snow
2015-12-29 8:04 ` [Qemu-devel] [PATCH 09/17] i8257: register " Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 10/17] magnum: disable floppy DMA for now Hervé Poussineau
2016-01-05 22:02 ` John Snow
2015-12-29 8:04 ` [Qemu-devel] [PATCH 11/17] sparc: disable floppy DMA Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 12/17] sparc64: " Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 13/17] fdc: use IsaDma interface instead of global DMA_* functions Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 14/17] cs4231a: " Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 15/17] gus: " Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 16/17] sb16: " Hervé Poussineau
2015-12-29 8:04 ` [Qemu-devel] [PATCH 17/17] dma: remove now useless " Hervé Poussineau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1451376295-28834-6-git-send-email-hpoussin@reactos.org \
--to=hpoussin@reactos.org \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).