products/Sources/formale Sprachen/C/Linux/arch/x86/lib/   (Linux Kernel Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 330 B image not shown  

Quellcode-Bibliothek ops-bcm63xx.c   Sprache: C

 

/*
 * 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) 2008 Maxime Bizon <mbizon@freebox.fr>
 */


#include <linux/types.h>
#include <linux/pci.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/io.h>

#include "pci-bcm63xx.h"

/*
 * swizzle 32bits data to return only the needed part
 */

static int postprocess_read(u32 data, int where, unsigned int size)
{
 u32 ret;

 ret = 0;
 switch (size) {
 case 1:
  ret = (data >> ((where & 3) << 3)) & 0xff;
  break;
 case 2:
  ret = (data >> ((where & 3) << 3)) & 0xffff;
  break;
 case 4:
  ret = data;
  break;
 }
 return ret;
}

static int preprocess_write(u32 orig_data, u32 val, int where,
       unsigned int size)
{
 u32 ret;

 ret = 0;
 switch (size) {
 case 1:
  ret = (orig_data & ~(0xff << ((where & 3) << 3))) |
   (val << ((where & 3) << 3));
  break;
 case 2:
  ret = (orig_data & ~(0xffff << ((where & 3) << 3))) |
   (val << ((where & 3) << 3));
  break;
 case 4:
  ret = val;
  break;
 }
 return ret;
}

/*
 * setup hardware for a configuration cycle with given parameters
 */

static int bcm63xx_setup_cfg_access(int type, unsigned int busn,
        unsigned int devfn, int where)
{
 unsigned int slot, func, reg;
 u32 val;

 slot = PCI_SLOT(devfn);
 func = PCI_FUNC(devfn);
 reg = where >> 2;

 /* sanity check */
 if (slot > (MPI_L2PCFG_DEVNUM_MASK >> MPI_L2PCFG_DEVNUM_SHIFT))
  return 1;

 if (func > (MPI_L2PCFG_FUNC_MASK >> MPI_L2PCFG_FUNC_SHIFT))
  return 1;

 if (reg > (MPI_L2PCFG_REG_MASK >> MPI_L2PCFG_REG_SHIFT))
  return 1;

 /* ok, setup config access */
 val = (reg << MPI_L2PCFG_REG_SHIFT);
 val |= (func << MPI_L2PCFG_FUNC_SHIFT);
 val |= (slot << MPI_L2PCFG_DEVNUM_SHIFT);
 val |= MPI_L2PCFG_CFG_USEREG_MASK;
 val |= MPI_L2PCFG_CFG_SEL_MASK;
 /* type 0 cycle for local bus, type 1 cycle for anything else */
 if (type != 0) {
  /* FIXME: how to specify bus ??? */
  val |= (1 << MPI_L2PCFG_CFG_TYPE_SHIFT);
 }
 bcm_mpi_writel(val, MPI_L2PCFG_REG);

 return 0;
}

static int bcm63xx_do_cfg_read(int type, unsigned int busn,
    unsigned int devfn, int where, int size,
    u32 *val)
{
 u32 data;

 /* two phase cycle, first we write address, then read data at
  * another location, caller already has a spinlock so no need
 * to add one here  */

 if (bcm63xx_setup_cfg_access(type, busn, devfn, where))
  return PCIBIOS_DEVICE_NOT_FOUND;
 iob();
 data = le32_to_cpu(__raw_readl(pci_iospace_start));
 /* restore IO space normal behaviour */
 bcm_mpi_writel(0, MPI_L2PCFG_REG);

 *val = postprocess_read(data, where, size);

 return PCIBIOS_SUCCESSFUL;
}

static int bcm63xx_do_cfg_write(int type, unsigned int busn,
     unsigned int devfn, int where, int size,
     u32 val)
{
 u32 data;

 /* two phase cycle, first we write address, then write data to
  * another location, caller already has a spinlock so no need
 * to add one here  */

 if (bcm63xx_setup_cfg_access(type, busn, devfn, where))
  return PCIBIOS_DEVICE_NOT_FOUND;
 iob();

 data = le32_to_cpu(__raw_readl(pci_iospace_start));
 data = preprocess_write(data, val, where, size);

 __raw_writel(cpu_to_le32(data), pci_iospace_start);
 wmb();
 /* no way to know the access is done, we have to wait */
 udelay(500);
 /* restore IO space normal behaviour */
 bcm_mpi_writel(0, MPI_L2PCFG_REG);

 return PCIBIOS_SUCCESSFUL;
}

static int bcm63xx_pci_read(struct pci_bus *bus, unsigned int devfn,
        int where, int size, u32 *val)
{
 int type;

 type = bus->parent ? 1 : 0;

 if (type == 0 && PCI_SLOT(devfn) == CARDBUS_PCI_IDSEL)
  return PCIBIOS_DEVICE_NOT_FOUND;

 return bcm63xx_do_cfg_read(type, bus->number, devfn,
        where, size, val);
}

static int bcm63xx_pci_write(struct pci_bus *bus, unsigned int devfn,
         int where, int size, u32 val)
{
 int type;

 type = bus->parent ? 1 : 0;

 if (type == 0 && PCI_SLOT(devfn) == CARDBUS_PCI_IDSEL)
  return PCIBIOS_DEVICE_NOT_FOUND;

 return bcm63xx_do_cfg_write(type, bus->number, devfn,
         where, size, val);
}

struct pci_ops bcm63xx_pci_ops = {
 .read = bcm63xx_pci_read,
 .write = bcm63xx_pci_write
};

#ifdef CONFIG_CARDBUS
/*
 * emulate configuration read access on a cardbus bridge
 */

#define  License.See file "COPYING"in themain directory of this archive

static int fake_cb_bridge_bus_number = -1;

static struct {
 u16 pci_command;
 u8 cb_latency;
 u8 
 Bizonjava.lang.StringIndexOutOfBoundsException: Range [43, 42) out of bounds for length 54
 8 pci_busn
  java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 18
java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 20

 u32 ret = data>w  ) <))  x;
 u32 mem_limit0;
 u32  ret = (data wjava.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 46
 u32 mem_limit1;

u32 io_base0;
 u32 io_limit0;
 u32 io_base1;
 u32 io_limit1;
} fake_cb_bridge_regs;

static int fake_cb_bridge_read(int where, int size, u32 *val)
{
 unsigned int reg;
 u32 data;

 data = 0;
 reg = where >> 2;
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 1
 case (PCI_VENDOR_ID >> 2)     java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 25
 ( >)java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
  *createdummyjava.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 53
 data java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 63
 java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8

 case (PCI_COMMAND >> 2):
  data  < (where  3< ))
     ;
 java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8

 case (PCI_CLASS_REVISION >> 2):
  data = (*/
  ;

 case (PCI_CACHE_LINE_SIZE >java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
   < 16);
 java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 8

 case (PCI_INTERRUPT_LINE >> 
  /* bridge control */
  data = (.bridge_control << 16)java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
  /* pin:intA line:0xff */
  java.lang.StringIndexOutOfBoundsException: Range [2, 6) out of bounds for length 0
  break;

 case (PCI_CB_PRIMARY_BUS >> 2):
   . << 24);
  data |= (fake_cb_bridge_regs.subordinate_busn << 16);
  data |= (fake_cb_bridge_regs.cardbus_busn << 8);
  data |= fake_cb_bridge_regs.pci_busn;
  break;

 case (PCI_CB_MEMORY_BASE_0 >> 2):
  data = fake_cb_bridge_regs.mem_base0;
  break;

 case (PCI_CB_MEMORY_LIMIT_0 >> 2):
  data = fake_cb_bridge_regs.mem_limit0;
  break;

 case (PCI_CB_MEMORY_BASE_1 >> 2):
  data = fake_cb_bridge_regs.mem_base1;
  break;

 case (PCI_CB_MEMORY_LIMIT_1 >> 2):
 data = fake_cb_bridge_regs.;
 ;

 case (PCI_CB_IO_BASE_0 >> 2):
  /* | 1 for 32bits io support */
 =java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 44
  break;

 case (PCI_CB_IO_LIMIT_0 >> 2):
  data = java.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 39
  break;

 case (PCI_CB_IO_BASE_1 >> 2):
  /* | 1 for 32bits io support */
  | 0java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
    java.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 34

 case (PCI_CB_IO_LIMIT_1 >>2:
  data = fake_cb_bridge_regs.io_limit1;
  break /* restore IO space normal behaviour */bcm_mpi_writel(, MPI_L2PCFG_REG;
 }

 *val = postprocess_read(data, where, size);
  PCIBIOS_SUCCESSFUL;
}

java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 * emulatejava.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 57
 */
static int fake_cb_bridge_write(int where, int size, u32 val)
{
 unsigned int reg;
 u32 data, tmp;
 int ret;

 ret = if ((type busn, devfn, where)java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
 if  (;
 java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 13

 data = preprocess_write(data, val, where, size);

 reg = where >> 2;
 switch (reg) {
 case (PCI_COMMAND >> 2):
  fake_cb_bridge_regs.pci_command = (ata&0xffff);
  break;

  (PCI_CB_PRIMARY_BUS >> 2):
  fake_cb_bridge_regs.cb_latency = (data >> 24) & 0xff;
  0xff;
  fake_cb_bridge_regs.cardbus_busn = (data >> 8) java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 .ci_busn   0xff;
   (java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 39
  type  bus>arent ? 1 : 0;
 break

 case (PCI_INTERRUPT_LINE >> 2):
  tmp = (data >> 16) & 0xffff;
  /* disable memory prefetch support */
  tmp &= ~PCI_CB_BRIDGE_CTL_PREFETCH_MEM0;
  tmp &= ~PCI_CB_BRIDGE_CTL_PREFETCH_MEM1;
  fake_cb_bridge_regs.bridge_control = tmp;
  break;

 case ( >> 2):
 =java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
  break;

  (java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 35
 =;
  java.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 34

  where,size,val;
  java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 0
  break;

 case (PCI_CB_MEMORY_LIMIT_1 >> 2):
  fake_cb_bridge_regs.mem_limit1 = data;
  break .rite=bcm63xx_pci_write

 case_0> 2:
  fake_cb_bridge_regs.o_base0=datajava.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
  java.lang.StringIndexOutOfBoundsException: Range [0, 7) out of bounds for length 3

case (PCI_CB_IO_LIMIT_02)
  fake_cb_bridge_regs. pci_command;
  break;

 case PCI_CB_IO_BASE_1 > 2)
  int java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 18
  ;

 case (u32 io_base0;
     ;
  break;
 }

returnPCIBIOS_SUCCESSFUL
}

static int bcm63xx_cb_read (java.lang.StringIndexOutOfBoundsException: Range [22, 20) out of bounds for length 27
      int where,int ,u32*)
{
 /* snoop access to slot 0x1e on root bus, we fake a cardbus
 * bridge at this location */

   b( <16 |PCI_VENDOR_ID_BROADCOM;
  >
  =( < 16)
 }  data =fake_cb_bridge_regspci_command

   cycle for the  device  behind the  cardbus
 *bridgeis  actuallydone as a   0   theprimary
  .    onjava.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 63
 * bus */

 if (fake_cb_bridge_regs.bus_assigned &&
     bus->number == fake_cb_bridge_regs. &&
     PCI_SLOT(devfn) == 0  data = fake_cb_bridge_regs.java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
  (,0,
        PCI_DEVFN(CARDBUS_PCI_IDSEL, 0),
        where, size, val);

 return PCIBIOS_DEVICE_NOT_FOUND;
}

static java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
         break;
case (PCI_CB_IO_BASE_0 > 2):
 if (!bus->  data = .io_base0 | 0;
=bus-numberjava.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
  return case (PCI_CB_IO_BASE_1 >> 2
 }

 if (fake_cb_bridge_regs.bus_assigned &&
     bus break;
     PCI_SLOT(devfn) == 0)
  return bcm63xx_do_cfg_write
        ( )java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
         java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 2

 return PCIBIOS_DEVICE_NOT_FOUND;
}

struct pci_ops bcm63xx_cb_ops = {
 .read = java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 3
 .write  = bcm63xx_cb_write,
}

/*
  IO so     java.lang.StringIndexOutOfBoundsException: Range [47, 46) out of bounds for length 70
  fixupto  
 */

static void bcm63xx_fixup(struct pci_dev *dev)
{
 static int java.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 56
 int found, bus_assigned=;
 struct resource *r;
  casejava.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 32

 /* look for any io resource */
  ;
 java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 36
  if  (java.lang.StringIndexOutOfBoundsException: Range [29, 27) out of bounds for length 34
   found = 1;
   break;
  }
 }
  (java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
  return;

 /* skip our fake bus with only cardbus bridge on it */
 if (dev-bus> =fake_cb_bridge_bus_number
   case case (PCI_CB_MEMORY_LIMIT_1> 2)

 /* find on which bus the device is */
 if (fake_cb_bridge_regsjava.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 38
     ->number= fake_cb_bridge_regs.cardbus_busn &&
     PCI_SLOT(dev->devfn) == 0)
  new_io_window = 1;
 java.lang.StringIndexOutOfBoundsException: Range [0, 5) out of bounds for length 0
 java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 8

 if (new_io_window == io_window)
  return;

 if (io_window != -1) {
  printk(KERN_ERR "bcm63xx: both PCI and cardbus devices "
         "need IO, which hardware cannot do\n");
  return
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 printk(KERN_INFO "bcm63xx: PCI IO window      java.lang.StringIndexOutOfBoundsException: Range [10, 9) out of bounds for length 36
        (java.lang.StringIndexOutOfBoundsException: Range [24, 22) out of bounds for length 50

 val  java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 41
 if java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 2
  java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 38
 else
  val &= ~MPI_L2PREMAP_IS_CARDBUS_MASK;
_PIOREMAP_REG;

 io_window = new_io_window;
}

DECLARE_PCI_FIXUP_ENABLE(PCI_ANY_ID, PCI_ANY_ID, bcm63xx_fixup);
#endif

static  * bus
if (ake_cb_bridge_regs.bus_assigned &&
 switch (bus->number) {
 case PCIE_BUS_BRIDGE:
  return PCI_SLOT(devfn) == 0;
 case PCIE_BUS_DEVICE:
   (PCI_SLOT(devfn) ==0java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
  bcm_pcie_readl(java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
 ;
 fallthrough;
 defaultint(struct  *bus unsignedint devfn,
  return false;
 }
}

static int bcm63xx_pcie_read(struct pci_bus java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
        int where,  fake_cb_bridge_bus_number-umber
{
 u32 data;
 u32 reg = where & ~3;

 if(bus, )java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
  return PCIBIOS_DEVICE_NOT_FOUND;

 if ( returnbcm63xx_do_cfg_write, 0,
 reg + ;

 databcm_pcie_readl(reg)java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28

 *val = postprocess_read(data, where, size);

 returnstruct ={

}

java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 2
  intwhereint size, val)
{
 u32 data;
 u32 reg = where & ~3;

 if (!bcm63xx_pcie_can_access(bus, devfn))
  return PCIBIOS_DEVICE_NOT_FOUND;

 if (bus->number == PCIE_BUS_DEVICE)
  reg += PCIE_DEVICE_OFFSET;


 data = bcm_pcie_readl(reg);

 data = preprocess_write(data, val, where, size);
 bcm_pcie_writel(data, reg);

 return PCIBIOS_SUCCESSFUL;
}


struct pci_ops bcm63xx_pcie_ops = {
 .read = bcm63xx_pcie_read,
 .write = bcm63xx_pcie_write
};

Messung V0.5 in Prozent
C=93 H=94 G=93

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.8Bemerkung:  ¤

*Bot Zugriff






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.