# # Copyright (C) 2006-2009 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # I2C_MENU:=I2C support ModuleConfVar=$(word 1,$(subst :,$(space),$(1))) ModuleFullPath=$(LINUX_DIR)/$(word 2,$(subst :,$(space),$(1))).ko ModuleKconfig=$(foreach mod,$(1),$(call ModuleConfVar,$(mod))) ModuleFiles=$(foreach mod,$(1),$(call ModuleFullPath,$(mod))) ModuleAuto=$(call AutoLoad,$(1),$(foreach mod,$(2),$(basename $(notdir $(call ModuleFullPath,$(mod))))),$(3)) define i2c_defaults SUBMENU:=$(I2C_MENU) KCONFIG:=$(call ModuleKconfig,$(1)) FILES:=$(call ModuleFiles,$(1)) AUTOLOAD:=$(call ModuleAuto,$(2),$(1),$(3)) endef I2C_CORE_MODULES:= \ CONFIG_I2C:drivers/i2c/i2c-core \ CONFIG_I2C_CHARDEV:drivers/i2c/i2c-dev ifeq ($(strip $(call CompareKernelPatchVer,$(KERNEL_PATCHVER),lt,3.12.0)),1) ifeq ($(CONFIG_OF),y) I2C_CORE_MODULES+=CONFIG_OF_I2C:drivers/of/of_i2c endif endif define KernelPackage/i2c-core $(call i2c_defaults,$(I2C_CORE_MODULES),51) TITLE:=I2C support endef define KernelPackage/i2c-core/description Kernel modules for I2C support endef $(eval $(call KernelPackage,i2c-core)) I2C_ALGOBIT_MODULES:= \ CONFIG_I2C_ALGOBIT:drivers/i2c/algos/i2c-algo-bit define KernelPackage/i2c-algo-bit $(call i2c_defaults,$(I2C_ALGOBIT_MODULES),55) TITLE:=I2C bit-banging interfaces DEPENDS:=kmod-i2c-core endef define KernelPackage/i2c-algo-bit/description Kernel modules for I2C bit-banging interfaces endef $(eval $(call KernelPackage,i2c-algo-bit)) I2C_ALGOPCA_MODULES:= \ CONFIG_I2C_ALGOPCA:drivers/i2c/algos/i2c-algo-pca define KernelPackage/i2c-algo-pca $(call i2c_defaults,$(I2C_ALGOPCA_MODULES),55) TITLE:=I2C PCA 9564 interfaces DEPENDS:=kmod-i2c-core endef define KernelPackage/i2c-algo-pca/description Kernel modules for I2C PCA 9564 interfaces endef $(eval $(call KernelPackage,i2c-algo-pca)) I2C_ALGOPCF_MODULES:= \ CONFIG_I2C_ALGOPCF:drivers/i2c/algos/i2c-algo-pcf define KernelPackage/i2c-algo-pcf $(call i2c_defaults,$(I2C_ALGOPCF_MODULES),55) TITLE:=I2C PCF 8584 interfaces DEPENDS:=kmod-i2c-core endef define KernelPackage/i2c-algo-pcf/description Kernel modules for I2C PCF 8584 interfaces endef $(eval $(call KernelPackage,i2c-algo-pcf)) I2C_GPIO_MODULES:= \ CONFIG_I2C_GPIO:drivers/i2c/busses/i2c-gpio define KernelPackage/i2c-gpio $(call i2c_defaults,$(I2C_GPIO_MODULES),59) TITLE:=GPIO-based bitbanging I2C DEPENDS:=@GPIO_SUPPORT +kmod-i2c-algo-bit endef define KernelPackage/i2c-gpio/description Kernel modules for a very simple bitbanging I2C driver utilizing the arch-neutral GPIO API to control the SCL and SDA lines. endef $(eval $(call KernelPackage,i2c-gpio)) I2C_MPC_MODULES:=\ CONFIG_I2C_MPC:drivers/i2c/busses/i2c-mpc define KernelPackage/i2c-mpc $(call i2c_defaults,$(I2C_MPC_MODULES),59) TITLE:=MPC I2C accessors DEPENDS:=@TARGET_mpc52xx||TARGET_mpc83xx||TARGET_mpc85xx +kmod-i2c-core endef define KernelPackage/i2c-mpc/description Kernel module for Freescale MPC52xx MPC83xx MPC85xx I2C accessors endef $(eval $(call KernelPackage,i2c-mpc)) I2C_IBM_IIC_MODULES:=\ CONFIG_I2C_IBM_IIC:drivers/i2c/busses/i2c-ibm_iic define KernelPackage/i2c-ibm-iic $(call i2c_defaults,$(OF_I2C_MODULES),59) TITLE:=IBM PPC 4xx on-chip I2C interface support DEPENDS:=@TARGET_ppc40x||TARGET_ppc4xx +kmod-i2c-core endef define KernelPackage/i2c-ibm-iic/description Kernel module for IIC peripheral found on embedded IBM PPC4xx based systems endef $(eval $(call KernelPackage,i2c-ibm-iic)) I2C_MV64XXX_MODULES:=\ CONFIG_I2C_MV64XXX:drivers/i2c/busses/i2c-mv64xxx define KernelPackage/i2c-mv64xxx $(call i2c_defaults,$(I2C_MV64XXX_MODULES),59) TITLE:=Orion Platform I2C interface support DEPENDS:=@TARGET_kirkwood||TARGET_orion||TARGET_mvebu +kmod-i2c-core endef define KernelPackage/i2c-mv64xxx/description Kernel module for I2C interface on the Kirkwood, Orion and Armada XP/370 family processors endef $(eval $(call KernelPackage,i2c-mv64xxx)) I2C_TINY_USB_MODULES:= \ CONFIG_I2C_TINY_USB:drivers/i2c/busses/i2c-tiny-usb define KernelPackage/i2c-tiny-usb $(call i2c_defaults,$(I2C_TINY_USB_MODULES),59) TITLE:=I2C Tiny USB adaptor DEPENDS:=@USB_SUPPORT kmod-i2c-core +kmod-usb-core endef define KernelPackage/i2c-tiny-usb/description Kernel module for the I2C Tiny USB adaptor developed by Till Harbaum (http://www.harbaum.org/till/i2c_tiny_usb) endef $(eval $(call KernelPackage,i2c-tiny-usb)) I2C_PIIX4_MODULES:= \ CONFIG_I2C_PIIX4:drivers/i2c/busses/i2c-piix4 define KernelPackage/i2c-piix4 $(call i2c_defaults,$(I2C_PIIX4_MODULES),59) TITLE:=Intel PIIX4 and compatible I2C interfaces DEPENDS:=@PCI_SUPPORT @(x86||x86_64) kmod-i2c-core endef define KernelPackage/i2c-piix4/description Support for the Intel PIIX4 family of mainboard I2C interfaces, specifically Intel PIIX4, Intel 440MX, ATI IXP200, ATI IXP300, ATI IXP400, ATI SB600, ATI SB700/SP5100, ATI SB800, AMD Hudson-2, AMD ML, AMD CZ, Serverworks OSB4, Serverworks CSB5, Serverworks CSB6, Serverworks HT-1000, Serverworks HT-1100 and SMSC Victory66. endef $(eval $(call KernelPackage,i2c-piix4)) I2C_MUX_MODULES:= \ CONFIG_I2C_MUX:drivers/i2c/i2c-mux define KernelPackage/i2c-mux $(call i2c_defaults,$(I2C_MUX_MODULES),51) TITLE:=I2C bus multiplexing support DEPENDS:=kmod-i2c-core endef define KernelPackage/i2c-mux/description Kernel modules for I2C bus multiplexing support endef $(eval $(call KernelPackage,i2c-mux)) ifeq ($(strip $(call CompareKernelPatchVer,$(KERNEL_PATCHVER),ge,3.6.0)),1) I2C_MUX_GPIO_MODULES:= \ CONFIG_I2C_MUX_GPIO:drivers/i2c/muxes/i2c-mux-gpio else I2C_MUX_GPIO_MODULES:= \ CONFIG_I2C_MUX_GPIO:drivers/i2c/muxes/gpio-i2cmux endif define KernelPackage/i2c-mux-gpio $(call i2c_defaults,$(I2C_MUX_GPIO_MODULES),51) TITLE:=GPIO-based I2C mux/switches DEPENDS:=kmod-i2c-mux endef define KernelPackage/i2c-mux-gpio/description Kernel modules for GENERIC_GPIO I2C bus mux/switching devices endef $(eval $(call KernelPackage,i2c-mux-gpio)) ifeq ($(strip $(call CompareKernelPatchVer,$(KERNEL_PATCHVER),ge,3.6.0)),1) I2C_MUX_PREFIX:=i2c-mux- endif I2C_MUX_PCA954x_MODULES:= \ CONFIG_I2C_MUX_PCA954x:drivers/i2c/muxes/$(I2C_MUX_PREFIX)pca954x define KernelPackage/i2c-mux-pca954x $(call i2c_defaults,$(I2C_MUX_PCA954x_MODULES),51) TITLE:=Philips PCA954x I2C mux/switches DEPENDS:=kmod-i2c-mux endef define KernelPackage/i2c-mux-pca954x/description Kernel modules for PCA954x I2C bus mux/switching devices endef $(eval $(call KernelPackage,i2c-mux-pca954x)) I2C_MUX_PCA9541_MODULES:= \ CONFIG_I2C_MUX_PCA9541:drivers/i2c/muxes/$(I2C_MUX_PREFIX)pca9541 define KernelPackage/i2c-mux-pca9541 $(call i2c_defaults,$(I2C_MUX_PCA9541_MODULES),51) TITLE:=Philips PCA9541 I2C mux/switches DEPENDS:=kmod-i2c-mux endef define KernelPackage/i2c-mux-pca9541/description Kernel modules for PCA9541 I2C bus mux/switching devices endef $(eval $(call KernelPackage,i2c-mux-pca9541)) 11 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
#============================================================================
# This library is free software; you can redistribute it and/or
# modify it under the terms of version 2.1 of the GNU Lesser General Public
# License as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#============================================================================
# Copyright (c) 2008 NEC Corporation
#       Yosuke Iwamatsu <y-iwamatsu at ab jp nec com>
#============================================================================

