Commit 90bf80a1 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'ixp4xx-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc

Pull ARM ixp4xx bug fixes from Arnd Bergmann:
 "These were originally prepared by Krzysztof Halasa but not submitted
  in time for v3.7 due to some confusion about how ixp4xx patches should
  be handled.  Jason Cooper thankfully offered to help out sending the
  patches upstream through arm-soc now, but given the timing, we could
  as well delay them for 3.8."

* tag 'ixp4xx-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc:
  IXP4xx: use __iomem for MMIO
  IXP4xx: map CPU config registers within VMALLOC region.
  IXP4xx: Always ioremap() Queue Manager MMIO region at boot.
  ixp4xx: Declare MODULE_FIRMWARE usage
  IXP4xx crypto: MOD_AES{128,192,256} already include key size.
  WAN: Remove redundant HDLC info printed by IXP4xx HSS driver.
  IXP4xx: Remove time limit for PCI TRDY to enable use of slow devices.
  IXP4xx: ixp4xx_crypto driver requires Queue Manager and NPE drivers.
  IXP4xx: HW pseudo-random generator is available on IXP45x/46x only.
  IXP4xx: Fix off-by-one bug in Goramo MultiLink platform.
  IXP4xx: Fix Goramo MultiLink platform compilation.
parents 50a561ca 0d2c9f05
...@@ -410,6 +410,7 @@ void __init ixp4xx_pci_preinit(void) ...@@ -410,6 +410,7 @@ void __init ixp4xx_pci_preinit(void)
* Enable the IO window to be way up high, at 0xfffffc00 * Enable the IO window to be way up high, at 0xfffffc00
*/ */
local_write_config(PCI_BASE_ADDRESS_5, 4, 0xfffffc01); local_write_config(PCI_BASE_ADDRESS_5, 4, 0xfffffc01);
local_write_config(0x40, 4, 0x000080FF); /* No TRDY time limit */
} else { } else {
printk("PCI: IXP4xx is target - No bus scan performed\n"); printk("PCI: IXP4xx is target - No bus scan performed\n");
} }
......
...@@ -67,15 +67,12 @@ static struct map_desc ixp4xx_io_desc[] __initdata = { ...@@ -67,15 +67,12 @@ static struct map_desc ixp4xx_io_desc[] __initdata = {
.pfn = __phys_to_pfn(IXP4XX_PCI_CFG_BASE_PHYS), .pfn = __phys_to_pfn(IXP4XX_PCI_CFG_BASE_PHYS),
.length = IXP4XX_PCI_CFG_REGION_SIZE, .length = IXP4XX_PCI_CFG_REGION_SIZE,
.type = MT_DEVICE .type = MT_DEVICE
}, }, { /* Queue Manager */
#ifdef CONFIG_DEBUG_LL .virtual = (unsigned long)IXP4XX_QMGR_BASE_VIRT,
{ /* Debug UART mapping */ .pfn = __phys_to_pfn(IXP4XX_QMGR_BASE_PHYS),
.virtual = (unsigned long)IXP4XX_DEBUG_UART_BASE_VIRT, .length = IXP4XX_QMGR_REGION_SIZE,
.pfn = __phys_to_pfn(IXP4XX_DEBUG_UART_BASE_PHYS),
.length = IXP4XX_DEBUG_UART_REGION_SIZE,
.type = MT_DEVICE .type = MT_DEVICE
} },
#endif
}; };
void __init ixp4xx_map_io(void) void __init ixp4xx_map_io(void)
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/flash.h> #include <asm/mach/flash.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
#include <asm/system_info.h>
#define SLOT_ETHA 0x0B /* IDSEL = AD21 */ #define SLOT_ETHA 0x0B /* IDSEL = AD21 */
#define SLOT_ETHB 0x0C /* IDSEL = AD20 */ #define SLOT_ETHB 0x0C /* IDSEL = AD20 */
...@@ -329,7 +330,7 @@ static struct platform_device device_hss_tab[] = { ...@@ -329,7 +330,7 @@ static struct platform_device device_hss_tab[] = {
}; };
static struct platform_device *device_tab[6] __initdata = { static struct platform_device *device_tab[7] __initdata = {
&device_flash, /* index 0 */ &device_flash, /* index 0 */
}; };
......
...@@ -17,8 +17,8 @@ ...@@ -17,8 +17,8 @@
#else #else
mov \rp, #0 mov \rp, #0
#endif #endif
orr \rv, \rp, #0xff000000 @ virtual orr \rv, \rp, #0xfe000000 @ virtual
orr \rv, \rv, #0x00b00000 orr \rv, \rv, #0x00f00000
orr \rp, \rp, #0xc8000000 @ physical orr \rp, \rp, #0xc8000000 @ physical
.endm .endm
......
...@@ -30,51 +30,43 @@ ...@@ -30,51 +30,43 @@
* *
* 0x50000000 0x10000000 ioremap'd EXP BUS * 0x50000000 0x10000000 ioremap'd EXP BUS
* *
* 0x6000000 0x00004000 ioremap'd QMgr * 0xC8000000 0x00013000 0xFEF00000 On-Chip Peripherals
* *
* 0xC0000000 0x00001000 0xffbff000 PCI CFG * 0xC0000000 0x00001000 0xFEF13000 PCI CFG
* *
* 0xC4000000 0x00001000 0xffbfe000 EXP CFG * 0xC4000000 0x00001000 0xFEF14000 EXP CFG
* *
* 0xC8000000 0x00013000 0xffbeb000 On-Chip Peripherals * 0x60000000 0x00004000 0xFEF15000 QMgr
*/ */
/* /*
* Queue Manager * Queue Manager
*/ */
#define IXP4XX_QMGR_BASE_PHYS (0x60000000) #define IXP4XX_QMGR_BASE_PHYS 0x60000000
#define IXP4XX_QMGR_REGION_SIZE (0x00004000) #define IXP4XX_QMGR_BASE_VIRT IOMEM(0xFEF15000)
#define IXP4XX_QMGR_REGION_SIZE 0x00004000
/* /*
* Expansion BUS Configuration registers * Peripheral space, including debug UART. Must be section-aligned so that
* it can be used with the low-level debug code.
*/ */
#define IXP4XX_EXP_CFG_BASE_PHYS (0xC4000000) #define IXP4XX_PERIPHERAL_BASE_PHYS 0xC8000000
#define IXP4XX_EXP_CFG_BASE_VIRT IOMEM(0xFFBFE000) #define IXP4XX_PERIPHERAL_BASE_VIRT IOMEM(0xFEF00000)
#define IXP4XX_EXP_CFG_REGION_SIZE (0x00001000) #define IXP4XX_PERIPHERAL_REGION_SIZE 0x00013000
/* /*
* PCI Config registers * PCI Config registers
*/ */
#define IXP4XX_PCI_CFG_BASE_PHYS (0xC0000000) #define IXP4XX_PCI_CFG_BASE_PHYS 0xC0000000
#define IXP4XX_PCI_CFG_BASE_VIRT IOMEM(0xFFBFF000) #define IXP4XX_PCI_CFG_BASE_VIRT IOMEM(0xFEF13000)
#define IXP4XX_PCI_CFG_REGION_SIZE (0x00001000) #define IXP4XX_PCI_CFG_REGION_SIZE 0x00001000
/*
* Peripheral space
*/
#define IXP4XX_PERIPHERAL_BASE_PHYS (0xC8000000)
#define IXP4XX_PERIPHERAL_BASE_VIRT IOMEM(0xFFBEB000)
#define IXP4XX_PERIPHERAL_REGION_SIZE (0x00013000)
/* /*
* Debug UART * Expansion BUS Configuration registers
*
* This is basically a remap of UART1 into a region that is section
* aligned so that it * can be used with the low-level debug code.
*/ */
#define IXP4XX_DEBUG_UART_BASE_PHYS (0xC8000000) #define IXP4XX_EXP_CFG_BASE_PHYS 0xC4000000
#define IXP4XX_DEBUG_UART_BASE_VIRT IOMEM(0xffb00000) #define IXP4XX_EXP_CFG_BASE_VIRT 0xFEF14000
#define IXP4XX_DEBUG_UART_REGION_SIZE (0x00001000) #define IXP4XX_EXP_CFG_REGION_SIZE 0x00001000
#define IXP4XX_EXP_CS0_OFFSET 0x00 #define IXP4XX_EXP_CS0_OFFSET 0x00
#define IXP4XX_EXP_CS1_OFFSET 0x04 #define IXP4XX_EXP_CS1_OFFSET 0x04
......
...@@ -86,7 +86,7 @@ void qmgr_release_queue(unsigned int queue); ...@@ -86,7 +86,7 @@ void qmgr_release_queue(unsigned int queue);
static inline void qmgr_put_entry(unsigned int queue, u32 val) static inline void qmgr_put_entry(unsigned int queue, u32 val)
{ {
extern struct qmgr_regs __iomem *qmgr_regs; struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;
#if DEBUG_QMGR #if DEBUG_QMGR
BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */ BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */
...@@ -99,7 +99,7 @@ static inline void qmgr_put_entry(unsigned int queue, u32 val) ...@@ -99,7 +99,7 @@ static inline void qmgr_put_entry(unsigned int queue, u32 val)
static inline u32 qmgr_get_entry(unsigned int queue) static inline u32 qmgr_get_entry(unsigned int queue)
{ {
u32 val; u32 val;
extern struct qmgr_regs __iomem *qmgr_regs; const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;
val = __raw_readl(&qmgr_regs->acc[queue][0]); val = __raw_readl(&qmgr_regs->acc[queue][0]);
#if DEBUG_QMGR #if DEBUG_QMGR
BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */ BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */
...@@ -112,14 +112,14 @@ static inline u32 qmgr_get_entry(unsigned int queue) ...@@ -112,14 +112,14 @@ static inline u32 qmgr_get_entry(unsigned int queue)
static inline int __qmgr_get_stat1(unsigned int queue) static inline int __qmgr_get_stat1(unsigned int queue)
{ {
extern struct qmgr_regs __iomem *qmgr_regs; const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;
return (__raw_readl(&qmgr_regs->stat1[queue >> 3]) return (__raw_readl(&qmgr_regs->stat1[queue >> 3])
>> ((queue & 7) << 2)) & 0xF; >> ((queue & 7) << 2)) & 0xF;
} }
static inline int __qmgr_get_stat2(unsigned int queue) static inline int __qmgr_get_stat2(unsigned int queue)
{ {
extern struct qmgr_regs __iomem *qmgr_regs; const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;
BUG_ON(queue >= HALF_QUEUES); BUG_ON(queue >= HALF_QUEUES);
return (__raw_readl(&qmgr_regs->stat2[queue >> 4]) return (__raw_readl(&qmgr_regs->stat2[queue >> 4])
>> ((queue & 0xF) << 1)) & 0x3; >> ((queue & 0xF) << 1)) & 0x3;
...@@ -145,7 +145,7 @@ static inline int qmgr_stat_empty(unsigned int queue) ...@@ -145,7 +145,7 @@ static inline int qmgr_stat_empty(unsigned int queue)
*/ */
static inline int qmgr_stat_below_low_watermark(unsigned int queue) static inline int qmgr_stat_below_low_watermark(unsigned int queue)
{ {
extern struct qmgr_regs __iomem *qmgr_regs; const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;
if (queue >= HALF_QUEUES) if (queue >= HALF_QUEUES)
return (__raw_readl(&qmgr_regs->statne_h) >> return (__raw_readl(&qmgr_regs->statne_h) >>
(queue - HALF_QUEUES)) & 0x01; (queue - HALF_QUEUES)) & 0x01;
...@@ -172,7 +172,7 @@ static inline int qmgr_stat_above_high_watermark(unsigned int queue) ...@@ -172,7 +172,7 @@ static inline int qmgr_stat_above_high_watermark(unsigned int queue)
*/ */
static inline int qmgr_stat_full(unsigned int queue) static inline int qmgr_stat_full(unsigned int queue)
{ {
extern struct qmgr_regs __iomem *qmgr_regs; const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;
if (queue >= HALF_QUEUES) if (queue >= HALF_QUEUES)
return (__raw_readl(&qmgr_regs->statf_h) >> return (__raw_readl(&qmgr_regs->statf_h) >>
(queue - HALF_QUEUES)) & 0x01; (queue - HALF_QUEUES)) & 0x01;
......
...@@ -116,7 +116,11 @@ ...@@ -116,7 +116,11 @@
/* NPE mailbox_status value for reset */ /* NPE mailbox_status value for reset */
#define RESET_MBOX_STAT 0x0000F0F0 #define RESET_MBOX_STAT 0x0000F0F0
const char *npe_names[] = { "NPE-A", "NPE-B", "NPE-C" }; #define NPE_A_FIRMWARE "NPE-A"
#define NPE_B_FIRMWARE "NPE-B"
#define NPE_C_FIRMWARE "NPE-C"
const char *npe_names[] = { NPE_A_FIRMWARE, NPE_B_FIRMWARE, NPE_C_FIRMWARE };
#define print_npe(pri, npe, fmt, ...) \ #define print_npe(pri, npe, fmt, ...) \
printk(pri "%s: " fmt, npe_name(npe), ## __VA_ARGS__) printk(pri "%s: " fmt, npe_name(npe), ## __VA_ARGS__)
...@@ -724,6 +728,9 @@ module_exit(npe_cleanup_module); ...@@ -724,6 +728,9 @@ module_exit(npe_cleanup_module);
MODULE_AUTHOR("Krzysztof Halasa"); MODULE_AUTHOR("Krzysztof Halasa");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_FIRMWARE(NPE_A_FIRMWARE);
MODULE_FIRMWARE(NPE_B_FIRMWARE);
MODULE_FIRMWARE(NPE_C_FIRMWARE);
EXPORT_SYMBOL(npe_names); EXPORT_SYMBOL(npe_names);
EXPORT_SYMBOL(npe_running); EXPORT_SYMBOL(npe_running);
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <mach/qmgr.h> #include <mach/qmgr.h>
struct qmgr_regs __iomem *qmgr_regs; static struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT;
static struct resource *mem_res; static struct resource *mem_res;
static spinlock_t qmgr_lock; static spinlock_t qmgr_lock;
static u32 used_sram_bitmap[4]; /* 128 16-dword pages */ static u32 used_sram_bitmap[4]; /* 128 16-dword pages */
...@@ -293,12 +293,6 @@ static int qmgr_init(void) ...@@ -293,12 +293,6 @@ static int qmgr_init(void)
if (mem_res == NULL) if (mem_res == NULL)
return -EBUSY; return -EBUSY;
qmgr_regs = ioremap(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE);
if (qmgr_regs == NULL) {
err = -ENOMEM;
goto error_map;
}
/* reset qmgr registers */ /* reset qmgr registers */
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
__raw_writel(0x33333333, &qmgr_regs->stat1[i]); __raw_writel(0x33333333, &qmgr_regs->stat1[i]);
...@@ -347,8 +341,6 @@ static int qmgr_init(void) ...@@ -347,8 +341,6 @@ static int qmgr_init(void)
error_irq2: error_irq2:
free_irq(IRQ_IXP4XX_QM1, NULL); free_irq(IRQ_IXP4XX_QM1, NULL);
error_irq: error_irq:
iounmap(qmgr_regs);
error_map:
release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE); release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE);
return err; return err;
} }
...@@ -359,7 +351,6 @@ static void qmgr_remove(void) ...@@ -359,7 +351,6 @@ static void qmgr_remove(void)
free_irq(IRQ_IXP4XX_QM2, NULL); free_irq(IRQ_IXP4XX_QM2, NULL);
synchronize_irq(IRQ_IXP4XX_QM1); synchronize_irq(IRQ_IXP4XX_QM1);
synchronize_irq(IRQ_IXP4XX_QM2); synchronize_irq(IRQ_IXP4XX_QM2);
iounmap(qmgr_regs);
release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE); release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE);
} }
...@@ -369,7 +360,6 @@ module_exit(qmgr_remove); ...@@ -369,7 +360,6 @@ module_exit(qmgr_remove);
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Krzysztof Halasa"); MODULE_AUTHOR("Krzysztof Halasa");
EXPORT_SYMBOL(qmgr_regs);
EXPORT_SYMBOL(qmgr_set_irq); EXPORT_SYMBOL(qmgr_set_irq);
EXPORT_SYMBOL(qmgr_enable_irq); EXPORT_SYMBOL(qmgr_enable_irq);
EXPORT_SYMBOL(qmgr_disable_irq); EXPORT_SYMBOL(qmgr_disable_irq);
......
...@@ -127,12 +127,12 @@ config HW_RANDOM_VIA ...@@ -127,12 +127,12 @@ config HW_RANDOM_VIA
If unsure, say Y. If unsure, say Y.
config HW_RANDOM_IXP4XX config HW_RANDOM_IXP4XX
tristate "Intel IXP4xx NPU HW Random Number Generator support" tristate "Intel IXP4xx NPU HW Pseudo-Random Number Generator support"
depends on HW_RANDOM && ARCH_IXP4XX depends on HW_RANDOM && ARCH_IXP4XX
default HW_RANDOM default HW_RANDOM
---help--- ---help---
This driver provides kernel-side support for the Random This driver provides kernel-side support for the Pseudo-Random
Number Generator hardware found on the Intel IXP4xx NPU. Number Generator hardware found on the Intel IXP45x/46x NPU.
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called ixp4xx-rng. module will be called ixp4xx-rng.
......
...@@ -45,6 +45,9 @@ static int __init ixp4xx_rng_init(void) ...@@ -45,6 +45,9 @@ static int __init ixp4xx_rng_init(void)
void __iomem * rng_base; void __iomem * rng_base;
int err; int err;
if (!cpu_is_ixp46x()) /* includes IXP455 */
return -ENOSYS;
rng_base = ioremap(0x70002100, 4); rng_base = ioremap(0x70002100, 4);
if (!rng_base) if (!rng_base)
return -ENOMEM; return -ENOMEM;
...@@ -68,5 +71,5 @@ module_init(ixp4xx_rng_init); ...@@ -68,5 +71,5 @@ module_init(ixp4xx_rng_init);
module_exit(ixp4xx_rng_exit); module_exit(ixp4xx_rng_exit);
MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>"); MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>");
MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver for IXP4xx"); MODULE_DESCRIPTION("H/W Pseudo-Random Number Generator (RNG) driver for IXP45x/46x");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -224,7 +224,7 @@ config CRYPTO_DEV_TALITOS ...@@ -224,7 +224,7 @@ config CRYPTO_DEV_TALITOS
config CRYPTO_DEV_IXP4XX config CRYPTO_DEV_IXP4XX
tristate "Driver for IXP4xx crypto hardware acceleration" tristate "Driver for IXP4xx crypto hardware acceleration"
depends on ARCH_IXP4XX depends on ARCH_IXP4XX && IXP4XX_QMGR && IXP4XX_NPE
select CRYPTO_DES select CRYPTO_DES
select CRYPTO_ALGAPI select CRYPTO_ALGAPI
select CRYPTO_AUTHENC select CRYPTO_AUTHENC
......
...@@ -750,9 +750,9 @@ static int setup_cipher(struct crypto_tfm *tfm, int encrypt, ...@@ -750,9 +750,9 @@ static int setup_cipher(struct crypto_tfm *tfm, int encrypt,
} }
if (cipher_cfg & MOD_AES) { if (cipher_cfg & MOD_AES) {
switch (key_len) { switch (key_len) {
case 16: keylen_cfg = MOD_AES128 | KEYLEN_128; break; case 16: keylen_cfg = MOD_AES128; break;
case 24: keylen_cfg = MOD_AES192 | KEYLEN_192; break; case 24: keylen_cfg = MOD_AES192; break;
case 32: keylen_cfg = MOD_AES256 | KEYLEN_256; break; case 32: keylen_cfg = MOD_AES256; break;
default: default:
*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
return -EINVAL; return -EINVAL;
......
...@@ -1365,7 +1365,7 @@ static int __devinit hss_init_one(struct platform_device *pdev) ...@@ -1365,7 +1365,7 @@ static int __devinit hss_init_one(struct platform_device *pdev)
platform_set_drvdata(pdev, port); platform_set_drvdata(pdev, port);
netdev_info(dev, "HSS-%i\n", port->id); netdev_info(dev, "initialized\n");
return 0; return 0;
err_free_netdev: err_free_netdev:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment