mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Magnus Damm" <magnus.damm@gmail.com>
To: "Adrian McMenamin" <adrian@newgolddream.dyndns.info>
Cc: linux-sh@vger.kernel.org,
	"Paul Mundt" <lethal@users.sourceforge.net>,
	matsu@igel.co.jp, LKML <linux-kernel@vger.kernel.org>
Subject: Re: Current git very broken on the Dreamcast
Date: Mon, 18 Feb 2008 17:57:05 +0900	[thread overview]
Message-ID: <aec7e5c30802180057k76050c02wfe3790cf379f7d5f@mail.gmail.com> (raw)
In-Reply-To: <1203191304.6737.5.camel@localhost.localdomain>

[-- Attachment #1: Type: text/plain, Size: 2976 bytes --]

Hi Adrian,

[fixed up Matsubara-sans address]

On Feb 17, 2008 4:48 AM, Adrian McMenamin
<adrian@newgolddream.dyndns.info> wrote:
> On Sat, 2008-02-16 at 18:38 +0000, Adrian McMenamin wrote:
> > Will seek to bisect this, but I have just updated my sources to the
> > latest git and it is not booting at all on the Dreamcast.
> >
> > With early printk on, I get nothing more than this before an instant
> > reboot:
> >
> > [    0.000000] Linux version 2.6.25-rc2-10953-g52065cd
> > (adrian@bossclass) (gcc version 3.4.6) #511 PREEMPT Sat Feb 16 18:31:43
> > GMT 2008
> > [    0.000000] console [sercon0] enabled
> > [    0.000000] Booting machvec: Sega Dreamcast
>
>
> adrian@bossclass:~/gdrom-dev$ git bisect good
> e036eaa681a17f71b64f6d9040fe605555623919 is first bad commit
> commit e036eaa681a17f71b64f6d9040fe605555623919
> Author: Magnus Damm <magnus.damm@gmail.com>
> Date:   Thu Feb 14 13:52:43 2008 +0900
>
>     sh: use ctrl_in/out for on chip pci access
>
>     This patch makes sure ctrl_inN/outN are used instead of inN/outN for
> on chip
>     pci registers. Without this patch addresses may be adjusted using
> the value
>     in generic_io_base. This patch makes it possible to set
> generic_io_base and
>     have pci without reading and writing all over the place.
>
>     Signed-off-by: Magnus Damm <damm@igel.co.jp>
>     Acked-by: Katsuya MATSUBARA <matsu@igel.co.jp>
>     Signed-off-by: Paul Mundt <lethal@linux-sh.org>
>
> :040000 040000 17a9f8181301e3a082d8a1a2fdef9b13ff1185e4
> 87e4a2e912be56b0d12e8a92db9489d6615c31f7 M      arch

Thanks for tracking this down and sorry for breaking the dreamcast pci driver.

Most code for the dreamcast currently do direct register access using
ctrl_inN/outN or readN/writeN. Only a few places use inN/outN and
depend on the value of generic_io_base. Doing inN/outN is ok (but
outdated, use ioreadN/iowriteN instead) in a portable pci/isa driver,
but it doesn't make sense for any dreamcast specific code to rely on
generic_io_base. For the dreamcast we already know the address at
compile time so doing adjustment during runtime is just unnecessary
overhead.

It is of course possible to revert the dreamcast-specific bits of the
commit you pointed out, but I think the change for the dreamcast makes
sense since it makes the code both faster and more uniform.

However, at this point it is broken. Sorry about that. I just looked
through all upstream dreamcast-specific code I could find and irq.c is
now the only file that does inN/outN. I've attached a patch that makes
the irq code independent of generic_io_base. There is also another
patch attached that adjusts the addresses of the pci register.
Together they should solve the problem you are seeing. Please try them
on top of 2.6.25-rc2.

With these patches io ports count from 0 -> 8k-1 instead of being a
pointer. We currently rely on generic_io_base logic but that will be
changed in the future.

Please let me know the results. Thank you.

/ magnus

[-- Attachment #2: linux-2.6.25-rc2-sh-dreamcast-irq-20080218.patch --]
[-- Type: application/octet-stream, Size: 2260 bytes --]

--- 0001/arch/sh/boards/dreamcast/irq.c
+++ work/arch/sh/boards/dreamcast/irq.c	2008-02-18 17:02:08.000000000 +0900
@@ -12,6 +12,7 @@
 #include <linux/irq.h>
 #include <asm/io.h>
 #include <asm/irq.h>
+#include <asm/addrspace.h>
 #include <asm/dreamcast/sysasic.h>
 
 /* Dreamcast System ASIC Hardware Events -
@@ -40,8 +41,8 @@
 
 */
 
-#define ESR_BASE 0x005f6900    /* Base event status register */
-#define EMR_BASE 0x005f6910    /* Base event mask register */
+#define ESR_BASE P2SEGADDR(0x005f6900)    /* Base event status register */
+#define EMR_BASE P2SEGADDR(0x005f6910)    /* Base event mask register */
 
 /* Helps us determine the EMR group that this event belongs to: 0 = 0x6910,
    1 = 0x6920, 2 = 0x6930; also determine the event offset */
@@ -59,9 +60,9 @@ static inline void disable_systemasic_ir
         __u32 emr = EMR_BASE + (LEVEL(irq) << 4) + (LEVEL(irq) << 2);
         __u32 mask;
 
-        mask = inl(emr);
+        mask = ctrl_inl(emr);
         mask &= ~(1 << EVENT_BIT(irq));
-        outl(mask, emr);
+        ctrl_outl(mask, emr);
 }
 
 /* Enable the hardware event by setting its bit in its EMR */
@@ -70,9 +71,9 @@ static inline void enable_systemasic_irq
         __u32 emr = EMR_BASE + (LEVEL(irq) << 4) + (LEVEL(irq) << 2);
         __u32 mask;
 
-        mask = inl(emr);
+        mask = ctrl_inl(emr);
         mask |= (1 << EVENT_BIT(irq));
-        outl(mask, emr);
+        ctrl_outl(mask, emr);
 }
 
 /* Acknowledge a hardware event by writing its bit back to its ESR */
@@ -80,7 +81,7 @@ static void ack_systemasic_irq(unsigned 
 {
         __u32 esr = ESR_BASE + (LEVEL(irq) << 2);
         disable_systemasic_irq(irq);
-        outl((1 << EVENT_BIT(irq)), esr);
+        ctrl_outl((1 << EVENT_BIT(irq)), esr);
 }
 
 /* After a IRQ has been ack'd and responded to, it needs to be renabled */
@@ -137,8 +138,8 @@ int systemasic_irq_demux(int irq)
         esr = ESR_BASE + (level << 2);
 
         /* Mask the ESR to filter any spurious, unwanted interrupts */
-        status = inl(esr);
-        status &= inl(emr);
+        status = ctrl_inl(esr);
+        status &= ctrl_inl(emr);
 
         /* Now scan and find the first set bit as the event to map */
         for (bit = 1, j = 0; j < 32; bit <<= 1, j++) {

[-- Attachment #3: linux-2.6.25-rc2-sh-dreamcast-pci-20080218b.patch --]
[-- Type: application/octet-stream, Size: 1668 bytes --]

--- 0001/arch/sh/boards/dreamcast/setup.c
+++ work/arch/sh/boards/dreamcast/setup.c	2008-02-18 17:05:45.000000000 +0900
@@ -43,8 +43,6 @@ static void __init dreamcast_setup(char 
 	/* Acknowledge any previous events */
 	/* XXX */
 
-	__set_io_port_base(0xa0000000);
-
 	/* Assign all virtual IRQs to the System ASIC int. handler */
 	for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++)
 		irq_desc[i].chip = &systemasic_int;
--- 0001/arch/sh/drivers/pci/ops-dreamcast.c
+++ work/arch/sh/drivers/pci/ops-dreamcast.c	2008-02-18 17:06:19.000000000 +0900
@@ -29,8 +29,8 @@
 
 static struct resource gapspci_io_resource = {
 	.name	= "GAPSPCI IO",
-	.start	= GAPSPCI_BBA_CONFIG,
-	.end	= GAPSPCI_BBA_CONFIG + GAPSPCI_BBA_CONFIG_SIZE - 1,
+	.start	= 0,
+	.end	= GAPSPCI_BBA_CONFIG_SIZE - 1,
 	.flags	= IORESOURCE_IO,
 };
 
@@ -158,6 +158,8 @@ int __init gapspci_init(void)
 	ctrl_outl(0x00002001, GAPSPCI_BBA_CONFIG+0x10);
 	ctrl_outl(0x01000000, GAPSPCI_BBA_CONFIG+0x14);
 
+	__set_io_port_base(GAPSPCI_BBA_CONFIG);
+
 	return 0;
 }
 
--- 0001/include/asm-sh/dreamcast/pci.h
+++ work/include/asm-sh/dreamcast/pci.h	2008-02-18 17:18:10.000000000 +0900
@@ -11,12 +11,13 @@
 #ifndef __ASM_SH_DREAMCAST_PCI_H
 #define __ASM_SH_DREAMCAST_PCI_H
 
+#include <asm/addrspace.h>
 #include <asm/mach/sysasic.h>
 
-#define	GAPSPCI_REGS		0x01001400
-#define GAPSPCI_DMA_BASE	0x01840000
+#define GAPSPCI_REGS		P2SEGADDR(0x01001400)
+#define GAPSPCI_DMA_BASE	P2SEGADDR(0x01840000)
 #define GAPSPCI_DMA_SIZE	32768
-#define GAPSPCI_BBA_CONFIG	0x01001600
+#define GAPSPCI_BBA_CONFIG	P2SEGADDR(0x01001600)
 #define GAPSPCI_BBA_CONFIG_SIZE	0x2000
 
 #define	GAPSPCI_IRQ		HW_EVENT_EXTERNAL

  parent reply	other threads:[~2008-02-18  8:57 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-16 18:38 Adrian McMenamin
2008-02-16 19:48 ` Adrian McMenamin
2008-02-16 19:59   ` Adrian McMenamin
2008-02-17 19:42     ` Kristoffer Ericson
2008-02-17 19:55     ` Kristoffer Ericson
2008-02-18  8:57   ` Magnus Damm [this message]
2008-02-18 20:11     ` Adrian McMenamin
2008-02-17 19:40 ` Kristoffer Ericson

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=aec7e5c30802180057k76050c02wfe3790cf379f7d5f@mail.gmail.com \
    --to=magnus.damm@gmail.com \
    --cc=adrian@newgolddream.dyndns.info \
    --cc=lethal@users.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=matsu@igel.co.jp \
    /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

all inboxes | Powered by JetHome®