Changeset 44720


Ignore:
Timestamp:
2015-03-13T04:00:43+01:00 (3 years ago)
Author:
nbd
Message:

atheros: v3.18: remap PCI controller MMR memory

Honestly remap PCI controller MMR and use accessor functions to interact
with registers.

Signed-off-by: Sergey Ryazanov <ryazanov.s.a@…>

Location:
trunk/target/linux/atheros/patches-3.18
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/atheros/patches-3.18/100-board.patch

    r44717 r44720  
    630630--- /dev/null 
    631631+++ b/arch/mips/include/asm/mach-ath25/ar2315_regs.h 
    632 @@ -0,0 +1,510 @@ 
     632@@ -0,0 +1,511 @@ 
    633633+/* 
    634634+ * Register definitions for AR2315+ 
     
    676676+#define AR2315_WLAN0            0x10000000      /* Wireless MMR */ 
    677677+#define AR2315_PCI              0x10100000      /* PCI MMR */ 
     678+#define AR2315_PCI_SIZE                0x00001000 
    678679+#define AR2315_SDRAMCTL         0x10300000      /* SDRAM MMR */ 
    679680+#define AR2315_LOCAL            0x10400000      /* LOCAL BUS MMR */ 
  • trunk/target/linux/atheros/patches-3.18/105-ar2315_pci.patch

    r44719 r44720  
    1111--- /dev/null 
    1212+++ b/arch/mips/pci/pci-ar2315.c 
    13 @@ -0,0 +1,445 @@ 
     13@@ -0,0 +1,482 @@ 
    1414+/* 
    1515+ * This program is free software; you can redistribute it and/or 
     
    6868+ * PCI Bus Interface Registers 
    6969+ */ 
    70 +#define AR2315_PCI_1MS_REG             (AR2315_PCI + 0x0008) 
     70+#define AR2315_PCI_1MS_REG             0x0008 
    7171+ 
    7272+#define AR2315_PCI_1MS_MASK            0x3FFFF /* # of AHB clk cycles in 1ms */ 
    7373+ 
    74 +#define AR2315_PCI_MISC_CONFIG         (AR2315_PCI + 0x000c) 
     74+#define AR2315_PCI_MISC_CONFIG         0x000c 
    7575+ 
    7676+#define AR2315_PCIMISC_TXD_EN  0x00000001      /* Enable TXD for fragments */ 
     
    8888+                                                * disable */ 
    8989+ 
    90 +#define AR2315_PCI_OUT_TSTAMP          (AR2315_PCI + 0x0010) 
    91 + 
    92 +#define AR2315_PCI_UNCACHE_CFG         (AR2315_PCI + 0x0014) 
    93 + 
    94 +#define AR2315_PCI_IN_EN               (AR2315_PCI + 0x0100) 
     90+#define AR2315_PCI_OUT_TSTAMP          0x0010 
     91+ 
     92+#define AR2315_PCI_UNCACHE_CFG         0x0014 
     93+ 
     94+#define AR2315_PCI_IN_EN               0x0100 
    9595+ 
    9696+#define AR2315_PCI_IN_EN0      0x01    /* Enable chain 0 */ 
     
    9999+#define AR2315_PCI_IN_EN3      0x08    /* Enable chain 3 */ 
    100100+ 
    101 +#define AR2315_PCI_IN_DIS              (AR2315_PCI + 0x0104) 
     101+#define AR2315_PCI_IN_DIS              0x0104 
    102102+ 
    103103+#define AR2315_PCI_IN_DIS0     0x01    /* Disable chain 0 */ 
     
    106106+#define AR2315_PCI_IN_DIS3     0x08    /* Disable chain 3 */ 
    107107+ 
    108 +#define AR2315_PCI_IN_PTR              (AR2315_PCI + 0x0200) 
    109 + 
    110 +#define AR2315_PCI_OUT_EN              (AR2315_PCI + 0x0400) 
     108+#define AR2315_PCI_IN_PTR              0x0200 
     109+ 
     110+#define AR2315_PCI_OUT_EN              0x0400 
    111111+ 
    112112+#define AR2315_PCI_OUT_EN0     0x01    /* Enable chain 0 */ 
    113113+ 
    114 +#define AR2315_PCI_OUT_DIS             (AR2315_PCI + 0x0404) 
     114+#define AR2315_PCI_OUT_DIS             0x0404 
    115115+ 
    116116+#define AR2315_PCI_OUT_DIS0    0x01    /* Disable chain 0 */ 
    117117+ 
    118 +#define AR2315_PCI_OUT_PTR             (AR2315_PCI + 0x0408) 
     118+#define AR2315_PCI_OUT_PTR             0x0408 
    119119+ 
    120120+/* PCI interrupt status (write one to clear) */ 
    121 +#define AR2315_PCI_ISR                 (AR2315_PCI + 0x0500) 
     121+#define AR2315_PCI_ISR                 0x0500 
    122122+ 
    123123+#define AR2315_PCI_INT_TX      0x00000001      /* Desc In Completed */ 
     
    135135+ 
    136136+/* PCI interrupt mask */ 
    137 +#define AR2315_PCI_IMR                 (AR2315_PCI + 0x0504) 
     137+#define AR2315_PCI_IMR                 0x0504 
    138138+ 
    139139+/* Global PCI interrupt enable */ 
    140 +#define AR2315_PCI_IER                 (AR2315_PCI + 0x0508) 
     140+#define AR2315_PCI_IER                 0x0508 
    141141+ 
    142142+#define AR2315_PCI_IER_DISABLE         0x00    /* disable pci interrupts */ 
    143143+#define AR2315_PCI_IER_ENABLE          0x01    /* enable pci interrupts */ 
    144144+ 
    145 +#define AR2315_PCI_HOST_IN_EN          (AR2315_PCI + 0x0800) 
    146 +#define AR2315_PCI_HOST_IN_DIS         (AR2315_PCI + 0x0804) 
    147 +#define AR2315_PCI_HOST_IN_PTR         (AR2315_PCI + 0x0810) 
    148 +#define AR2315_PCI_HOST_OUT_EN         (AR2315_PCI + 0x0900) 
    149 +#define AR2315_PCI_HOST_OUT_DIS                (AR2315_PCI + 0x0904) 
    150 +#define AR2315_PCI_HOST_OUT_PTR                (AR2315_PCI + 0x0908) 
     145+#define AR2315_PCI_HOST_IN_EN          0x0800 
     146+#define AR2315_PCI_HOST_IN_DIS         0x0804 
     147+#define AR2315_PCI_HOST_IN_PTR         0x0810 
     148+#define AR2315_PCI_HOST_OUT_EN         0x0900 
     149+#define AR2315_PCI_HOST_OUT_DIS                0x0904 
     150+#define AR2315_PCI_HOST_OUT_PTR                0x0908 
    151151+ 
    152152+/* 
     
    175175+struct ar2315_pci_ctrl { 
    176176+       void __iomem *cfg_mem; 
     177+       void __iomem *mmr_mem; 
    177178+       struct pci_controller pci_ctrl; 
    178179+       struct resource mem_res; 
     
    185186+ 
    186187+       return container_of(hose, struct ar2315_pci_ctrl, pci_ctrl); 
     188+} 
     189+ 
     190+static inline u32 ar2315_pci_reg_read(struct ar2315_pci_ctrl *apc, u32 reg) 
     191+{ 
     192+       return __raw_readl(apc->mmr_mem + reg); 
     193+} 
     194+ 
     195+static inline void ar2315_pci_reg_write(struct ar2315_pci_ctrl *apc, u32 reg, 
     196+                                       u32 val) 
     197+{ 
     198+       __raw_writel(val, apc->mmr_mem + reg); 
     199+} 
     200+ 
     201+static inline void ar2315_pci_reg_mask(struct ar2315_pci_ctrl *apc, u32 reg, 
     202+                                      u32 mask, u32 val) 
     203+{ 
     204+       u32 ret = ar2315_pci_reg_read(apc, reg); 
     205+ 
     206+       ret &= ~mask; 
     207+       ret |= val; 
     208+       ar2315_pci_reg_write(apc, reg, ret); 
    187209+} 
    188210+ 
     
    202224+ 
    203225+       /* Clear pending errors */ 
    204 +       ar231x_write_reg(AR2315_PCI_ISR, AR2315_PCI_INT_ABORT); 
     226+       ar2315_pci_reg_write(apc, AR2315_PCI_ISR, AR2315_PCI_INT_ABORT); 
    205227+       /* Select Configuration access */ 
    206 +       ar231x_mask_reg(AR2315_PCI_MISC_CONFIG, 0, AR2315_PCIMISC_CFG_SEL); 
     228+       ar2315_pci_reg_mask(apc, AR2315_PCI_MISC_CONFIG, 0, 
     229+                           AR2315_PCIMISC_CFG_SEL); 
    207230+ 
    208231+       mb();   /* PCI must see space change before we begin */ 
     
    210233+       value = __raw_readl(apc->cfg_mem + addr); 
    211234+ 
    212 +       isr = ar231x_read_reg(AR2315_PCI_ISR); 
     235+       isr = ar2315_pci_reg_read(apc, AR2315_PCI_ISR); 
     236+ 
    213237+       if (isr & AR2315_PCI_INT_ABORT) 
    214238+               goto exit_err; 
     
    217241+               value = (value & ~(mask << sh)) | *ptr << sh; 
    218242+               __raw_writel(value, apc->cfg_mem + addr); 
    219 +               isr = ar231x_read_reg(AR2315_PCI_ISR); 
     243+               isr = ar2315_pci_reg_read(apc, AR2315_PCI_ISR); 
    220244+               if (isr & AR2315_PCI_INT_ABORT) 
    221245+                       goto exit_err; 
     
    227251+ 
    228252+exit_err: 
    229 +       ar231x_write_reg(AR2315_PCI_ISR, AR2315_PCI_INT_ABORT); 
     253+       ar2315_pci_reg_write(apc, AR2315_PCI_ISR, AR2315_PCI_INT_ABORT); 
    230254+       if (!write) 
    231255+               *ptr = 0xffffffff; 
     
    233257+exit: 
    234258+       /* Select Memory access */ 
    235 +       ar231x_mask_reg(AR2315_PCI_MISC_CONFIG, AR2315_PCIMISC_CFG_SEL, 0); 
     259+       ar2315_pci_reg_mask(apc, AR2315_PCI_MISC_CONFIG, AR2315_PCIMISC_CFG_SEL, 
     260+                           0); 
    236261+ 
    237262+       return isr & AR2315_PCI_INT_ABORT ? PCIBIOS_DEVICE_NOT_FOUND : 
     
    309334+static void ar2315_pci_irq_handler(unsigned irq, struct irq_desc *desc) 
    310335+{ 
    311 +       u32 pending = ar231x_read_reg(AR2315_PCI_ISR) & 
    312 +                     ar231x_read_reg(AR2315_PCI_IMR); 
     336+       struct ar2315_pci_ctrl *apc = irq_get_handler_data(irq); 
     337+       u32 pending = ar2315_pci_reg_read(apc, AR2315_PCI_ISR) & 
     338+                     ar2315_pci_reg_read(apc, AR2315_PCI_IMR); 
    313339+ 
    314340+       if (pending & AR2315_PCI_INT_EXT) 
     
    322348+static void ar2315_pci_irq_mask(struct irq_data *d) 
    323349+{ 
     350+       struct ar2315_pci_ctrl *apc = irq_data_get_irq_chip_data(d); 
    324351+       u32 m = 1 << (d->irq - AR2315_PCI_IRQ_BASE + AR2315_PCI_IRQ_SHIFT); 
    325352+ 
    326 +       ar231x_mask_reg(AR2315_PCI_IMR, m, 0); 
     353+       ar2315_pci_reg_mask(apc, AR2315_PCI_IMR, m, 0); 
    327354+} 
    328355+ 
    329356+static void ar2315_pci_irq_mask_ack(struct irq_data *d) 
    330357+{ 
     358+       struct ar2315_pci_ctrl *apc = irq_data_get_irq_chip_data(d); 
    331359+       u32 m = 1 << (d->irq - AR2315_PCI_IRQ_BASE + AR2315_PCI_IRQ_SHIFT); 
    332360+ 
    333 +       ar231x_mask_reg(AR2315_PCI_IMR, m, 0); 
    334 +       ar231x_write_reg(AR2315_PCI_ISR, m); 
     361+       ar2315_pci_reg_mask(apc, AR2315_PCI_IMR, m, 0); 
     362+       ar2315_pci_reg_write(apc, AR2315_PCI_ISR, m); 
    335363+} 
    336364+ 
    337365+static void ar2315_pci_irq_unmask(struct irq_data *d) 
    338366+{ 
     367+       struct ar2315_pci_ctrl *apc = irq_data_get_irq_chip_data(d); 
    339368+       u32 m = 1 << (d->irq - AR2315_PCI_IRQ_BASE + AR2315_PCI_IRQ_SHIFT); 
    340369+ 
    341 +       ar231x_mask_reg(AR2315_PCI_IMR, 0, m); 
     370+       ar2315_pci_reg_mask(apc, AR2315_PCI_IMR, 0, m); 
    342371+} 
    343372+ 
     
    349378+}; 
    350379+ 
    351 +static void ar2315_pci_irq_init(void) 
     380+static void ar2315_pci_irq_init(struct ar2315_pci_ctrl *apc) 
    352381+{ 
    353382+       int i; 
    354383+ 
    355 +       ar231x_mask_reg(AR2315_PCI_IER, AR2315_PCI_IER_ENABLE, 0); 
    356 +       ar231x_mask_reg(AR2315_PCI_IMR, (AR2315_PCI_INT_ABORT | 
    357 +                        AR2315_PCI_INT_EXT), 0); 
     384+       ar2315_pci_reg_mask(apc, AR2315_PCI_IER, AR2315_PCI_IER_ENABLE, 0); 
     385+       ar2315_pci_reg_mask(apc, AR2315_PCI_IMR, (AR2315_PCI_INT_ABORT | 
     386+                           AR2315_PCI_INT_EXT), 0); 
    358387+ 
    359388+       for (i = 0; i < AR2315_PCI_IRQ_COUNT; ++i) { 
     
    362391+               irq_set_chip_and_handler(irq, &ar2315_pci_irq_chip, 
    363392+                                        handle_level_irq); 
     393+               irq_set_chip_data(irq, apc); 
    364394+       } 
    365395+ 
    366396+       irq_set_chained_handler(AR2315_IRQ_LCBUS_PCI, ar2315_pci_irq_handler); 
     397+       irq_set_handler_data(AR2315_IRQ_LCBUS_PCI, apc); 
    367398+ 
    368399+       /* Clear any pending Abort or external Interrupts 
    369400+        * and enable interrupt processing */ 
    370 +       ar231x_write_reg(AR2315_PCI_ISR, (AR2315_PCI_INT_ABORT | 
    371 +                        AR2315_PCI_INT_EXT)); 
    372 +       ar231x_mask_reg(AR2315_PCI_IER, 0, AR2315_PCI_IER_ENABLE); 
     401+       ar2315_pci_reg_write(apc, AR2315_PCI_ISR, AR2315_PCI_INT_ABORT | 
     402+                                                 AR2315_PCI_INT_EXT); 
     403+       ar2315_pci_reg_mask(apc, AR2315_PCI_IER, 0, AR2315_PCI_IER_ENABLE); 
    373404+} 
    374405+ 
     
    381412+       apc = devm_kzalloc(dev, sizeof(*apc), GFP_KERNEL); 
    382413+       if (!apc) 
     414+               return -ENOMEM; 
     415+ 
     416+       apc->mmr_mem = devm_ioremap_nocache(dev, AR2315_PCI, AR2315_PCI_SIZE); 
     417+       if (!apc->mmr_mem) 
    383418+               return -ENOMEM; 
    384419+ 
     
    397432+ 
    398433+       /* Reset the PCI bus by setting bits 5-4 in PCI_MCFG */ 
    399 +       ar231x_mask_reg(AR2315_PCI_MISC_CONFIG, AR2315_PCIMISC_RST_MODE, 
    400 +                       AR2315_PCIRST_LOW); 
     434+       ar2315_pci_reg_mask(apc, AR2315_PCI_MISC_CONFIG, 
     435+                           AR2315_PCIMISC_RST_MODE, 
     436+                           AR2315_PCIRST_LOW); 
    401437+       msleep(100); 
    402438+ 
    403439+       /* Bring the PCI out of reset */ 
    404 +       ar231x_mask_reg(AR2315_PCI_MISC_CONFIG, AR2315_PCIMISC_RST_MODE, 
    405 +                       AR2315_PCIRST_HIGH | AR2315_PCICACHE_DIS | 0x8); 
    406 + 
    407 +       ar231x_write_reg(AR2315_PCI_UNCACHE_CFG, 
    408 +                        0x1E | /* 1GB uncached */ 
    409 +                        (1 << 5) | /* Enable uncached */ 
    410 +                        (0x2 << 30) /* Base: 0x80000000 */); 
    411 +       ar231x_read_reg(AR2315_PCI_UNCACHE_CFG); 
     440+       ar2315_pci_reg_mask(apc, AR2315_PCI_MISC_CONFIG, 
     441+                           AR2315_PCIMISC_RST_MODE, 
     442+                           AR2315_PCIRST_HIGH | AR2315_PCICACHE_DIS | 0x8); 
     443+ 
     444+       ar2315_pci_reg_write(apc, AR2315_PCI_UNCACHE_CFG, 
     445+                            0x1E | /* 1GB uncached */ 
     446+                            (1 << 5) | /* Enable uncached */ 
     447+                            (0x2 << 30) /* Base: 0x80000000 */); 
     448+       ar2315_pci_reg_read(apc, AR2315_PCI_UNCACHE_CFG); 
    412449+ 
    413450+       msleep(500); 
     
    417454+               return err; 
    418455+ 
    419 +       ar2315_pci_irq_init(); 
     456+       ar2315_pci_irq_init(apc); 
    420457+ 
    421458+       /* PCI controller does not support I/O ports */ 
Note: See TracChangeset for help on using the changeset viewer.