from xen.xend.XendBase import XendBase
from xen.xend.XendPPCI import XendPPCI
from xen.xend import XendAPIStore
from xen.xend import uuid as genuuid

import XendDomain, XendNode

from XendError import *
from XendTask import XendTask
from XendLogging import log

class XendDPCI(XendBase):
    """Representation of a passthrough PCI device."""

    def getClass(self):
        return "DPCI"

    def getAttrRO(self):
        attrRO = ['virtual_domain',
                  'virtual_bus',
                  'virtual_slot',
                  'virtual_func',
                  'virtual_name',
                  'VM',
                  'PPCI',
                  'hotplug_slot',
                  'key',
                  'options']
        return XendBase.getAttrRO() + attrRO

    def getAttrRW(self):
        attrRW = []
        return XendBase.getAttrRW() + attrRW

    def getAttrInst(self):
        attrInst = ['VM',
                    'PPCI',
                    'hotplug_slot',
                    'key']
        return XendBase.getAttrInst() + attrInst

    def getMethods(self):
        methods = ['destroy']
        return XendBase.getMethods() + methods

    def getFuncs(self):
        funcs = ['create']
        return XendBase.getFuncs() + funcs

    getClass    = classmethod(getClass)
    getAttrRO   = classmethod(getAttrRO)
    getAttrRW   = classmethod(getAttrRW)
    getAttrInst = classmethod(getAttrInst)
    getMethods  = classmethod(getMethods)
    getFuncs    = classmethod(getFuncs)
 
    def create(self, dpci_struct):

        # Check if VM is valid
        xendom = XendDomain.instance()
        if not xendom.is_valid_vm(dpci_struct['VM']):
            raise InvalidHandleError('VM', dpci_struct['VM'])
        dom = xendom.get_vm_by_uuid(dpci_struct['VM'])

        # Check if PPCI is valid
        xennode = XendNode.instance()
        ppci_uuid = xennode.get_ppci_by_uuid(dpci_struct['PPCI'])
        if not ppci_uuid:
            raise InvalidHandleError('PPCI', dpci_struct['PPCI'])
        for existing_dpci in XendAPIStore.get_all('DPCI'):
            if ppci_uuid == existing_dpci.get_PPCI():
                raise DirectPCIError("Device is in use")

        # Assign PPCI to VM
        try:
            dpci_ref = XendTask.log_progress(0, 100, dom.create_dpci,
                                             dpci_struct)
        except XendError, e:
            raise DirectPCIError("Failed to assign device")

        # TODO: Retrive virtual pci device infomation.

        return dpci_ref

    create = classmethod(create)

    def get_by_VM(cls, VM_ref):
        result = []
        for dpci in XendAPIStore.get_all("DPCI"):
            if dpci.get_VM() == VM_ref:
                result.append(dpci.get_uuid())
        return result

    get_by_VM = classmethod(get_by_VM)

    def __init__(self, uuid, record):
        XendBase.__init__(self, uuid, record)

        self.virtual_domain = -1
        self.virtual_bus = -1
        self.virtual_slot = -1
        self.virtual_func = -1

        self.VM = record['VM']
        self.PPCI = record['PPCI']
        self.hotplug_slot = int(record['hotplug_slot'], 16)
        self.key = record['key']
        if 'options' in record.keys():
            self.options = record['options']

    def destroy(self):
        xendom = XendDomain.instance()
        dom = xendom.get_vm_by_uuid(self.get_VM())
        if not dom:
            raise InvalidHandleError("VM", self.get_VM())
        XendTask.log_progress(0, 100, dom.destroy_dpci, self.get_uuid())

    def get_virtual_domain(self):
        return self.virtual_domain

    def get_virtual_bus(self):
        return self.virtual_bus

    def get_virtual_slot(self):
        return self.virtual_slot

    def get_virtual_func(self):
        return self.virtual_func

    def get_virtual_name(self):
        return "%04x:%02x:%02x.%01x" % (self.virtual_domain, self.virtual_bus,
                                        self.virtual_slot, self.virtual_func)

    def get_VM(self):
        return self.VM

    def get_PPCI(self):
        return self.PPCI

    def get_hotplug_slot(self):
        return "%d" % self.hotplug_slot

    def get_key(self):
        return self.key

    def get_options(self):
        return self.options