diff --git a/cpu/x86/Makefile.x86_quarkX1000 b/cpu/x86/Makefile.x86_quarkX1000 index d6a258453..76665fd86 100644 --- a/cpu/x86/Makefile.x86_quarkX1000 +++ b/cpu/x86/Makefile.x86_quarkX1000 @@ -2,7 +2,7 @@ include $(CONTIKI)/cpu/x86/Makefile.x86_common CONTIKI_CPU_DIRS += drivers/legacy_pc init/legacy_pc -CONTIKI_SOURCEFILES += bootstrap_quarkX1000.S rtc.c pit.c pic.c irq.c nmi.c +CONTIKI_SOURCEFILES += bootstrap_quarkX1000.S rtc.c pit.c pic.c irq.c nmi.c pci.c CFLAGS += -m32 -march=i586 -mtune=i586 LDFLAGS += -m32 -T $(CONTIKI)/cpu/x86/quarkX1000.ld diff --git a/cpu/x86/drivers/legacy_pc/pci.c b/cpu/x86/drivers/legacy_pc/pci.c new file mode 100644 index 000000000..6ce60f102 --- /dev/null +++ b/cpu/x86/drivers/legacy_pc/pci.c @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2015, Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "pci.h" +#include "helpers.h" + +/* I/O port for PCI configuration address */ +#define PCI_CONFIG_ADDR_PORT 0xCF8 +/* I/O port for PCI configuration data */ +#define PCI_CONFIG_DATA_PORT 0xCFC + +/*---------------------------------------------------------------------------*/ +/* Initialize PCI configuration register address in preparation for accessing + * the specified register. + */ +static void +set_addr(pci_config_addr_t addr) +{ + addr.en_mapping = 1; + + outl(PCI_CONFIG_ADDR_PORT, addr.raw); +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Read from the specified PCI configuration register. + * \param addr Address of PCI configuration register. + * \return Value read from PCI configuration register. + */ +uint32_t +pci_config_read(pci_config_addr_t addr) +{ + set_addr(addr); + + return inl(PCI_CONFIG_DATA_PORT); +} +/*---------------------------------------------------------------------------*/ diff --git a/cpu/x86/drivers/legacy_pc/pci.h b/cpu/x86/drivers/legacy_pc/pci.h new file mode 100644 index 000000000..439cd3fc3 --- /dev/null +++ b/cpu/x86/drivers/legacy_pc/pci.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2015, Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef CPU_X86_DRIVERS_LEGACY_PC_PCI_H_ +#define CPU_X86_DRIVERS_LEGACY_PC_PCI_H_ + +#include + +/** PCI configuration register identifier for Base Address Register 0 (BAR0) */ +#define PCI_CONFIG_REG_BAR0 0x10 + +/** + * PCI configuration address + * + * Refer to Intel Quark SoC X1000 Datasheet, Section 5.5 for more details on + * PCI configuration register access. + */ +typedef union pci_config_addr { + struct { + /** Register/offset number. Least-significant two bits should be zero. */ + uint32_t reg_off : 8; + uint32_t func : 3; /**< Function number */ + uint32_t dev : 5; /**< Device number */ + uint32_t bus : 8; /**< Bus number */ + uint32_t : 7; + /** Must be set to perform PCI configuration access. */ + uint32_t en_mapping : 1; + }; + uint32_t raw; +} pci_config_addr_t; + +uint32_t pci_config_read(pci_config_addr_t addr); + +#endif /* CPU_X86_DRIVERS_LEGACY_PC_PCI_H_ */ diff --git a/cpu/x86/helpers.S b/cpu/x86/helpers.S index 0f9f517b8..c1c73130f 100644 --- a/cpu/x86/helpers.S +++ b/cpu/x86/helpers.S @@ -43,8 +43,21 @@ outb: out %al, %dx ret +.global outl +outl: + mov 4(%esp), %dx + mov 8(%esp), %eax + out %eax, %dx + ret + .global inb inb: mov 4(%esp), %dx in %dx, %al ret + +.global inl +inl: + mov 4(%esp), %dx + in %dx, %eax + ret diff --git a/cpu/x86/helpers.h b/cpu/x86/helpers.h index 705f37d45..91b120a9e 100644 --- a/cpu/x86/helpers.h +++ b/cpu/x86/helpers.h @@ -37,13 +37,12 @@ void halt(void) __attribute__((__noreturn__)); -/** - * Wrapper for the assembly 'out' instruction. - * - */ -void outb(uint16_t port, uint8_t byte); +/** Wrappers for the assembly 'out' instruction. */ +void outb(uint16_t port, uint8_t val); +void outl(uint16_t port, uint32_t val); -/* Wrapper for the assembly 'in' instruction */ +/** Wrappers for the assembly 'in' instruction */ uint8_t inb(uint16_t port); +uint32_t inl(uint16_t port); #endif /* HELPERS_H */