|
74 | 74 | #include <linux/device.h> |
75 | 75 | #include <linux/platform_device.h> |
76 | 76 | #include <linux/ata_platform.h> |
| 77 | +#include <linux/mbus.h> |
77 | 78 | #include <scsi/scsi_host.h> |
78 | 79 | #include <scsi/scsi_cmnd.h> |
79 | 80 | #include <scsi/scsi_device.h> |
@@ -352,6 +353,9 @@ enum { |
352 | 353 | #define IS_GEN_IIE(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_IIE) |
353 | 354 | #define HAS_PCI(host) (!((host)->ports[0]->flags & MV_FLAG_SOC)) |
354 | 355 |
|
| 356 | +#define WINDOW_CTRL(i) (0x20030 + ((i) << 4)) |
| 357 | +#define WINDOW_BASE(i) (0x20034 + ((i) << 4)) |
| 358 | + |
355 | 359 | enum { |
356 | 360 | /* DMA boundary 0xffff is required by the s/g splitting |
357 | 361 | * 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) |
2897 | 2901 | return 0; |
2898 | 2902 | } |
2899 | 2903 |
|
| 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 | + |
2900 | 2925 | /** |
2901 | 2926 | * mv_platform_probe - handle a positive probe of an soc Marvell |
2902 | 2927 | * host |
@@ -2951,6 +2976,12 @@ static int mv_platform_probe(struct platform_device *pdev) |
2951 | 2976 | res->end - res->start + 1); |
2952 | 2977 | hpriv->base -= MV_SATAHC0_REG_BASE; |
2953 | 2978 |
|
| 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 | + |
2954 | 2985 | rc = mv_create_dma_pools(hpriv, &pdev->dev); |
2955 | 2986 | if (rc) |
2956 | 2987 | return rc; |
|
0 commit comments