forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
libata: support AHCI on OCTEON platform
The OCTEON SATA controller is currently found on cn71XX devices. Acked-by: Arnd Bergmann <[email protected]> Acked-by: Hans de Goede <[email protected]> Acked-by: Rob Herring <[email protected]> Signed-off-by: David Daney <[email protected]> Signed-off-by: Vinita Gupta <[email protected]> Signed-off-by: Aleksey Makarov <[email protected]> Signed-off-by: Zubair Lutfullah Kakakhel <[email protected]> Signed-off-by: Tejun Heo <[email protected]>
- Loading branch information
Showing
7 changed files
with
168 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
42 changes: 42 additions & 0 deletions
42
Documentation/devicetree/bindings/mips/cavium/sata-uctl.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
* UCTL SATA controller glue | ||
|
||
UCTL is the bridge unit between the I/O interconnect (an internal bus) | ||
and the SATA AHCI host controller (UAHC). It performs the following functions: | ||
- provides interfaces for the applications to access the UAHC AHCI | ||
registers on the CN71XX I/O space. | ||
- provides a bridge for UAHC to fetch AHCI command table entries and data | ||
buffers from Level 2 Cache. | ||
- posts interrupts to the CIU. | ||
- contains registers that: | ||
- control the behavior of the UAHC | ||
- control the clock/reset generation to UAHC | ||
- control endian swapping for all UAHC registers and DMA accesses | ||
|
||
Properties: | ||
|
||
- compatible: "cavium,octeon-7130-sata-uctl" | ||
|
||
Compatibility with the cn7130 SOC. | ||
|
||
- reg: The base address of the UCTL register bank. | ||
|
||
- #address-cells, #size-cells, ranges and dma-ranges must be present and hold | ||
suitable values to map all child nodes. | ||
|
||
Example: | ||
|
||
uctl@118006c000000 { | ||
compatible = "cavium,octeon-7130-sata-uctl"; | ||
reg = <0x11800 0x6c000000 0x0 0x100>; | ||
ranges; /* Direct mapping */ | ||
dma-ranges; | ||
#address-cells = <2>; | ||
#size-cells = <2>; | ||
|
||
sata: sata@16c0000000000 { | ||
compatible = "cavium,octeon-7130-ahci"; | ||
reg = <0x16c00 0x00000000 0x0 0x200>; | ||
interrupt-parent = <&cibsata>; | ||
interrupts = <2 4>; /* Bit: 2, level */ | ||
}; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
/* | ||
* SATA glue for Cavium Octeon III SOCs. | ||
* | ||
* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
* | ||
* Copyright (C) 2010-2015 Cavium Networks | ||
* | ||
*/ | ||
|
||
#include <linux/module.h> | ||
#include <linux/dma-mapping.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/of_platform.h> | ||
|
||
#include <asm/octeon/octeon.h> | ||
#include <asm/bitfield.h> | ||
|
||
#define CVMX_SATA_UCTL_SHIM_CFG 0xE8 | ||
|
||
#define SATA_UCTL_ENDIAN_MODE_BIG 1 | ||
#define SATA_UCTL_ENDIAN_MODE_LITTLE 0 | ||
#define SATA_UCTL_ENDIAN_MODE_MASK 3 | ||
|
||
#define SATA_UCTL_DMA_ENDIAN_MODE_SHIFT 8 | ||
#define SATA_UCTL_CSR_ENDIAN_MODE_SHIFT 0 | ||
#define SATA_UCTL_DMA_READ_CMD_SHIFT 12 | ||
|
||
static int ahci_octeon_probe(struct platform_device *pdev) | ||
{ | ||
struct device *dev = &pdev->dev; | ||
struct device_node *node = dev->of_node; | ||
struct resource *res; | ||
void __iomem *base; | ||
u64 cfg; | ||
int ret; | ||
|
||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
if (!res) { | ||
dev_err(&pdev->dev, "Platform resource[0] is missing\n"); | ||
return -ENODEV; | ||
} | ||
|
||
base = devm_ioremap_resource(&pdev->dev, res); | ||
if (IS_ERR(base)) | ||
return PTR_ERR(base); | ||
|
||
cfg = cvmx_readq_csr(base + CVMX_SATA_UCTL_SHIM_CFG); | ||
|
||
cfg &= ~(SATA_UCTL_ENDIAN_MODE_MASK << SATA_UCTL_DMA_ENDIAN_MODE_SHIFT); | ||
cfg &= ~(SATA_UCTL_ENDIAN_MODE_MASK << SATA_UCTL_CSR_ENDIAN_MODE_SHIFT); | ||
|
||
#ifdef __BIG_ENDIAN | ||
cfg |= SATA_UCTL_ENDIAN_MODE_BIG << SATA_UCTL_DMA_ENDIAN_MODE_SHIFT; | ||
cfg |= SATA_UCTL_ENDIAN_MODE_BIG << SATA_UCTL_CSR_ENDIAN_MODE_SHIFT; | ||
#else | ||
cfg |= SATA_UCTL_ENDIAN_MODE_LITTLE << SATA_UCTL_DMA_ENDIAN_MODE_SHIFT; | ||
cfg |= SATA_UCTL_ENDIAN_MODE_LITTLE << SATA_UCTL_CSR_ENDIAN_MODE_SHIFT; | ||
#endif | ||
|
||
cfg |= 1 << SATA_UCTL_DMA_READ_CMD_SHIFT; | ||
|
||
cvmx_writeq_csr(base + CVMX_SATA_UCTL_SHIM_CFG, cfg); | ||
|
||
if (!node) { | ||
dev_err(dev, "no device node, failed to add octeon sata\n"); | ||
return -ENODEV; | ||
} | ||
|
||
ret = of_platform_populate(node, NULL, NULL, dev); | ||
if (ret) { | ||
dev_err(dev, "failed to add ahci-platform core\n"); | ||
return ret; | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
static int ahci_octeon_remove(struct platform_device *pdev) | ||
{ | ||
return 0; | ||
} | ||
|
||
static const struct of_device_id octeon_ahci_match[] = { | ||
{ .compatible = "cavium,octeon-7130-sata-uctl", }, | ||
{}, | ||
}; | ||
MODULE_DEVICE_TABLE(of, octeon_ahci_match); | ||
|
||
static struct platform_driver ahci_octeon_driver = { | ||
.probe = ahci_octeon_probe, | ||
.remove = ahci_octeon_remove, | ||
.driver = { | ||
.name = "octeon-ahci", | ||
.of_match_table = octeon_ahci_match, | ||
}, | ||
}; | ||
|
||
module_platform_driver(ahci_octeon_driver); | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_AUTHOR("Cavium, Inc. <[email protected]>"); | ||
MODULE_DESCRIPTION("Cavium Inc. sata config."); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters