Blame view

kernel/linux-imx6_3.14.28/arch/powerpc/sysdev/grackle.c 2.03 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  /*
   * Functions for setting up and using a MPC106 northbridge
   * Extracted from arch/powerpc/platforms/powermac/pci.c.
   *
   * Copyright (C) 2003 Benjamin Herrenschmuidt (benh@kernel.crashing.org)
   * Copyright (C) 1997 Paul Mackerras (paulus@samba.org)
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version
   * 2 of the License, or (at your option) any later version.
   */
  #include <linux/kernel.h>
  #include <linux/pci.h>
  #include <linux/init.h>
  
  #include <asm/io.h>
  #include <asm/prom.h>
  #include <asm/pci-bridge.h>
  #include <asm/grackle.h>
  
  #define GRACKLE_CFA(b, d, o)	(0x80 | ((b) << 8) | ((d) << 16) \
  				 | (((o) & ~3) << 24))
  
  #define GRACKLE_PICR1_STG		0x00000040
  #define GRACKLE_PICR1_LOOPSNOOP		0x00000010
  
  /* N.B. this is called before bridges is initialized, so we can't
     use grackle_pcibios_{read,write}_config_dword. */
  static inline void grackle_set_stg(struct pci_controller* bp, int enable)
  {
  	unsigned int val;
  
  	out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
  	val = in_le32(bp->cfg_data);
  	val = enable? (val | GRACKLE_PICR1_STG) :
  		(val & ~GRACKLE_PICR1_STG);
  	out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
  	out_le32(bp->cfg_data, val);
  	(void)in_le32(bp->cfg_data);
  }
  
  static inline void grackle_set_loop_snoop(struct pci_controller *bp, int enable)
  {
  	unsigned int val;
  
  	out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
  	val = in_le32(bp->cfg_data);
  	val = enable? (val | GRACKLE_PICR1_LOOPSNOOP) :
  		(val & ~GRACKLE_PICR1_LOOPSNOOP);
  	out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
  	out_le32(bp->cfg_data, val);
  	(void)in_le32(bp->cfg_data);
  }
  
  void __init setup_grackle(struct pci_controller *hose)
  {
  	setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0);
  	if (of_machine_is_compatible("PowerMac1,1"))
  		pci_add_flags(PCI_REASSIGN_ALL_BUS);
  	if (of_machine_is_compatible("AAPL,PowerBook1998"))
  		grackle_set_loop_snoop(hose, 1);
  #if 0	/* Disabled for now, HW problems ??? */
  	grackle_set_stg(hose, 1);
  #endif
  }