diff options
Diffstat (limited to 'arch/powerpc/sysdev')
| -rw-r--r-- | arch/powerpc/sysdev/Makefile | 5 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/dart_iommu.c | 74 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_85xx_cache_ctlr.h | 101 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_85xx_cache_sram.c | 159 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_85xx_l2ctlr.c | 231 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_msi.c | 9 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_pci.c | 60 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_pci.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_rio.c | 65 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_soc.c | 20 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/mpc8xxx_gpio.c | 3 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/pmi.c | 2 | 
12 files changed, 677 insertions, 53 deletions
| diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index 5642924fb9fb..0bef9dacb64e 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile | |||
| @@ -1,8 +1,6 @@ | |||
| 1 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror | 1 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror | 
| 2 | 2 | ||
| 3 | ifeq ($(CONFIG_PPC64),y) | 3 | ccflags-$(CONFIG_PPC64) := -mno-minimal-toc | 
| 4 | EXTRA_CFLAGS += -mno-minimal-toc | ||
| 5 | endif | ||
| 6 | 4 | ||
| 7 | mpic-msi-obj-$(CONFIG_PCI_MSI) += mpic_msi.o mpic_u3msi.o mpic_pasemi_msi.o | 5 | mpic-msi-obj-$(CONFIG_PCI_MSI) += mpic_msi.o mpic_u3msi.o mpic_pasemi_msi.o | 
| 8 | obj-$(CONFIG_MPIC) += mpic.o $(mpic-msi-obj-y) | 6 | obj-$(CONFIG_MPIC) += mpic.o $(mpic-msi-obj-y) | 
| @@ -20,6 +18,7 @@ obj-$(CONFIG_FSL_PMC) += fsl_pmc.o | |||
| 20 | obj-$(CONFIG_FSL_LBC) += fsl_lbc.o | 18 | obj-$(CONFIG_FSL_LBC) += fsl_lbc.o | 
| 21 | obj-$(CONFIG_FSL_GTM) += fsl_gtm.o | 19 | obj-$(CONFIG_FSL_GTM) += fsl_gtm.o | 
| 22 | obj-$(CONFIG_MPC8xxx_GPIO) += mpc8xxx_gpio.o | 20 | obj-$(CONFIG_MPC8xxx_GPIO) += mpc8xxx_gpio.o | 
| 21 | obj-$(CONFIG_FSL_85XX_CACHE_SRAM) += fsl_85xx_l2ctlr.o fsl_85xx_cache_sram.o | ||
| 23 | obj-$(CONFIG_SIMPLE_GPIO) += simple_gpio.o | 22 | obj-$(CONFIG_SIMPLE_GPIO) += simple_gpio.o | 
| 24 | obj-$(CONFIG_RAPIDIO) += fsl_rio.o | 23 | obj-$(CONFIG_RAPIDIO) += fsl_rio.o | 
| 25 | obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o | 24 | obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o | 
| diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c index 559db2b846a9..17cf15ec38be 100644 --- a/arch/powerpc/sysdev/dart_iommu.c +++ b/arch/powerpc/sysdev/dart_iommu.c | |||
| @@ -70,6 +70,8 @@ static int iommu_table_dart_inited; | |||
| 70 | static int dart_dirty; | 70 | static int dart_dirty; | 
| 71 | static int dart_is_u4; | 71 | static int dart_is_u4; | 
| 72 | 72 | ||
| 73 | #define DART_U4_BYPASS_BASE 0x8000000000ull | ||
| 74 | |||
| 73 | #define DBG(...) | 75 | #define DBG(...) | 
| 74 | 76 | ||
| 75 | static inline void dart_tlb_invalidate_all(void) | 77 | static inline void dart_tlb_invalidate_all(void) | 
| @@ -292,12 +294,20 @@ static void iommu_table_dart_setup(void) | |||
| 292 | set_bit(iommu_table_dart.it_size - 1, iommu_table_dart.it_map); | 294 | set_bit(iommu_table_dart.it_size - 1, iommu_table_dart.it_map); | 
| 293 | } | 295 | } | 
| 294 | 296 | ||
| 295 | static void pci_dma_dev_setup_dart(struct pci_dev *dev) | 297 | static void dma_dev_setup_dart(struct device *dev) | 
| 296 | { | 298 | { | 
| 297 | /* We only have one iommu table on the mac for now, which makes | 299 | /* We only have one iommu table on the mac for now, which makes | 
| 298 | * things simple. Setup all PCI devices to point to this table | 300 | * things simple. Setup all PCI devices to point to this table | 
| 299 | */ | 301 | */ | 
| 300 | set_iommu_table_base(&dev->dev, &iommu_table_dart); | 302 | if (get_dma_ops(dev) == &dma_direct_ops) | 
| 303 | set_dma_offset(dev, DART_U4_BYPASS_BASE); | ||
| 304 | else | ||
| 305 | set_iommu_table_base(dev, &iommu_table_dart); | ||
| 306 | } | ||
| 307 | |||
| 308 | static void pci_dma_dev_setup_dart(struct pci_dev *dev) | ||
| 309 | { | ||
| 310 | dma_dev_setup_dart(&dev->dev); | ||
| 301 | } | 311 | } | 
| 302 | 312 | ||
| 303 | static void pci_dma_bus_setup_dart(struct pci_bus *bus) | 313 | static void pci_dma_bus_setup_dart(struct pci_bus *bus) | 
| @@ -315,6 +325,45 @@ static void pci_dma_bus_setup_dart(struct pci_bus *bus) | |||
| 315 | PCI_DN(dn)->iommu_table = &iommu_table_dart; | 325 | PCI_DN(dn)->iommu_table = &iommu_table_dart; | 
| 316 | } | 326 | } | 
| 317 | 327 | ||
| 328 | static bool dart_device_on_pcie(struct device *dev) | ||
| 329 | { | ||
| 330 | struct device_node *np = of_node_get(dev->of_node); | ||
| 331 | |||
| 332 | while(np) { | ||
| 333 | if (of_device_is_compatible(np, "U4-pcie") || | ||
| 334 | of_device_is_compatible(np, "u4-pcie")) { | ||
| 335 | of_node_put(np); | ||
| 336 | return true; | ||
| 337 | } | ||
| 338 | np = of_get_next_parent(np); | ||
| 339 | } | ||
| 340 | return false; | ||
| 341 | } | ||
| 342 | |||
| 343 | static int dart_dma_set_mask(struct device *dev, u64 dma_mask) | ||
| 344 | { | ||
| 345 | if (!dev->dma_mask || !dma_supported(dev, dma_mask)) | ||
| 346 | return -EIO; | ||
| 347 | |||
| 348 | /* U4 supports a DART bypass, we use it for 64-bit capable | ||
| 349 | * devices to improve performances. However, that only works | ||
| 350 | * for devices connected to U4 own PCIe interface, not bridged | ||
| 351 | * through hypertransport. We need the device to support at | ||
| 352 | * least 40 bits of addresses. | ||
| 353 | */ | ||
| 354 | if (dart_device_on_pcie(dev) && dma_mask >= DMA_BIT_MASK(40)) { | ||
| 355 | dev_info(dev, "Using 64-bit DMA iommu bypass\n"); | ||
| 356 | set_dma_ops(dev, &dma_direct_ops); | ||
| 357 | } else { | ||
| 358 | dev_info(dev, "Using 32-bit DMA via iommu\n"); | ||
| 359 | set_dma_ops(dev, &dma_iommu_ops); | ||
| 360 | } | ||
| 361 | dma_dev_setup_dart(dev); | ||
| 362 | |||
| 363 | *dev->dma_mask = dma_mask; | ||
| 364 | return 0; | ||
| 365 | } | ||
| 366 | |||
| 318 | void __init iommu_init_early_dart(void) | 367 | void __init iommu_init_early_dart(void) | 
| 319 | { | 368 | { | 
| 320 | struct device_node *dn; | 369 | struct device_node *dn; | 
| @@ -328,20 +377,25 @@ void __init iommu_init_early_dart(void) | |||
| 328 | dart_is_u4 = 1; | 377 | dart_is_u4 = 1; | 
| 329 | } | 378 | } | 
| 330 | 379 | ||
| 380 | /* Initialize the DART HW */ | ||
| 381 | if (dart_init(dn) != 0) | ||
| 382 | goto bail; | ||
| 383 | |||
| 331 | /* Setup low level TCE operations for the core IOMMU code */ | 384 | /* Setup low level TCE operations for the core IOMMU code */ | 
| 332 | ppc_md.tce_build = dart_build; | 385 | ppc_md.tce_build = dart_build; | 
| 333 | ppc_md.tce_free = dart_free; | 386 | ppc_md.tce_free = dart_free; | 
| 334 | ppc_md.tce_flush = dart_flush; | 387 | ppc_md.tce_flush = dart_flush; | 
| 335 | 388 | ||
| 336 | /* Initialize the DART HW */ | 389 | /* Setup bypass if supported */ | 
| 337 | if (dart_init(dn) == 0) { | 390 | if (dart_is_u4) | 
| 338 | ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_dart; | 391 | ppc_md.dma_set_mask = dart_dma_set_mask; | 
| 339 | ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_dart; | ||
| 340 | 392 | ||
| 341 | /* Setup pci_dma ops */ | 393 | ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_dart; | 
| 342 | set_pci_dma_ops(&dma_iommu_ops); | 394 | ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_dart; | 
| 343 | return; | 395 | |
| 344 | } | 396 | /* Setup pci_dma ops */ | 
| 397 | set_pci_dma_ops(&dma_iommu_ops); | ||
| 398 | return; | ||
| 345 | 399 | ||
| 346 | bail: | 400 | bail: | 
| 347 | /* If init failed, use direct iommu and null setup functions */ | 401 | /* If init failed, use direct iommu and null setup functions */ | 
| diff --git a/arch/powerpc/sysdev/fsl_85xx_cache_ctlr.h b/arch/powerpc/sysdev/fsl_85xx_cache_ctlr.h new file mode 100644 index 000000000000..60c9c0bd5ba2 --- /dev/null +++ b/arch/powerpc/sysdev/fsl_85xx_cache_ctlr.h | |||
| @@ -0,0 +1,101 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2009-2010 Freescale Semiconductor, Inc | ||
| 3 | * | ||
| 4 | * QorIQ based Cache Controller Memory Mapped Registers | ||
| 5 | * | ||
| 6 | * Author: Vivek Mahajan <vivek.mahajan@freescale.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify it | ||
| 9 | * under the terms of the GNU General Public License as published by the | ||
| 10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 11 | * option) any later version. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 21 | */ | ||
| 22 | |||
| 23 | #ifndef __FSL_85XX_CACHE_CTLR_H__ | ||
| 24 | #define __FSL_85XX_CACHE_CTLR_H__ | ||
| 25 | |||
| 26 | #define L2CR_L2FI 0x40000000 /* L2 flash invalidate */ | ||
| 27 | #define L2CR_L2IO 0x00200000 /* L2 instruction only */ | ||
| 28 | #define L2CR_SRAM_ZERO 0x00000000 /* L2SRAM zero size */ | ||
| 29 | #define L2CR_SRAM_FULL 0x00010000 /* L2SRAM full size */ | ||
| 30 | #define L2CR_SRAM_HALF 0x00020000 /* L2SRAM half size */ | ||
| 31 | #define L2CR_SRAM_TWO_HALFS 0x00030000 /* L2SRAM two half sizes */ | ||
| 32 | #define L2CR_SRAM_QUART 0x00040000 /* L2SRAM one quarter size */ | ||
| 33 | #define L2CR_SRAM_TWO_QUARTS 0x00050000 /* L2SRAM two quarter size */ | ||
| 34 | #define L2CR_SRAM_EIGHTH 0x00060000 /* L2SRAM one eighth size */ | ||
| 35 | #define L2CR_SRAM_TWO_EIGHTH 0x00070000 /* L2SRAM two eighth size */ | ||
| 36 | |||
| 37 | #define L2SRAM_OPTIMAL_SZ_SHIFT 0x00000003 /* Optimum size for L2SRAM */ | ||
| 38 | |||
| 39 | #define L2SRAM_BAR_MSK_LO18 0xFFFFC000 /* Lower 18 bits */ | ||
| 40 | #define L2SRAM_BARE_MSK_HI4 0x0000000F /* Upper 4 bits */ | ||
| 41 | |||
| 42 | enum cache_sram_lock_ways { | ||
| 43 | LOCK_WAYS_ZERO, | ||
| 44 | LOCK_WAYS_EIGHTH, | ||
| 45 | LOCK_WAYS_TWO_EIGHTH, | ||
| 46 | LOCK_WAYS_HALF = 4, | ||
| 47 | LOCK_WAYS_FULL = 8, | ||
| 48 | }; | ||
| 49 | |||
| 50 | struct mpc85xx_l2ctlr { | ||
| 51 | u32 ctl; /* 0x000 - L2 control */ | ||
| 52 | u8 res1[0xC]; | ||
| 53 | u32 ewar0; /* 0x010 - External write address 0 */ | ||
| 54 | u32 ewarea0; /* 0x014 - External write address extended 0 */ | ||
| 55 | u32 ewcr0; /* 0x018 - External write ctrl */ | ||
| 56 | u8 res2[4]; | ||
| 57 | u32 ewar1; /* 0x020 - External write address 1 */ | ||
| 58 | u32 ewarea1; /* 0x024 - External write address extended 1 */ | ||
| 59 | u32 ewcr1; /* 0x028 - External write ctrl 1 */ | ||
| 60 | u8 res3[4]; | ||
| 61 | u32 ewar2; /* 0x030 - External write address 2 */ | ||
| 62 | u32 ewarea2; /* 0x034 - External write address extended 2 */ | ||
| 63 | u32 ewcr2; /* 0x038 - External write ctrl 2 */ | ||
| 64 | u8 res4[4]; | ||
| 65 | u32 ewar3; /* 0x040 - External write address 3 */ | ||
| 66 | u32 ewarea3; /* 0x044 - External write address extended 3 */ | ||
| 67 | u32 ewcr3; /* 0x048 - External write ctrl 3 */ | ||
| 68 | u8 res5[0xB4]; | ||
| 69 | u32 srbar0; /* 0x100 - SRAM base address 0 */ | ||
| 70 | u32 srbarea0; /* 0x104 - SRAM base addr reg ext address 0 */ | ||
| 71 | u32 srbar1; /* 0x108 - SRAM base address 1 */ | ||
| 72 | u32 srbarea1; /* 0x10C - SRAM base addr reg ext address 1 */ | ||
| 73 | u8 res6[0xCF0]; | ||
| 74 | u32 errinjhi; /* 0xE00 - Error injection mask high */ | ||
| 75 | u32 errinjlo; /* 0xE04 - Error injection mask low */ | ||
| 76 | u32 errinjctl; /* 0xE08 - Error injection tag/ecc control */ | ||
| 77 | u8 res7[0x14]; | ||
| 78 | u32 captdatahi; /* 0xE20 - Error data high capture */ | ||
| 79 | u32 captdatalo; /* 0xE24 - Error data low capture */ | ||
| 80 | u32 captecc; /* 0xE28 - Error syndrome */ | ||
| 81 | u8 res8[0x14]; | ||
| 82 | u32 errdet; /* 0xE40 - Error detect */ | ||
| 83 | u32 errdis; /* 0xE44 - Error disable */ | ||
| 84 | u32 errinten; /* 0xE48 - Error interrupt enable */ | ||
| 85 | u32 errattr; /* 0xE4c - Error attribute capture */ | ||
| 86 | u32 erradrrl; /* 0xE50 - Error address capture low */ | ||
| 87 | u32 erradrrh; /* 0xE54 - Error address capture high */ | ||
| 88 | u32 errctl; /* 0xE58 - Error control */ | ||
| 89 | u8 res9[0x1A4]; | ||
| 90 | }; | ||
| 91 | |||
| 92 | struct sram_parameters { | ||
| 93 | unsigned int sram_size; | ||
| 94 | uint64_t sram_offset; | ||
| 95 | }; | ||
| 96 | |||
| 97 | extern int instantiate_cache_sram(struct platform_device *dev, | ||
| 98 | struct sram_parameters sram_params); | ||
| 99 | extern void remove_cache_sram(struct platform_device *dev); | ||
| 100 | |||
| 101 | #endif /* __FSL_85XX_CACHE_CTLR_H__ */ | ||
| diff --git a/arch/powerpc/sysdev/fsl_85xx_cache_sram.c b/arch/powerpc/sysdev/fsl_85xx_cache_sram.c new file mode 100644 index 000000000000..54fb1922fe30 --- /dev/null +++ b/arch/powerpc/sysdev/fsl_85xx_cache_sram.c | |||
| @@ -0,0 +1,159 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2009-2010 Freescale Semiconductor, Inc. | ||
| 3 | * | ||
| 4 | * Simple memory allocator abstraction for QorIQ (P1/P2) based Cache-SRAM | ||
| 5 | * | ||
| 6 | * Author: Vivek Mahajan <vivek.mahajan@freescale.com> | ||
| 7 | * | ||
| 8 | * This file is derived from the original work done | ||
| 9 | * by Sylvain Munaut for the Bestcomm SRAM allocator. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify it | ||
| 12 | * under the terms of the GNU General Public License as published by the | ||
| 13 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 14 | * option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <linux/kernel.h> | ||
| 27 | #include <linux/slab.h> | ||
| 28 | #include <linux/err.h> | ||
| 29 | #include <linux/of_platform.h> | ||
| 30 | #include <asm/pgtable.h> | ||
| 31 | #include <asm/fsl_85xx_cache_sram.h> | ||
| 32 | |||
| 33 | #include "fsl_85xx_cache_ctlr.h" | ||
| 34 | |||
| 35 | struct mpc85xx_cache_sram *cache_sram; | ||
| 36 | |||
| 37 | void *mpc85xx_cache_sram_alloc(unsigned int size, | ||
| 38 | phys_addr_t *phys, unsigned int align) | ||
| 39 | { | ||
| 40 | unsigned long offset; | ||
| 41 | unsigned long flags; | ||
| 42 | |||
| 43 | if (unlikely(cache_sram == NULL)) | ||
| 44 | return NULL; | ||
| 45 | |||
| 46 | if (!size || (size > cache_sram->size) || (align > cache_sram->size)) { | ||
| 47 | pr_err("%s(): size(=%x) or align(=%x) zero or too big\n", | ||
| 48 | __func__, size, align); | ||
| 49 | return NULL; | ||
| 50 | } | ||
| 51 | |||
| 52 | if ((align & (align - 1)) || align <= 1) { | ||
| 53 | pr_err("%s(): align(=%x) must be power of two and >1\n", | ||
| 54 | __func__, align); | ||
| 55 | return NULL; | ||
| 56 | } | ||
| 57 | |||
| 58 | spin_lock_irqsave(&cache_sram->lock, flags); | ||
| 59 | offset = rh_alloc_align(cache_sram->rh, size, align, NULL); | ||
| 60 | spin_unlock_irqrestore(&cache_sram->lock, flags); | ||
| 61 | |||
| 62 | if (IS_ERR_VALUE(offset)) | ||
| 63 | return NULL; | ||
| 64 | |||
| 65 | *phys = cache_sram->base_phys + offset; | ||
| 66 | |||
| 67 | return (unsigned char *)cache_sram->base_virt + offset; | ||
| 68 | } | ||
| 69 | EXPORT_SYMBOL(mpc85xx_cache_sram_alloc); | ||
| 70 | |||
| 71 | void mpc85xx_cache_sram_free(void *ptr) | ||
| 72 | { | ||
| 73 | unsigned long flags; | ||
| 74 | BUG_ON(!ptr); | ||
| 75 | |||
| 76 | spin_lock_irqsave(&cache_sram->lock, flags); | ||
| 77 | rh_free(cache_sram->rh, ptr - cache_sram->base_virt); | ||
| 78 | spin_unlock_irqrestore(&cache_sram->lock, flags); | ||
| 79 | } | ||
| 80 | EXPORT_SYMBOL(mpc85xx_cache_sram_free); | ||
| 81 | |||
| 82 | int __init instantiate_cache_sram(struct platform_device *dev, | ||
| 83 | struct sram_parameters sram_params) | ||
| 84 | { | ||
| 85 | int ret = 0; | ||
| 86 | |||
| 87 | if (cache_sram) { | ||
| 88 | dev_err(&dev->dev, "Already initialized cache-sram\n"); | ||
| 89 | return -EBUSY; | ||
| 90 | } | ||
| 91 | |||
| 92 | cache_sram = kzalloc(sizeof(struct mpc85xx_cache_sram), GFP_KERNEL); | ||
| 93 | if (!cache_sram) { | ||
| 94 | dev_err(&dev->dev, "Out of memory for cache_sram structure\n"); | ||
| 95 | return -ENOMEM; | ||
| 96 | } | ||
| 97 | |||
| 98 | cache_sram->base_phys = sram_params.sram_offset; | ||
| 99 | cache_sram->size = sram_params.sram_size; | ||
| 100 | |||
| 101 | if (!request_mem_region(cache_sram->base_phys, cache_sram->size, | ||
| 102 | "fsl_85xx_cache_sram")) { | ||
| 103 | dev_err(&dev->dev, "%s: request memory failed\n", | ||
| 104 | dev->dev.of_node->full_name); | ||
| 105 | ret = -ENXIO; | ||
| 106 | goto out_free; | ||
| 107 | } | ||
| 108 | |||
| 109 | cache_sram->base_virt = ioremap_flags(cache_sram->base_phys, | ||
| 110 | cache_sram->size, _PAGE_COHERENT | PAGE_KERNEL); | ||
| 111 | if (!cache_sram->base_virt) { | ||
| 112 | dev_err(&dev->dev, "%s: ioremap_flags failed\n", | ||
| 113 | dev->dev.of_node->full_name); | ||
| 114 | ret = -ENOMEM; | ||
| 115 | goto out_release; | ||
| 116 | } | ||
| 117 | |||
| 118 | cache_sram->rh = rh_create(sizeof(unsigned int)); | ||
| 119 | if (IS_ERR(cache_sram->rh)) { | ||
| 120 | dev_err(&dev->dev, "%s: Unable to create remote heap\n", | ||
| 121 | dev->dev.of_node->full_name); | ||
| 122 | ret = PTR_ERR(cache_sram->rh); | ||
| 123 | goto out_unmap; | ||
| 124 | } | ||
| 125 | |||
| 126 | rh_attach_region(cache_sram->rh, 0, cache_sram->size); | ||
| 127 | spin_lock_init(&cache_sram->lock); | ||
| 128 | |||
| 129 | dev_info(&dev->dev, "[base:0x%llx, size:0x%x] configured and loaded\n", | ||
| 130 | (unsigned long long)cache_sram->base_phys, cache_sram->size); | ||
| 131 | |||
| 132 | return 0; | ||
| 133 | |||
| 134 | out_unmap: | ||
| 135 | iounmap(cache_sram->base_virt); | ||
| 136 | |||
| 137 | out_release: | ||
| 138 | release_mem_region(cache_sram->base_phys, cache_sram->size); | ||
| 139 | |||
| 140 | out_free: | ||
| 141 | kfree(cache_sram); | ||
| 142 | return ret; | ||
| 143 | } | ||
| 144 | |||
| 145 | void remove_cache_sram(struct platform_device *dev) | ||
| 146 | { | ||
| 147 | BUG_ON(!cache_sram); | ||
| 148 | |||
| 149 | rh_detach_region(cache_sram->rh, 0, cache_sram->size); | ||
| 150 | rh_destroy(cache_sram->rh); | ||
| 151 | |||
| 152 | iounmap(cache_sram->base_virt); | ||
| 153 | release_mem_region(cache_sram->base_phys, cache_sram->size); | ||
| 154 | |||
| 155 | kfree(cache_sram); | ||
| 156 | cache_sram = NULL; | ||
| 157 | |||
| 158 | dev_info(&dev->dev, "MPC85xx Cache-SRAM driver unloaded\n"); | ||
| 159 | } | ||
| diff --git a/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c b/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c new file mode 100644 index 000000000000..cc8d6556d799 --- /dev/null +++ b/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c | |||
| @@ -0,0 +1,231 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2009-2010 Freescale Semiconductor, Inc. | ||
| 3 | * | ||
| 4 | * QorIQ (P1/P2) L2 controller init for Cache-SRAM instantiation | ||
| 5 | * | ||
| 6 | * Author: Vivek Mahajan <vivek.mahajan@freescale.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify it | ||
| 9 | * under the terms of the GNU General Public License as published by the | ||
| 10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 11 | * option) any later version. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 21 | */ | ||
| 22 | |||
| 23 | #include <linux/kernel.h> | ||
| 24 | #include <linux/of_platform.h> | ||
| 25 | #include <asm/io.h> | ||
| 26 | |||
| 27 | #include "fsl_85xx_cache_ctlr.h" | ||
| 28 | |||
| 29 | static char *sram_size; | ||
| 30 | static char *sram_offset; | ||
| 31 | struct mpc85xx_l2ctlr __iomem *l2ctlr; | ||
| 32 | |||
| 33 | static long get_cache_sram_size(void) | ||
| 34 | { | ||
| 35 | unsigned long val; | ||
| 36 | |||
| 37 | if (!sram_size || (strict_strtoul(sram_size, 0, &val) < 0)) | ||
| 38 | return -EINVAL; | ||
| 39 | |||
| 40 | return val; | ||
| 41 | } | ||
| 42 | |||
| 43 | static long get_cache_sram_offset(void) | ||
| 44 | { | ||
| 45 | unsigned long val; | ||
| 46 | |||
| 47 | if (!sram_offset || (strict_strtoul(sram_offset, 0, &val) < 0)) | ||
| 48 | return -EINVAL; | ||
| 49 | |||
| 50 | return val; | ||
| 51 | } | ||
| 52 | |||
| 53 | static int __init get_size_from_cmdline(char *str) | ||
| 54 | { | ||
| 55 | if (!str) | ||
| 56 | return 0; | ||
| 57 | |||
| 58 | sram_size = str; | ||
| 59 | return 1; | ||
| 60 | } | ||
| 61 | |||
| 62 | static int __init get_offset_from_cmdline(char *str) | ||
| 63 | { | ||
| 64 | if (!str) | ||
| 65 | return 0; | ||
| 66 | |||
| 67 | sram_offset = str; | ||
| 68 | return 1; | ||
| 69 | } | ||
| 70 | |||
| 71 | __setup("cache-sram-size=", get_size_from_cmdline); | ||
| 72 | __setup("cache-sram-offset=", get_offset_from_cmdline); | ||
| 73 | |||
| 74 | static int __devinit mpc85xx_l2ctlr_of_probe(struct platform_device *dev, | ||
| 75 | const struct of_device_id *match) | ||
| 76 | { | ||
| 77 | long rval; | ||
| 78 | unsigned int rem; | ||
| 79 | unsigned char ways; | ||
| 80 | const unsigned int *prop; | ||
| 81 | unsigned int l2cache_size; | ||
| 82 | struct sram_parameters sram_params; | ||
| 83 | |||
| 84 | if (!dev->dev.of_node) { | ||
| 85 | dev_err(&dev->dev, "Device's OF-node is NULL\n"); | ||
| 86 | return -EINVAL; | ||
| 87 | } | ||
| 88 | |||
| 89 | prop = of_get_property(dev->dev.of_node, "cache-size", NULL); | ||
| 90 | if (!prop) { | ||
| 91 | dev_err(&dev->dev, "Missing L2 cache-size\n"); | ||
| 92 | return -EINVAL; | ||
| 93 | } | ||
| 94 | l2cache_size = *prop; | ||
| 95 | |||
| 96 | sram_params.sram_size = get_cache_sram_size(); | ||
| 97 | if (sram_params.sram_size <= 0) { | ||
| 98 | dev_err(&dev->dev, | ||
| 99 | "Entire L2 as cache, Aborting Cache-SRAM stuff\n"); | ||
| 100 | return -EINVAL; | ||
| 101 | } | ||
| 102 | |||
| 103 | sram_params.sram_offset = get_cache_sram_offset(); | ||
| 104 | if (sram_params.sram_offset <= 0) { | ||
| 105 | dev_err(&dev->dev, | ||
| 106 | "Entire L2 as cache, provide a valid sram offset\n"); | ||
| 107 | return -EINVAL; | ||
| 108 | } | ||
| 109 | |||
| 110 | |||
| 111 | rem = l2cache_size % sram_params.sram_size; | ||
| 112 | ways = LOCK_WAYS_FULL * sram_params.sram_size / l2cache_size; | ||
| 113 | if (rem || (ways & (ways - 1))) { | ||
| 114 | dev_err(&dev->dev, "Illegal cache-sram-size in command line\n"); | ||
| 115 | return -EINVAL; | ||
| 116 | } | ||
| 117 | |||
| 118 | l2ctlr = of_iomap(dev->dev.of_node, 0); | ||
| 119 | if (!l2ctlr) { | ||
| 120 | dev_err(&dev->dev, "Can't map L2 controller\n"); | ||
| 121 | return -EINVAL; | ||
| 122 | } | ||
| 123 | |||
| 124 | /* | ||
| 125 | * Write bits[0-17] to srbar0 | ||
| 126 | */ | ||
| 127 | out_be32(&l2ctlr->srbar0, | ||
| 128 | sram_params.sram_offset & L2SRAM_BAR_MSK_LO18); | ||
| 129 | |||
| 130 | /* | ||
| 131 | * Write bits[18-21] to srbare0 | ||
| 132 | */ | ||
| 133 | #ifdef CONFIG_PHYS_64BIT | ||
| 134 | out_be32(&l2ctlr->srbarea0, | ||
| 135 | (sram_params.sram_offset >> 32) & L2SRAM_BARE_MSK_HI4); | ||
| 136 | #endif | ||
| 137 | |||
| 138 | clrsetbits_be32(&l2ctlr->ctl, L2CR_L2E, L2CR_L2FI); | ||
| 139 | |||
| 140 | switch (ways) { | ||
| 141 | case LOCK_WAYS_EIGHTH: | ||
| 142 | setbits32(&l2ctlr->ctl, | ||
| 143 | L2CR_L2E | L2CR_L2FI | L2CR_SRAM_EIGHTH); | ||
| 144 | break; | ||
| 145 | |||
| 146 | case LOCK_WAYS_TWO_EIGHTH: | ||
| 147 | setbits32(&l2ctlr->ctl, | ||
| 148 | L2CR_L2E | L2CR_L2FI | L2CR_SRAM_QUART); | ||
| 149 | break; | ||
| 150 | |||
| 151 | case LOCK_WAYS_HALF: | ||
| 152 | setbits32(&l2ctlr->ctl, | ||
| 153 | L2CR_L2E | L2CR_L2FI | L2CR_SRAM_HALF); | ||
| 154 | break; | ||
| 155 | |||
| 156 | case LOCK_WAYS_FULL: | ||
| 157 | default: | ||
| 158 | setbits32(&l2ctlr->ctl, | ||
| 159 | L2CR_L2E | L2CR_L2FI | L2CR_SRAM_FULL); | ||
| 160 | break; | ||
| 161 | } | ||
| 162 | eieio(); | ||
| 163 | |||
| 164 | rval = instantiate_cache_sram(dev, sram_params); | ||
| 165 | if (rval < 0) { | ||
| 166 | dev_err(&dev->dev, "Can't instantiate Cache-SRAM\n"); | ||
| 167 | iounmap(l2ctlr); | ||
| 168 | return -EINVAL; | ||
| 169 | } | ||
| 170 | |||
| 171 | return 0; | ||
| 172 | } | ||
| 173 | |||
| 174 | static int __devexit mpc85xx_l2ctlr_of_remove(struct platform_device *dev) | ||
| 175 | { | ||
| 176 | BUG_ON(!l2ctlr); | ||
| 177 | |||
| 178 | iounmap(l2ctlr); | ||
| 179 | remove_cache_sram(dev); | ||
| 180 | dev_info(&dev->dev, "MPC85xx L2 controller unloaded\n"); | ||
| 181 | |||
| 182 | return 0; | ||
| 183 | } | ||
| 184 | |||
| 185 | static struct of_device_id mpc85xx_l2ctlr_of_match[] = { | ||
| 186 | { | ||
| 187 | .compatible = "fsl,p2020-l2-cache-controller", | ||
| 188 | }, | ||
| 189 | { | ||
| 190 | .compatible = "fsl,p2010-l2-cache-controller", | ||
| 191 | }, | ||
| 192 | { | ||
| 193 | .compatible = "fsl,p1020-l2-cache-controller", | ||
| 194 | }, | ||
| 195 | { | ||
| 196 | .compatible = "fsl,p1011-l2-cache-controller", | ||
| 197 | }, | ||
| 198 | { | ||
| 199 | .compatible = "fsl,p1013-l2-cache-controller", | ||
| 200 | }, | ||
| 201 | { | ||
| 202 | .compatible = "fsl,p1022-l2-cache-controller", | ||
| 203 | }, | ||
| 204 | {}, | ||
| 205 | }; | ||
| 206 | |||
| 207 | static struct of_platform_driver mpc85xx_l2ctlr_of_platform_driver = { | ||
| 208 | .driver = { | ||
| 209 | .name = "fsl-l2ctlr", | ||
| 210 | .owner = THIS_MODULE, | ||
| 211 | .of_match_table = mpc85xx_l2ctlr_of_match, | ||
| 212 | }, | ||
| 213 | .probe = mpc85xx_l2ctlr_of_probe, | ||
| 214 | .remove = __devexit_p(mpc85xx_l2ctlr_of_remove), | ||
| 215 | }; | ||
| 216 | |||
| 217 | static __init int mpc85xx_l2ctlr_of_init(void) | ||
| 218 | { | ||
| 219 | return of_register_platform_driver(&mpc85xx_l2ctlr_of_platform_driver); | ||
| 220 | } | ||
| 221 | |||
| 222 | static void __exit mpc85xx_l2ctlr_of_exit(void) | ||
| 223 | { | ||
| 224 | of_unregister_platform_driver(&mpc85xx_l2ctlr_of_platform_driver); | ||
| 225 | } | ||
| 226 | |||
| 227 | subsys_initcall(mpc85xx_l2ctlr_of_init); | ||
| 228 | module_exit(mpc85xx_l2ctlr_of_exit); | ||
| 229 | |||
| 230 | MODULE_DESCRIPTION("Freescale MPC85xx L2 controller init"); | ||
| 231 | MODULE_LICENSE("GPL v2"); | ||
| diff --git a/arch/powerpc/sysdev/fsl_msi.c b/arch/powerpc/sysdev/fsl_msi.c index bdbd896c89d8..108d76fa8f1c 100644 --- a/arch/powerpc/sysdev/fsl_msi.c +++ b/arch/powerpc/sysdev/fsl_msi.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <asm/ppc-pci.h> | 24 | #include <asm/ppc-pci.h> | 
| 25 | #include <asm/mpic.h> | 25 | #include <asm/mpic.h> | 
| 26 | #include "fsl_msi.h" | 26 | #include "fsl_msi.h" | 
| 27 | #include "fsl_pci.h" | ||
| 27 | 28 | ||
| 28 | LIST_HEAD(msi_head); | 29 | LIST_HEAD(msi_head); | 
| 29 | 30 | ||
| @@ -125,13 +126,11 @@ static void fsl_compose_msi_msg(struct pci_dev *pdev, int hwirq, | |||
| 125 | { | 126 | { | 
| 126 | struct fsl_msi *msi_data = fsl_msi_data; | 127 | struct fsl_msi *msi_data = fsl_msi_data; | 
| 127 | struct pci_controller *hose = pci_bus_to_host(pdev->bus); | 128 | struct pci_controller *hose = pci_bus_to_host(pdev->bus); | 
| 128 | u32 base = 0; | 129 | u64 base = fsl_pci_immrbar_base(hose); | 
| 129 | 130 | ||
| 130 | pci_bus_read_config_dword(hose->bus, | 131 | msg->address_lo = msi_data->msi_addr_lo + lower_32_bits(base); | 
| 131 | PCI_DEVFN(0, 0), PCI_BASE_ADDRESS_0, &base); | 132 | msg->address_hi = msi_data->msi_addr_hi + upper_32_bits(base); | 
| 132 | 133 | ||
| 133 | msg->address_lo = msi_data->msi_addr_lo + base; | ||
| 134 | msg->address_hi = msi_data->msi_addr_hi; | ||
| 135 | msg->data = hwirq; | 134 | msg->data = hwirq; | 
| 136 | 135 | ||
| 137 | pr_debug("%s: allocated srs: %d, ibs: %d\n", | 136 | pr_debug("%s: allocated srs: %d, ibs: %d\n", | 
| diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 4ae933225251..818f7c6c8fa1 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* | 
| 2 | * MPC83xx/85xx/86xx PCI/PCIE support routing. | 2 | * MPC83xx/85xx/86xx PCI/PCIE support routing. | 
| 3 | * | 3 | * | 
| 4 | * Copyright 2007-2009 Freescale Semiconductor, Inc. | 4 | * Copyright 2007-2010 Freescale Semiconductor, Inc. | 
| 5 | * Copyright 2008-2009 MontaVista Software, Inc. | 5 | * Copyright 2008-2009 MontaVista Software, Inc. | 
| 6 | * | 6 | * | 
| 7 | * Initial author: Xianghua Xiao <x.xiao@freescale.com> | 7 | * Initial author: Xianghua Xiao <x.xiao@freescale.com> | 
| @@ -34,7 +34,7 @@ | |||
| 34 | #include <sysdev/fsl_soc.h> | 34 | #include <sysdev/fsl_soc.h> | 
| 35 | #include <sysdev/fsl_pci.h> | 35 | #include <sysdev/fsl_pci.h> | 
| 36 | 36 | ||
| 37 | static int fsl_pcie_bus_fixup; | 37 | static int fsl_pcie_bus_fixup, is_mpc83xx_pci; | 
| 38 | 38 | ||
| 39 | static void __init quirk_fsl_pcie_header(struct pci_dev *dev) | 39 | static void __init quirk_fsl_pcie_header(struct pci_dev *dev) | 
| 40 | { | 40 | { | 
| @@ -407,10 +407,18 @@ DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010E, quirk_fsl_pcie_header); | |||
| 407 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010, quirk_fsl_pcie_header); | 407 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010, quirk_fsl_pcie_header); | 
| 408 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020E, quirk_fsl_pcie_header); | 408 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020E, quirk_fsl_pcie_header); | 
| 409 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020, quirk_fsl_pcie_header); | 409 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020, quirk_fsl_pcie_header); | 
| 410 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2040E, quirk_fsl_pcie_header); | ||
| 411 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2040, quirk_fsl_pcie_header); | ||
| 412 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P3041E, quirk_fsl_pcie_header); | ||
| 413 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P3041, quirk_fsl_pcie_header); | ||
| 410 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040E, quirk_fsl_pcie_header); | 414 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040E, quirk_fsl_pcie_header); | 
| 411 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040, quirk_fsl_pcie_header); | 415 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040, quirk_fsl_pcie_header); | 
| 412 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080E, quirk_fsl_pcie_header); | 416 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080E, quirk_fsl_pcie_header); | 
| 413 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080, quirk_fsl_pcie_header); | 417 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080, quirk_fsl_pcie_header); | 
| 418 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5010E, quirk_fsl_pcie_header); | ||
| 419 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5010, quirk_fsl_pcie_header); | ||
| 420 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5020E, quirk_fsl_pcie_header); | ||
| 421 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5020, quirk_fsl_pcie_header); | ||
| 414 | #endif /* CONFIG_FSL_SOC_BOOKE || CONFIG_PPC_86xx */ | 422 | #endif /* CONFIG_FSL_SOC_BOOKE || CONFIG_PPC_86xx */ | 
| 415 | 423 | ||
| 416 | #if defined(CONFIG_PPC_83xx) || defined(CONFIG_PPC_MPC512x) | 424 | #if defined(CONFIG_PPC_83xx) || defined(CONFIG_PPC_MPC512x) | 
| @@ -430,6 +438,13 @@ struct mpc83xx_pcie_priv { | |||
| 430 | u32 dev_base; | 438 | u32 dev_base; | 
| 431 | }; | 439 | }; | 
| 432 | 440 | ||
| 441 | struct pex_inbound_window { | ||
| 442 | u32 ar; | ||
| 443 | u32 tar; | ||
| 444 | u32 barl; | ||
| 445 | u32 barh; | ||
| 446 | }; | ||
| 447 | |||
| 433 | /* | 448 | /* | 
| 434 | * With the convention of u-boot, the PCIE outbound window 0 serves | 449 | * With the convention of u-boot, the PCIE outbound window 0 serves | 
| 435 | * as configuration transactions outbound. | 450 | * as configuration transactions outbound. | 
| @@ -437,6 +452,8 @@ struct mpc83xx_pcie_priv { | |||
| 437 | #define PEX_OUTWIN0_BAR 0xCA4 | 452 | #define PEX_OUTWIN0_BAR 0xCA4 | 
| 438 | #define PEX_OUTWIN0_TAL 0xCA8 | 453 | #define PEX_OUTWIN0_TAL 0xCA8 | 
| 439 | #define PEX_OUTWIN0_TAH 0xCAC | 454 | #define PEX_OUTWIN0_TAH 0xCAC | 
| 455 | #define PEX_RC_INWIN_BASE 0xE60 | ||
| 456 | #define PEX_RCIWARn_EN 0x1 | ||
| 440 | 457 | ||
| 441 | static int mpc83xx_pcie_exclude_device(struct pci_bus *bus, unsigned int devfn) | 458 | static int mpc83xx_pcie_exclude_device(struct pci_bus *bus, unsigned int devfn) | 
| 442 | { | 459 | { | 
| @@ -604,6 +621,8 @@ int __init mpc83xx_add_bridge(struct device_node *dev) | |||
| 604 | const int *bus_range; | 621 | const int *bus_range; | 
| 605 | int primary; | 622 | int primary; | 
| 606 | 623 | ||
| 624 | is_mpc83xx_pci = 1; | ||
| 625 | |||
| 607 | if (!of_device_is_available(dev)) { | 626 | if (!of_device_is_available(dev)) { | 
| 608 | pr_warning("%s: disabled by the firmware.\n", | 627 | pr_warning("%s: disabled by the firmware.\n", | 
| 609 | dev->full_name); | 628 | dev->full_name); | 
| @@ -683,3 +702,40 @@ err0: | |||
| 683 | return ret; | 702 | return ret; | 
| 684 | } | 703 | } | 
| 685 | #endif /* CONFIG_PPC_83xx */ | 704 | #endif /* CONFIG_PPC_83xx */ | 
| 705 | |||
| 706 | u64 fsl_pci_immrbar_base(struct pci_controller *hose) | ||
| 707 | { | ||
| 708 | #ifdef CONFIG_PPC_83xx | ||
| 709 | if (is_mpc83xx_pci) { | ||
| 710 | struct mpc83xx_pcie_priv *pcie = hose->dn->data; | ||
| 711 | struct pex_inbound_window *in; | ||
| 712 | int i; | ||
| 713 | |||
| 714 | /* Walk the Root Complex Inbound windows to match IMMR base */ | ||
| 715 | in = pcie->cfg_type0 + PEX_RC_INWIN_BASE; | ||
| 716 | for (i = 0; i < 4; i++) { | ||
| 717 | /* not enabled, skip */ | ||
| 718 | if (!in_le32(&in[i].ar) & PEX_RCIWARn_EN) | ||
| 719 | continue; | ||
| 720 | |||
| 721 | if (get_immrbase() == in_le32(&in[i].tar)) | ||
| 722 | return (u64)in_le32(&in[i].barh) << 32 | | ||
| 723 | in_le32(&in[i].barl); | ||
| 724 | } | ||
| 725 | |||
| 726 | printk(KERN_WARNING "could not find PCI BAR matching IMMR\n"); | ||
| 727 | } | ||
| 728 | #endif | ||
| 729 | |||
| 730 | #if defined(CONFIG_FSL_SOC_BOOKE) || defined(CONFIG_PPC_86xx) | ||
| 731 | if (!is_mpc83xx_pci) { | ||
| 732 | u32 base; | ||
| 733 | |||
| 734 | pci_bus_read_config_dword(hose->bus, | ||
| 735 | PCI_DEVFN(0, 0), PCI_BASE_ADDRESS_0, &base); | ||
| 736 | return base; | ||
| 737 | } | ||
| 738 | #endif | ||
| 739 | |||
| 740 | return 0; | ||
| 741 | } | ||
| diff --git a/arch/powerpc/sysdev/fsl_pci.h b/arch/powerpc/sysdev/fsl_pci.h index a9d8bbebed80..8ad72a11f77b 100644 --- a/arch/powerpc/sysdev/fsl_pci.h +++ b/arch/powerpc/sysdev/fsl_pci.h | |||
| @@ -88,6 +88,7 @@ struct ccsr_pci { | |||
| 88 | extern int fsl_add_bridge(struct device_node *dev, int is_primary); | 88 | extern int fsl_add_bridge(struct device_node *dev, int is_primary); | 
| 89 | extern void fsl_pcibios_fixup_bus(struct pci_bus *bus); | 89 | extern void fsl_pcibios_fixup_bus(struct pci_bus *bus); | 
| 90 | extern int mpc83xx_add_bridge(struct device_node *dev); | 90 | extern int mpc83xx_add_bridge(struct device_node *dev); | 
| 91 | u64 fsl_pci_immrbar_base(struct pci_controller *hose); | ||
| 91 | 92 | ||
| 92 | #endif /* __POWERPC_FSL_PCI_H */ | 93 | #endif /* __POWERPC_FSL_PCI_H */ | 
| 93 | #endif /* __KERNEL__ */ | 94 | #endif /* __KERNEL__ */ | 
| diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index 3017532319c8..412763672d23 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c | |||
| @@ -117,44 +117,59 @@ struct rio_atmu_regs { | |||
| 117 | }; | 117 | }; | 
| 118 | 118 | ||
| 119 | struct rio_msg_regs { | 119 | struct rio_msg_regs { | 
| 120 | u32 omr; | 120 | u32 omr; /* 0xD_3000 - Outbound message 0 mode register */ | 
| 121 | u32 osr; | 121 | u32 osr; /* 0xD_3004 - Outbound message 0 status register */ | 
| 122 | u32 pad1; | 122 | u32 pad1; | 
| 123 | u32 odqdpar; | 123 | u32 odqdpar; /* 0xD_300C - Outbound message 0 descriptor queue | 
| 124 | dequeue pointer address register */ | ||
| 124 | u32 pad2; | 125 | u32 pad2; | 
| 125 | u32 osar; | 126 | u32 osar; /* 0xD_3014 - Outbound message 0 source address | 
| 126 | u32 odpr; | 127 | register */ | 
| 127 | u32 odatr; | 128 | u32 odpr; /* 0xD_3018 - Outbound message 0 destination port | 
| 128 | u32 odcr; | 129 | register */ | 
| 130 | u32 odatr; /* 0xD_301C - Outbound message 0 destination attributes | ||
| 131 | Register*/ | ||
| 132 | u32 odcr; /* 0xD_3020 - Outbound message 0 double-word count | ||
| 133 | register */ | ||
| 129 | u32 pad3; | 134 | u32 pad3; | 
| 130 | u32 odqepar; | 135 | u32 odqepar; /* 0xD_3028 - Outbound message 0 descriptor queue | 
| 136 | enqueue pointer address register */ | ||
| 131 | u32 pad4[13]; | 137 | u32 pad4[13]; | 
| 132 | u32 imr; | 138 | u32 imr; /* 0xD_3060 - Inbound message 0 mode register */ | 
| 133 | u32 isr; | 139 | u32 isr; /* 0xD_3064 - Inbound message 0 status register */ | 
| 134 | u32 pad5; | 140 | u32 pad5; | 
| 135 | u32 ifqdpar; | 141 | u32 ifqdpar; /* 0xD_306C - Inbound message 0 frame queue dequeue | 
| 142 | pointer address register*/ | ||
| 136 | u32 pad6; | 143 | u32 pad6; | 
| 137 | u32 ifqepar; | 144 | u32 ifqepar; /* 0xD_3074 - Inbound message 0 frame queue enqueue | 
| 145 | pointer address register */ | ||
| 138 | u32 pad7[226]; | 146 | u32 pad7[226]; | 
| 139 | u32 odmr; | 147 | u32 odmr; /* 0xD_3400 - Outbound doorbell mode register */ | 
| 140 | u32 odsr; | 148 | u32 odsr; /* 0xD_3404 - Outbound doorbell status register */ | 
| 141 | u32 res0[4]; | 149 | u32 res0[4]; | 
| 142 | u32 oddpr; | 150 | u32 oddpr; /* 0xD_3418 - Outbound doorbell destination port | 
| 143 | u32 oddatr; | 151 | register */ | 
| 152 | u32 oddatr; /* 0xD_341c - Outbound doorbell destination attributes | ||
| 153 | register */ | ||
| 144 | u32 res1[3]; | 154 | u32 res1[3]; | 
| 145 | u32 odretcr; | 155 | u32 odretcr; /* 0xD_342C - Outbound doorbell retry error threshold | 
| 156 | configuration register */ | ||
| 146 | u32 res2[12]; | 157 | u32 res2[12]; | 
| 147 | u32 dmr; | 158 | u32 dmr; /* 0xD_3460 - Inbound doorbell mode register */ | 
| 148 | u32 dsr; | 159 | u32 dsr; /* 0xD_3464 - Inbound doorbell status register */ | 
| 149 | u32 pad8; | 160 | u32 pad8; | 
| 150 | u32 dqdpar; | 161 | u32 dqdpar; /* 0xD_346C - Inbound doorbell queue dequeue Pointer | 
| 162 | address register */ | ||
| 151 | u32 pad9; | 163 | u32 pad9; | 
| 152 | u32 dqepar; | 164 | u32 dqepar; /* 0xD_3474 - Inbound doorbell Queue enqueue pointer | 
| 165 | address register */ | ||
| 153 | u32 pad10[26]; | 166 | u32 pad10[26]; | 
| 154 | u32 pwmr; | 167 | u32 pwmr; /* 0xD_34E0 - Inbound port-write mode register */ | 
| 155 | u32 pwsr; | 168 | u32 pwsr; /* 0xD_34E4 - Inbound port-write status register */ | 
| 156 | u32 epwqbar; | 169 | u32 epwqbar; /* 0xD_34E8 - Extended Port-Write Queue Base Address | 
| 157 | u32 pwqbar; | 170 | register */ | 
| 171 | u32 pwqbar; /* 0xD_34EC - Inbound port-write queue base address | ||
| 172 | register */ | ||
| 158 | }; | 173 | }; | 
| 159 | 174 | ||
| 160 | struct rio_tx_desc { | 175 | struct rio_tx_desc { | 
| diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c index b91f7acdda6f..6c67d9ebf166 100644 --- a/arch/powerpc/sysdev/fsl_soc.c +++ b/arch/powerpc/sysdev/fsl_soc.c | |||
| @@ -378,17 +378,23 @@ static __be32 __iomem *rstcr; | |||
| 378 | static int __init setup_rstcr(void) | 378 | static int __init setup_rstcr(void) | 
| 379 | { | 379 | { | 
| 380 | struct device_node *np; | 380 | struct device_node *np; | 
| 381 | np = of_find_node_by_name(NULL, "global-utilities"); | 381 | |
| 382 | if ((np && of_get_property(np, "fsl,has-rstcr", NULL))) { | 382 | for_each_node_by_name(np, "global-utilities") { | 
| 383 | rstcr = of_iomap(np, 0) + 0xb0; | 383 | if ((of_get_property(np, "fsl,has-rstcr", NULL))) { | 
| 384 | if (!rstcr) | 384 | rstcr = of_iomap(np, 0) + 0xb0; | 
| 385 | printk (KERN_EMERG "Error: reset control register " | 385 | if (!rstcr) | 
| 386 | "not mapped!\n"); | 386 | printk (KERN_ERR "Error: reset control " | 
| 387 | } else if (ppc_md.restart == fsl_rstcr_restart) | 387 | "register not mapped!\n"); | 
| 388 | break; | ||
| 389 | } | ||
| 390 | } | ||
| 391 | |||
| 392 | if (!rstcr && ppc_md.restart == fsl_rstcr_restart) | ||
| 388 | printk(KERN_ERR "No RSTCR register, warm reboot won't work\n"); | 393 | printk(KERN_ERR "No RSTCR register, warm reboot won't work\n"); | 
| 389 | 394 | ||
| 390 | if (np) | 395 | if (np) | 
| 391 | of_node_put(np); | 396 | of_node_put(np); | 
| 397 | |||
| 392 | return 0; | 398 | return 0; | 
| 393 | } | 399 | } | 
| 394 | 400 | ||
| diff --git a/arch/powerpc/sysdev/mpc8xxx_gpio.c b/arch/powerpc/sysdev/mpc8xxx_gpio.c index 2b69084d0f0c..c0ea05e87f1d 100644 --- a/arch/powerpc/sysdev/mpc8xxx_gpio.c +++ b/arch/powerpc/sysdev/mpc8xxx_gpio.c | |||
| @@ -330,6 +330,9 @@ static int __init mpc8xxx_add_gpiochips(void) | |||
| 330 | for_each_compatible_node(np, NULL, "fsl,mpc8610-gpio") | 330 | for_each_compatible_node(np, NULL, "fsl,mpc8610-gpio") | 
| 331 | mpc8xxx_add_controller(np); | 331 | mpc8xxx_add_controller(np); | 
| 332 | 332 | ||
| 333 | for_each_compatible_node(np, NULL, "fsl,qoriq-gpio") | ||
| 334 | mpc8xxx_add_controller(np); | ||
| 335 | |||
| 333 | return 0; | 336 | return 0; | 
| 334 | } | 337 | } | 
| 335 | arch_initcall(mpc8xxx_add_gpiochips); | 338 | arch_initcall(mpc8xxx_add_gpiochips); | 
| diff --git a/arch/powerpc/sysdev/pmi.c b/arch/powerpc/sysdev/pmi.c index 24a0bb955b18..4260f368db52 100644 --- a/arch/powerpc/sysdev/pmi.c +++ b/arch/powerpc/sysdev/pmi.c | |||
| @@ -114,7 +114,7 @@ static void pmi_notify_handlers(struct work_struct *work) | |||
| 114 | 114 | ||
| 115 | spin_lock(&data->handler_spinlock); | 115 | spin_lock(&data->handler_spinlock); | 
| 116 | list_for_each_entry(handler, &data->handler, node) { | 116 | list_for_each_entry(handler, &data->handler, node) { | 
| 117 | pr_debug(KERN_INFO "pmi: notifying handler %p\n", handler); | 117 | pr_debug("pmi: notifying handler %p\n", handler); | 
| 118 | if (handler->type == data->msg.type) | 118 | if (handler->type == data->msg.type) | 
| 119 | handler->handle_pmi_message(data->msg); | 119 | handler->handle_pmi_message(data->msg); | 
| 120 | } | 120 | } | 
