Message ID | 1386159055-10264-2-git-send-email-oliver@schinagl.nl |
---|---|
State | Not Applicable |
Delegated to: | David Miller |
Headers | show |
On Wed, Dec 04, 2013 at 01:10:53PM +0100, oliver@schinagl.nl wrote: > From: Oliver Schinagl <oliver@schinagl.nl> > > The Allwinner sunxi platforms have patched in the following to enable > DMA. This patch enables DMA controllers for the SUNXI Architecture. > > Signed-off-by: Olliver Schinagl <oliver@schinagl.nl> > --- > drivers/ata/ahci.h | 6 ++++++ > drivers/ata/libahci.c | 8 ++++++++ > 2 files changed, 14 insertions(+) > > diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h > index 2289efdf..2bf2423 100644 > --- a/drivers/ata/ahci.h > +++ b/drivers/ata/ahci.h > @@ -138,6 +138,7 @@ enum { > PORT_SCR_NTF = 0x3c, /* SATA phy register: SNotification */ > PORT_FBS = 0x40, /* FIS-based Switching */ > PORT_DEVSLP = 0x44, /* device sleep */ > + PORT_DMA = 0x70, /* direct memory access */ > > /* PORT_IRQ_{STAT,MASK} bits */ > PORT_IRQ_COLD_PRES = (1 << 31), /* cold presence detect */ > @@ -209,6 +210,11 @@ enum { > PORT_DEVSLP_DSP = (1 << 1), /* DevSlp present */ > PORT_DEVSLP_ADSE = (1 << 0), /* Aggressive DevSlp enable */ > > + /* PORT_DMA bits */ > + PORT_DMA_SETUP_OFFSET = 8, /* dma setup offset */ > + PORT_DMA_SETUP_MASK = (0xff << PORT_DMA_SETUP_OFFSET),/* dma mask */ > + PORT_DMA_SETUP_INIT = (0x44 << 0), Ummm... this doesn't belong to ahci proper, right? > + > /* hpriv->flags bits */ > > #define AHCI_HFLAGS(flags) .private_data = (void *)(flags) > diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c > index c482f8c..d697a74 100644 > --- a/drivers/ata/libahci.c > +++ b/drivers/ata/libahci.c > @@ -570,6 +570,14 @@ void ahci_start_engine(struct ata_port *ap) > void __iomem *port_mmio = ahci_port_base(ap); > u32 tmp; > > +#ifdef CONFIG_ARCH_SUNXI > + /* Setup DMA before DMA start */ > + tmp = readl(port_mmio + PORT_DMA); > + tmp &= ~PORT_DMA_SETUP_MASK; > + tmp |= PORT_DMA_SETUP_INIT << PORT_DMA_SETUP_OFFSET; > + writel(tmp, port_mmio + PORT_DMA); > +#endif If this is something platform device specific, wouldn't overriding ->port_start() which wraps around ahci_port_start() make more sense? Thanks.
Hey Tejun Heo, On 04-12-13 13:32, Tejun Heo wrote: > On Wed, Dec 04, 2013 at 01:10:53PM +0100, oliver@schinagl.nl wrote: >> From: Oliver Schinagl <oliver@schinagl.nl> >> >> The Allwinner sunxi platforms have patched in the following to enable >> DMA. This patch enables DMA controllers for the SUNXI Architecture. >> >> Signed-off-by: Olliver Schinagl <oliver@schinagl.nl> >> --- >> drivers/ata/ahci.h | 6 ++++++ >> drivers/ata/libahci.c | 8 ++++++++ >> 2 files changed, 14 insertions(+) >> >> diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h >> index 2289efdf..2bf2423 100644 >> --- a/drivers/ata/ahci.h >> +++ b/drivers/ata/ahci.h >> @@ -138,6 +138,7 @@ enum { >> PORT_SCR_NTF = 0x3c, /* SATA phy register: SNotification */ >> PORT_FBS = 0x40, /* FIS-based Switching */ >> PORT_DEVSLP = 0x44, /* device sleep */ >> + PORT_DMA = 0x70, /* direct memory access */ >> >> /* PORT_IRQ_{STAT,MASK} bits */ >> PORT_IRQ_COLD_PRES = (1 << 31), /* cold presence detect */ >> @@ -209,6 +210,11 @@ enum { >> PORT_DEVSLP_DSP = (1 << 1), /* DevSlp present */ >> PORT_DEVSLP_ADSE = (1 << 0), /* Aggressive DevSlp enable */ >> >> + /* PORT_DMA bits */ >> + PORT_DMA_SETUP_OFFSET = 8, /* dma setup offset */ >> + PORT_DMA_SETUP_MASK = (0xff << PORT_DMA_SETUP_OFFSET),/* dma mask */ >> + PORT_DMA_SETUP_INIT = (0x44 << 0), > Ummm... this doesn't belong to ahci proper, right? I have no idea why Allwinner added that and what it really does. We have no documentation, only code drops. I had high hopes someone around here knows what it could mean and where it does belong. > >> + >> /* hpriv->flags bits */ >> >> #define AHCI_HFLAGS(flags) .private_data = (void *)(flags) >> diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c >> index c482f8c..d697a74 100644 >> --- a/drivers/ata/libahci.c >> +++ b/drivers/ata/libahci.c >> @@ -570,6 +570,14 @@ void ahci_start_engine(struct ata_port *ap) >> void __iomem *port_mmio = ahci_port_base(ap); >> u32 tmp; >> >> +#ifdef CONFIG_ARCH_SUNXI >> + /* Setup DMA before DMA start */ >> + tmp = readl(port_mmio + PORT_DMA); >> + tmp &= ~PORT_DMA_SETUP_MASK; >> + tmp |= PORT_DMA_SETUP_INIT << PORT_DMA_SETUP_OFFSET; >> + writel(tmp, port_mmio + PORT_DMA); >> +#endif > If this is something platform device specific, wouldn't overriding > ->port_start() which wraps around ahci_port_start() make more sense? Again, I don't know, this is where Allwinner had put it. We don't even know who's IP they use. I'm happy to start experimenting moving this around a bit and will take your clue to figure out what you mean and if it could work. Oliver > > Thanks. > -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hello. On 04-12-2013 16:10, oliver@schinagl.nl wrote: > From: Oliver Schinagl <oliver@schinagl.nl> > The Allwinner sunxi platforms have patched in the following to enable > DMA. This patch enables DMA controllers for the SUNXI Architecture. > Signed-off-by: Olliver Schinagl <oliver@schinagl.nl> > --- > drivers/ata/ahci.h | 6 ++++++ > drivers/ata/libahci.c | 8 ++++++++ > 2 files changed, 14 insertions(+) > diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h > index 2289efdf..2bf2423 100644 > --- a/drivers/ata/ahci.h > +++ b/drivers/ata/ahci.h [...] > @@ -209,6 +210,11 @@ enum { > PORT_DEVSLP_DSP = (1 << 1), /* DevSlp present */ > PORT_DEVSLP_ADSE = (1 << 0), /* Aggressive DevSlp enable */ > > + /* PORT_DMA bits */ > + PORT_DMA_SETUP_OFFSET = 8, /* dma setup offset */ > + PORT_DMA_SETUP_MASK = (0xff << PORT_DMA_SETUP_OFFSET),/* dma mask */ > + PORT_DMA_SETUP_INIT = (0x44 << 0), Why not shift it right by PORT_DMA_SETUP_OFFSET if you do it in the next file anyway? [...] > diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c > index c482f8c..d697a74 100644 > --- a/drivers/ata/libahci.c > +++ b/drivers/ata/libahci.c > @@ -570,6 +570,14 @@ void ahci_start_engine(struct ata_port *ap) > void __iomem *port_mmio = ahci_port_base(ap); > u32 tmp; > > +#ifdef CONFIG_ARCH_SUNXI > + /* Setup DMA before DMA start */ > + tmp = readl(port_mmio + PORT_DMA); > + tmp &= ~PORT_DMA_SETUP_MASK; > + tmp |= PORT_DMA_SETUP_INIT << PORT_DMA_SETUP_OFFSET; > + writel(tmp, port_mmio + PORT_DMA); > +#endif > + I don't think #ifdef is appropriate here. WBR, Sergei -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 04-12-13 13:47, Sergei Shtylyov wrote: > Hello. > > On 04-12-2013 16:10, oliver@schinagl.nl wrote: > >> From: Oliver Schinagl <oliver@schinagl.nl> > >> The Allwinner sunxi platforms have patched in the following to enable >> DMA. This patch enables DMA controllers for the SUNXI Architecture. > >> Signed-off-by: Olliver Schinagl <oliver@schinagl.nl> >> --- >> drivers/ata/ahci.h | 6 ++++++ >> drivers/ata/libahci.c | 8 ++++++++ >> 2 files changed, 14 insertions(+) > >> diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h >> index 2289efdf..2bf2423 100644 >> --- a/drivers/ata/ahci.h >> +++ b/drivers/ata/ahci.h > [...] >> @@ -209,6 +210,11 @@ enum { >> PORT_DEVSLP_DSP = (1 << 1), /* DevSlp present */ >> PORT_DEVSLP_ADSE = (1 << 0), /* Aggressive DevSlp >> enable */ >> >> + /* PORT_DMA bits */ >> + PORT_DMA_SETUP_OFFSET = 8, /* dma setup offset */ >> + PORT_DMA_SETUP_MASK = (0xff << PORT_DMA_SETUP_OFFSET),/* dma >> mask */ >> + PORT_DMA_SETUP_INIT = (0x44 << 0), > > Why not shift it right by PORT_DMA_SETUP_OFFSET if you do it in the > next file anyway? Verbosity and clarity I suppose, try to reduce the number of magic values. I don't know what the preferred way is as we know so little about the IP. > > [...] >> diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c >> index c482f8c..d697a74 100644 >> --- a/drivers/ata/libahci.c >> +++ b/drivers/ata/libahci.c >> @@ -570,6 +570,14 @@ void ahci_start_engine(struct ata_port *ap) >> void __iomem *port_mmio = ahci_port_base(ap); >> u32 tmp; >> >> +#ifdef CONFIG_ARCH_SUNXI >> + /* Setup DMA before DMA start */ >> + tmp = readl(port_mmio + PORT_DMA); >> + tmp &= ~PORT_DMA_SETUP_MASK; >> + tmp |= PORT_DMA_SETUP_INIT << PORT_DMA_SETUP_OFFSET; >> + writel(tmp, port_mmio + PORT_DMA); >> +#endif >> + > > I don't think #ifdef is appropriate here. It's not, but I was hoping Smarter devs then me would point me the right way ;) Oliver > > WBR, Sergei > -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index 2289efdf..2bf2423 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h @@ -138,6 +138,7 @@ enum { PORT_SCR_NTF = 0x3c, /* SATA phy register: SNotification */ PORT_FBS = 0x40, /* FIS-based Switching */ PORT_DEVSLP = 0x44, /* device sleep */ + PORT_DMA = 0x70, /* direct memory access */ /* PORT_IRQ_{STAT,MASK} bits */ PORT_IRQ_COLD_PRES = (1 << 31), /* cold presence detect */ @@ -209,6 +210,11 @@ enum { PORT_DEVSLP_DSP = (1 << 1), /* DevSlp present */ PORT_DEVSLP_ADSE = (1 << 0), /* Aggressive DevSlp enable */ + /* PORT_DMA bits */ + PORT_DMA_SETUP_OFFSET = 8, /* dma setup offset */ + PORT_DMA_SETUP_MASK = (0xff << PORT_DMA_SETUP_OFFSET),/* dma mask */ + PORT_DMA_SETUP_INIT = (0x44 << 0), + /* hpriv->flags bits */ #define AHCI_HFLAGS(flags) .private_data = (void *)(flags) diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index c482f8c..d697a74 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c @@ -570,6 +570,14 @@ void ahci_start_engine(struct ata_port *ap) void __iomem *port_mmio = ahci_port_base(ap); u32 tmp; +#ifdef CONFIG_ARCH_SUNXI + /* Setup DMA before DMA start */ + tmp = readl(port_mmio + PORT_DMA); + tmp &= ~PORT_DMA_SETUP_MASK; + tmp |= PORT_DMA_SETUP_INIT << PORT_DMA_SETUP_OFFSET; + writel(tmp, port_mmio + PORT_DMA); +#endif + /* start DMA */ tmp = readl(port_mmio + PORT_CMD); tmp |= PORT_CMD_START;