Skip to content

Commit 15a3263

Browse files
buytenhNicolas Pitre
authored andcommitted
sata_mv: mbus decode window support
Make it possible to pass mbus_dram_target_info to the sata_mv driver via the platform data, make the sata_mv driver program the window registers based on this data if it is passed in, and make the Orion platform setup code use this method instead of programming the SATA mbus window registers by hand. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Reviewed-by: Tzachi Perelstein <tzachi@marvell.com> Acked-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Nicolas Pitre <nico@marvell.com>
1 parent 92aecfa commit 15a3263

5 files changed

Lines changed: 36 additions & 42 deletions

File tree

arch/arm/mach-orion/addr-map.c

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,6 @@
103103
#define ETH_MAX_WIN 6
104104
#define ETH_MAX_REMAP_WIN 4
105105

106-
/*
107-
* SATA Address Decode Windows registers
108-
*/
109-
#define SATA_WIN_CTRL(win) ORION_SATA_REG(0x30 + ((win) * 0x10))
110-
#define SATA_WIN_BASE(win) ORION_SATA_REG(0x34 + ((win) * 0x10))
111-
#define SATA_MAX_WIN 4
112-
113106

114107
struct mbus_dram_target_info orion_mbus_dram_info;
115108

@@ -288,35 +281,3 @@ void __init orion_setup_eth_wins(void)
288281
}
289282
}
290283
}
291-
292-
void __init orion_setup_sata_wins(void)
293-
{
294-
int i;
295-
296-
/*
297-
* First, disable and clear windows
298-
*/
299-
for (i = 0; i < SATA_MAX_WIN; i++) {
300-
orion_write(SATA_WIN_BASE(i), 0);
301-
orion_write(SATA_WIN_CTRL(i), 0);
302-
}
303-
304-
/*
305-
* Setup windows for DDR banks.
306-
*/
307-
for (i = 0; i < DDR_MAX_CS; i++) {
308-
u32 base, size;
309-
size = orion_read(DDR_SIZE_CS(i));
310-
base = orion_read(DDR_BASE_CS(i));
311-
if (size & DDR_BANK_EN) {
312-
base = DDR_REG_TO_BASE(base);
313-
size = DDR_REG_TO_SIZE(size);
314-
orion_write(SATA_WIN_CTRL(i),
315-
((size-1) & 0xffff0000) |
316-
(ATTR_DDR_CS(i) << 8) |
317-
(TARGET_DDR << 4) | WIN_EN);
318-
orion_write(SATA_WIN_BASE(i),
319-
base & 0xffff0000);
320-
}
321-
}
322-
}

arch/arm/mach-orion/common.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <linux/mbus.h>
1818
#include <linux/mv643xx_eth.h>
1919
#include <linux/mv643xx_i2c.h>
20+
#include <linux/ata_platform.h>
2021
#include <asm/page.h>
2122
#include <asm/setup.h>
2223
#include <asm/timex.h>
@@ -289,6 +290,7 @@ static struct platform_device orion_sata = {
289290

290291
void __init orion_sata_init(struct mv_sata_platform_data *sata_data)
291292
{
293+
sata_data->dram = &orion_mbus_dram_info;
292294
orion_sata.dev.platform_data = sata_data;
293295
platform_device_register(&orion_sata);
294296
}
@@ -342,8 +344,6 @@ void __init orion_init(void)
342344
*/
343345
orion_setup_cpu_wins();
344346
orion_setup_eth_wins();
345-
if (dev == MV88F5182_DEV_ID)
346-
orion_setup_sata_wins();
347347

348348
/*
349349
* REgister devices

arch/arm/mach-orion/common.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ extern struct mbus_dram_target_info orion_mbus_dram_info;
3333
void orion_setup_cpu_win(enum orion_target target, u32 base, u32 size, int remap);
3434
void orion_setup_cpu_wins(void);
3535
void orion_setup_eth_wins(void);
36-
void orion_setup_sata_wins(void);
3736

3837
/*
3938
* Shared code used internally by other Orion core functions.

drivers/ata/sata_mv.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
#include <linux/device.h>
7575
#include <linux/platform_device.h>
7676
#include <linux/ata_platform.h>
77+
#include <linux/mbus.h>
7778
#include <scsi/scsi_host.h>
7879
#include <scsi/scsi_cmnd.h>
7980
#include <scsi/scsi_device.h>
@@ -352,6 +353,9 @@ enum {
352353
#define IS_GEN_IIE(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_IIE)
353354
#define HAS_PCI(host) (!((host)->ports[0]->flags & MV_FLAG_SOC))
354355

356+
#define WINDOW_CTRL(i) (0x20030 + ((i) << 4))
357+
#define WINDOW_BASE(i) (0x20034 + ((i) << 4))
358+
355359
enum {
356360
/* DMA boundary 0xffff is required by the s/g splitting
357361
* we need on /length/ in mv_fill-sg().
@@ -2897,6 +2901,27 @@ static int mv_create_dma_pools(struct mv_host_priv *hpriv, struct device *dev)
28972901
return 0;
28982902
}
28992903

2904+
static void mv_conf_mbus_windows(struct mv_host_priv *hpriv,
2905+
struct mbus_dram_target_info *dram)
2906+
{
2907+
int i;
2908+
2909+
for (i = 0; i < 4; i++) {
2910+
writel(0, hpriv->base + WINDOW_CTRL(i));
2911+
writel(0, hpriv->base + WINDOW_BASE(i));
2912+
}
2913+
2914+
for (i = 0; i < dram->num_cs; i++) {
2915+
struct mbus_dram_window *cs = dram->cs + i;
2916+
2917+
writel(((cs->size - 1) & 0xffff0000) |
2918+
(cs->mbus_attr << 8) |
2919+
(dram->mbus_dram_target_id << 4) | 1,
2920+
hpriv->base + WINDOW_CTRL(i));
2921+
writel(cs->base, hpriv->base + WINDOW_BASE(i));
2922+
}
2923+
}
2924+
29002925
/**
29012926
* mv_platform_probe - handle a positive probe of an soc Marvell
29022927
* host
@@ -2951,6 +2976,12 @@ static int mv_platform_probe(struct platform_device *pdev)
29512976
res->end - res->start + 1);
29522977
hpriv->base -= MV_SATAHC0_REG_BASE;
29532978

2979+
/*
2980+
* (Re-)program MBUS remapping windows if we are asked to.
2981+
*/
2982+
if (mv_platform_data->dram != NULL)
2983+
mv_conf_mbus_windows(hpriv, mv_platform_data->dram);
2984+
29542985
rc = mv_create_dma_pools(hpriv, &pdev->dev);
29552986
if (rc)
29562987
return rc;

include/linux/ata_platform.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ extern int __devexit __pata_platform_remove(struct device *dev);
2727
/*
2828
* Marvell SATA private data
2929
*/
30+
struct mbus_dram_target_info;
31+
3032
struct mv_sata_platform_data {
33+
struct mbus_dram_target_info *dram;
3134
int n_ports; /* number of sata ports */
3235
};
3336

0 commit comments

Comments
 (0)