You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'marvell-xor-cleanup-dt-binding-3.8' of github.com:MISL-EBU-System-SW/mainline-public into test-the-merge
Marvell XOR driver cleanup and DT binding for 3.8
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
* Marvell XOR engines
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "marvell,orion-xor"
|
||||
- reg: Should contain registers location and length (two sets)
|
||||
the first set is the low registers, the second set the high
|
||||
registers for the XOR engine.
|
||||
- clocks: pointer to the reference clock
|
||||
|
||||
The DT node must also contains sub-nodes for each XOR channel that the
|
||||
XOR engine has. Those sub-nodes have the following required
|
||||
properties:
|
||||
- interrupts: interrupt of the XOR channel
|
||||
|
||||
And the following optional properties:
|
||||
- dmacap,memcpy to indicate that the XOR channel is capable of memcpy operations
|
||||
- dmacap,memset to indicate that the XOR channel is capable of memset operations
|
||||
- dmacap,xor to indicate that the XOR channel is capable of xor operations
|
||||
|
||||
Example:
|
||||
|
||||
xor@d0060900 {
|
||||
compatible = "marvell,orion-xor";
|
||||
reg = <0xd0060900 0x100
|
||||
0xd0060b00 0x100>;
|
||||
clocks = <&coreclk 0>;
|
||||
status = "okay";
|
||||
|
||||
xor00 {
|
||||
interrupts = <51>;
|
||||
dmacap,memcpy;
|
||||
dmacap,xor;
|
||||
};
|
||||
xor01 {
|
||||
interrupts = <52>;
|
||||
dmacap,memcpy;
|
||||
dmacap,xor;
|
||||
dmacap,memset;
|
||||
};
|
||||
};
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/irq.h>
|
||||
#include <plat/time.h>
|
||||
#include <linux/platform_data/usb-ehci-orion.h>
|
||||
#include <linux/platform_data/dma-mv_xor.h>
|
||||
#include <plat/irq.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/addr-map.h>
|
||||
@@ -124,8 +125,8 @@ static void __init dove_clk_init(void)
|
||||
orion_clkdev_add(NULL, "mv_crypto", crypto);
|
||||
orion_clkdev_add(NULL, "dove-ac97", ac97);
|
||||
orion_clkdev_add(NULL, "dove-pdma", pdma);
|
||||
orion_clkdev_add(NULL, "mv_xor_shared.0", xor0);
|
||||
orion_clkdev_add(NULL, "mv_xor_shared.1", xor1);
|
||||
orion_clkdev_add(NULL, MV_XOR_NAME ".0", xor0);
|
||||
orion_clkdev_add(NULL, MV_XOR_NAME ".1", xor1);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -410,11 +411,11 @@ static void __init dove_legacy_clk_init(void)
|
||||
of_clk_get_from_provider(&clkspec));
|
||||
|
||||
clkspec.args[0] = CLOCK_GATING_BIT_XOR0;
|
||||
orion_clkdev_add(NULL, "mv_xor_shared.0",
|
||||
orion_clkdev_add(NULL, MV_XOR_NAME ".0",
|
||||
of_clk_get_from_provider(&clkspec));
|
||||
|
||||
clkspec.args[0] = CLOCK_GATING_BIT_XOR1;
|
||||
orion_clkdev_add(NULL, "mv_xor_shared.1",
|
||||
orion_clkdev_add(NULL, MV_XOR_NAME ".1",
|
||||
of_clk_get_from_provider(&clkspec));
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <mach/bridge-regs.h>
|
||||
#include <linux/platform_data/usb-ehci-orion.h>
|
||||
#include <linux/platform_data/dma-mv_xor.h>
|
||||
#include <plat/irq.h>
|
||||
#include <plat/common.h>
|
||||
#include "common.h"
|
||||
@@ -60,11 +61,11 @@ static void __init kirkwood_legacy_clk_init(void)
|
||||
of_clk_get_from_provider(&clkspec));
|
||||
|
||||
clkspec.args[0] = CGC_BIT_XOR0;
|
||||
orion_clkdev_add(NULL, "mv_xor_shared.0",
|
||||
orion_clkdev_add(NULL, MV_XOR_NAME ".0",
|
||||
of_clk_get_from_provider(&clkspec));
|
||||
|
||||
clkspec.args[0] = CGC_BIT_XOR1;
|
||||
orion_clkdev_add(NULL, "mv_xor_shared.1",
|
||||
orion_clkdev_add(NULL, MV_XOR_NAME ".1",
|
||||
of_clk_get_from_provider(&clkspec));
|
||||
|
||||
clkspec.args[0] = CGC_BIT_PEX1;
|
||||
|
||||
@@ -260,8 +260,8 @@ void __init kirkwood_clk_init(void)
|
||||
orion_clkdev_add(NULL, "orion_nand", runit);
|
||||
orion_clkdev_add(NULL, "mvsdio", sdio);
|
||||
orion_clkdev_add(NULL, "mv_crypto", crypto);
|
||||
orion_clkdev_add(NULL, MV_XOR_SHARED_NAME ".0", xor0);
|
||||
orion_clkdev_add(NULL, MV_XOR_SHARED_NAME ".1", xor1);
|
||||
orion_clkdev_add(NULL, MV_XOR_NAME ".0", xor0);
|
||||
orion_clkdev_add(NULL, MV_XOR_NAME ".1", xor1);
|
||||
orion_clkdev_add("0", "pcie", pex0);
|
||||
orion_clkdev_add("1", "pcie", pex1);
|
||||
orion_clkdev_add(NULL, "kirkwood-i2s", audio);
|
||||
|
||||
+64
-130
@@ -606,26 +606,6 @@ void __init orion_wdt_init(void)
|
||||
****************************************************************************/
|
||||
static u64 orion_xor_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
void __init orion_xor_init_channels(
|
||||
struct mv_xor_platform_data *orion_xor0_data,
|
||||
struct platform_device *orion_xor0_channel,
|
||||
struct mv_xor_platform_data *orion_xor1_data,
|
||||
struct platform_device *orion_xor1_channel)
|
||||
{
|
||||
/*
|
||||
* two engines can't do memset simultaneously, this limitation
|
||||
* satisfied by removing memset support from one of the engines.
|
||||
*/
|
||||
dma_cap_set(DMA_MEMCPY, orion_xor0_data->cap_mask);
|
||||
dma_cap_set(DMA_XOR, orion_xor0_data->cap_mask);
|
||||
platform_device_register(orion_xor0_channel);
|
||||
|
||||
dma_cap_set(DMA_MEMCPY, orion_xor1_data->cap_mask);
|
||||
dma_cap_set(DMA_MEMSET, orion_xor1_data->cap_mask);
|
||||
dma_cap_set(DMA_XOR, orion_xor1_data->cap_mask);
|
||||
platform_device_register(orion_xor1_channel);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* XOR0
|
||||
****************************************************************************/
|
||||
@@ -636,61 +616,30 @@ static struct resource orion_xor0_shared_resources[] = {
|
||||
}, {
|
||||
.name = "xor 0 high",
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.name = "irq channel 0",
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}, {
|
||||
.name = "irq channel 1",
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mv_xor_channel_data orion_xor0_channels_data[2];
|
||||
|
||||
static struct mv_xor_platform_data orion_xor0_pdata = {
|
||||
.channels = orion_xor0_channels_data,
|
||||
};
|
||||
|
||||
static struct platform_device orion_xor0_shared = {
|
||||
.name = MV_XOR_SHARED_NAME,
|
||||
.name = MV_XOR_NAME,
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(orion_xor0_shared_resources),
|
||||
.resource = orion_xor0_shared_resources,
|
||||
};
|
||||
|
||||
static struct resource orion_xor00_resources[] = {
|
||||
[0] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mv_xor_platform_data orion_xor00_data = {
|
||||
.shared = &orion_xor0_shared,
|
||||
.hw_id = 0,
|
||||
.pool_size = PAGE_SIZE,
|
||||
};
|
||||
|
||||
static struct platform_device orion_xor00_channel = {
|
||||
.name = MV_XOR_NAME,
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(orion_xor00_resources),
|
||||
.resource = orion_xor00_resources,
|
||||
.dev = {
|
||||
.dma_mask = &orion_xor_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(64),
|
||||
.platform_data = &orion_xor00_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource orion_xor01_resources[] = {
|
||||
[0] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mv_xor_platform_data orion_xor01_data = {
|
||||
.shared = &orion_xor0_shared,
|
||||
.hw_id = 1,
|
||||
.pool_size = PAGE_SIZE,
|
||||
};
|
||||
|
||||
static struct platform_device orion_xor01_channel = {
|
||||
.name = MV_XOR_NAME,
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(orion_xor01_resources),
|
||||
.resource = orion_xor01_resources,
|
||||
.dev = {
|
||||
.dma_mask = &orion_xor_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(64),
|
||||
.platform_data = &orion_xor01_data,
|
||||
.dev = {
|
||||
.dma_mask = &orion_xor_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(64),
|
||||
.platform_data = &orion_xor0_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -704,15 +653,23 @@ void __init orion_xor0_init(unsigned long mapbase_low,
|
||||
orion_xor0_shared_resources[1].start = mapbase_high;
|
||||
orion_xor0_shared_resources[1].end = mapbase_high + 0xff;
|
||||
|
||||
orion_xor00_resources[0].start = irq_0;
|
||||
orion_xor00_resources[0].end = irq_0;
|
||||
orion_xor01_resources[0].start = irq_1;
|
||||
orion_xor01_resources[0].end = irq_1;
|
||||
orion_xor0_shared_resources[2].start = irq_0;
|
||||
orion_xor0_shared_resources[2].end = irq_0;
|
||||
orion_xor0_shared_resources[3].start = irq_1;
|
||||
orion_xor0_shared_resources[3].end = irq_1;
|
||||
|
||||
/*
|
||||
* two engines can't do memset simultaneously, this limitation
|
||||
* satisfied by removing memset support from one of the engines.
|
||||
*/
|
||||
dma_cap_set(DMA_MEMCPY, orion_xor0_channels_data[0].cap_mask);
|
||||
dma_cap_set(DMA_XOR, orion_xor0_channels_data[0].cap_mask);
|
||||
|
||||
dma_cap_set(DMA_MEMSET, orion_xor0_channels_data[1].cap_mask);
|
||||
dma_cap_set(DMA_MEMCPY, orion_xor0_channels_data[1].cap_mask);
|
||||
dma_cap_set(DMA_XOR, orion_xor0_channels_data[1].cap_mask);
|
||||
|
||||
platform_device_register(&orion_xor0_shared);
|
||||
|
||||
orion_xor_init_channels(&orion_xor00_data, &orion_xor00_channel,
|
||||
&orion_xor01_data, &orion_xor01_channel);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -725,61 +682,30 @@ static struct resource orion_xor1_shared_resources[] = {
|
||||
}, {
|
||||
.name = "xor 1 high",
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.name = "irq channel 0",
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}, {
|
||||
.name = "irq channel 1",
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mv_xor_channel_data orion_xor1_channels_data[2];
|
||||
|
||||
static struct mv_xor_platform_data orion_xor1_pdata = {
|
||||
.channels = orion_xor1_channels_data,
|
||||
};
|
||||
|
||||
static struct platform_device orion_xor1_shared = {
|
||||
.name = MV_XOR_SHARED_NAME,
|
||||
.name = MV_XOR_NAME,
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(orion_xor1_shared_resources),
|
||||
.resource = orion_xor1_shared_resources,
|
||||
};
|
||||
|
||||
static struct resource orion_xor10_resources[] = {
|
||||
[0] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mv_xor_platform_data orion_xor10_data = {
|
||||
.shared = &orion_xor1_shared,
|
||||
.hw_id = 0,
|
||||
.pool_size = PAGE_SIZE,
|
||||
};
|
||||
|
||||
static struct platform_device orion_xor10_channel = {
|
||||
.name = MV_XOR_NAME,
|
||||
.id = 2,
|
||||
.num_resources = ARRAY_SIZE(orion_xor10_resources),
|
||||
.resource = orion_xor10_resources,
|
||||
.dev = {
|
||||
.dma_mask = &orion_xor_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(64),
|
||||
.platform_data = &orion_xor10_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource orion_xor11_resources[] = {
|
||||
[0] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mv_xor_platform_data orion_xor11_data = {
|
||||
.shared = &orion_xor1_shared,
|
||||
.hw_id = 1,
|
||||
.pool_size = PAGE_SIZE,
|
||||
};
|
||||
|
||||
static struct platform_device orion_xor11_channel = {
|
||||
.name = MV_XOR_NAME,
|
||||
.id = 3,
|
||||
.num_resources = ARRAY_SIZE(orion_xor11_resources),
|
||||
.resource = orion_xor11_resources,
|
||||
.dev = {
|
||||
.dma_mask = &orion_xor_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(64),
|
||||
.platform_data = &orion_xor11_data,
|
||||
.dev = {
|
||||
.dma_mask = &orion_xor_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(64),
|
||||
.platform_data = &orion_xor1_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -793,15 +719,23 @@ void __init orion_xor1_init(unsigned long mapbase_low,
|
||||
orion_xor1_shared_resources[1].start = mapbase_high;
|
||||
orion_xor1_shared_resources[1].end = mapbase_high + 0xff;
|
||||
|
||||
orion_xor10_resources[0].start = irq_0;
|
||||
orion_xor10_resources[0].end = irq_0;
|
||||
orion_xor11_resources[0].start = irq_1;
|
||||
orion_xor11_resources[0].end = irq_1;
|
||||
orion_xor1_shared_resources[2].start = irq_0;
|
||||
orion_xor1_shared_resources[2].end = irq_0;
|
||||
orion_xor1_shared_resources[3].start = irq_1;
|
||||
orion_xor1_shared_resources[3].end = irq_1;
|
||||
|
||||
/*
|
||||
* two engines can't do memset simultaneously, this limitation
|
||||
* satisfied by removing memset support from one of the engines.
|
||||
*/
|
||||
dma_cap_set(DMA_MEMCPY, orion_xor1_channels_data[0].cap_mask);
|
||||
dma_cap_set(DMA_XOR, orion_xor1_channels_data[0].cap_mask);
|
||||
|
||||
dma_cap_set(DMA_MEMSET, orion_xor1_channels_data[1].cap_mask);
|
||||
dma_cap_set(DMA_MEMCPY, orion_xor1_channels_data[1].cap_mask);
|
||||
dma_cap_set(DMA_XOR, orion_xor1_channels_data[1].cap_mask);
|
||||
|
||||
platform_device_register(&orion_xor1_shared);
|
||||
|
||||
orion_xor_init_channels(&orion_xor10_data, &orion_xor10_channel,
|
||||
&orion_xor11_data, &orion_xor11_channel);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
||||
+236
-181
File diff suppressed because it is too large
Load Diff
+12
-23
@@ -24,8 +24,10 @@
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#define USE_TIMER
|
||||
#define MV_XOR_POOL_SIZE PAGE_SIZE
|
||||
#define MV_XOR_SLOT_SIZE 64
|
||||
#define MV_XOR_THRESHOLD 1
|
||||
#define MV_XOR_MAX_CHANNELS 2
|
||||
|
||||
#define XOR_OPERATION_MODE_XOR 0
|
||||
#define XOR_OPERATION_MODE_MEMCPY 2
|
||||
@@ -52,28 +54,11 @@
|
||||
#define WINDOW_REMAP_HIGH(w) (0x290 + ((w) << 2))
|
||||
#define WINDOW_BAR_ENABLE(chan) (0x240 + ((chan) << 2))
|
||||
|
||||
struct mv_xor_shared_private {
|
||||
void __iomem *xor_base;
|
||||
void __iomem *xor_high_base;
|
||||
struct clk *clk;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* struct mv_xor_device - internal representation of a XOR device
|
||||
* @pdev: Platform device
|
||||
* @id: HW XOR Device selector
|
||||
* @dma_desc_pool: base of DMA descriptor region (DMA address)
|
||||
* @dma_desc_pool_virt: base of DMA descriptor region (CPU address)
|
||||
* @common: embedded struct dma_device
|
||||
*/
|
||||
struct mv_xor_device {
|
||||
struct platform_device *pdev;
|
||||
int id;
|
||||
dma_addr_t dma_desc_pool;
|
||||
void *dma_desc_pool_virt;
|
||||
struct dma_device common;
|
||||
struct mv_xor_shared_private *shared;
|
||||
void __iomem *xor_base;
|
||||
void __iomem *xor_high_base;
|
||||
struct clk *clk;
|
||||
struct mv_xor_chan *channels[MV_XOR_MAX_CHANNELS];
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -96,11 +81,15 @@ struct mv_xor_chan {
|
||||
spinlock_t lock; /* protects the descriptor slot pool */
|
||||
void __iomem *mmr_base;
|
||||
unsigned int idx;
|
||||
int irq;
|
||||
enum dma_transaction_type current_type;
|
||||
struct list_head chain;
|
||||
struct list_head completed_slots;
|
||||
struct mv_xor_device *device;
|
||||
struct dma_chan common;
|
||||
dma_addr_t dma_desc_pool;
|
||||
void *dma_desc_pool_virt;
|
||||
size_t pool_size;
|
||||
struct dma_device dmadev;
|
||||
struct dma_chan dmachan;
|
||||
struct mv_xor_desc_slot *last_used;
|
||||
struct list_head all_slots;
|
||||
int slots_allocated;
|
||||
|
||||
@@ -10,15 +10,14 @@
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/mbus.h>
|
||||
|
||||
#define MV_XOR_SHARED_NAME "mv_xor_shared"
|
||||
#define MV_XOR_NAME "mv_xor"
|
||||
#define MV_XOR_NAME "mv_xor"
|
||||
|
||||
struct mv_xor_platform_data {
|
||||
struct platform_device *shared;
|
||||
int hw_id;
|
||||
struct mv_xor_channel_data {
|
||||
dma_cap_mask_t cap_mask;
|
||||
size_t pool_size;
|
||||
};
|
||||
|
||||
struct mv_xor_platform_data {
|
||||
struct mv_xor_channel_data *channels;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user