diff options
author | Yinghai Lu <yinghailu@gmail.com> | 2006-10-04 20:46:15 +0000 |
---|---|---|
committer | Yinghai Lu <yinghailu@gmail.com> | 2006-10-04 20:46:15 +0000 |
commit | d4b278c02c1da92219ebeb34204b9768934aeca3 (patch) | |
tree | 488d097cac9744cfc9b8ff7c89ce69bcb21370cb /src/arch/i386/include | |
parent | 2e3757d11c565a8fe68dc2a2c34975e98304533c (diff) |
AMD Rev F support
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2435 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'src/arch/i386/include')
-rw-r--r-- | src/arch/i386/include/arch/acpi.h | 21 | ||||
-rw-r--r-- | src/arch/i386/include/arch/cpu.h | 19 | ||||
-rw-r--r-- | src/arch/i386/include/arch/romcc_io.h | 150 |
3 files changed, 108 insertions, 82 deletions
diff --git a/src/arch/i386/include/arch/acpi.h b/src/arch/i386/include/arch/acpi.h index 12d57549bc..333057b13b 100644 --- a/src/arch/i386/include/arch/acpi.h +++ b/src/arch/i386/include/arch/acpi.h @@ -6,12 +6,9 @@ * * The ACPI table structs are based on the Linux kernel sources. * - * ACPI FADT & FACS added by Nick Barker <nick.barker9@btinternet.com> + */ +/* ACPI FADT & FACS added by Nick Barker <nick.barker9@btinternet.com> * those parts (C) 2004 Nick Barker - * - * ACPI SRAT support added in 2005.9 by yhlu - * Copyright 2005 ADVANCED MICRO DEVICES, INC. All Rights Reserved. - * */ @@ -32,11 +29,13 @@ typedef unsigned long long u64; #define HPET_NAME "HPET" #define MADT_NAME "APIC" #define SRAT_NAME "SRAT" +#define SLIT_NAME "SLIT" #define RSDT_TABLE "RSDT " #define HPET_TABLE "AMD64 " #define MADT_TABLE "MADT " #define SRAT_TABLE "SRAT " +#define SLIT_TABLE "SLIT " #define OEM_ID "LXBIOS" #define ASLC "NONE" @@ -49,7 +48,7 @@ typedef struct acpi_rsdp { char oem_id[6]; /* OEM ID, "LXBIOS" */ u8 revision; /* 0 for APCI 1.0, 2 for ACPI 2.0 */ u32 rsdt_address; /* physical address of RSDT */ - u32 length; /* total length of RSDP (incl. extended part) */ + u32 length; /* total length of RSDP (including extended part) */ u64 xsdt_address; /* physical address of XSDT */ u8 ext_checksum; /* chechsum of whole table */ u8 reserved[3]; @@ -84,16 +83,15 @@ typedef struct acpi_table_header /* ACPI common table header */ /* RSDT */ typedef struct acpi_rsdt { struct acpi_table_header header; - u32 entry[5+ACPI_SSDTX_NUM]; /* HPET, FADT, SRAT, MADT(APIC), SSDT, SSDTX */ + u32 entry[6+ACPI_SSDTX_NUM]; /* HPET, FADT, SRAT, SLIT, MADT(APIC), SSDT, SSDTX*/ } __attribute__ ((packed)) acpi_rsdt_t; /* XSDT */ typedef struct acpi_xsdt { struct acpi_table_header header; - u64 entry[5+ACPI_SSDTX_NUM]; + u64 entry[6+ACPI_SSDTX_NUM]; } __attribute__ ((packed)) acpi_xsdt_t; - /* HPET TIMERS */ typedef struct acpi_hpet { struct acpi_table_header header; @@ -138,6 +136,11 @@ typedef struct acpi_srat_mem { u32 resv2[2]; } __attribute__ ((packed)) acpi_srat_mem_t; +/* SLIT */ +typedef struct acpi_slit { + struct acpi_table_header header; + /* followed by static resource allocation 8+byte[num*num]*/ +} __attribute__ ((packed)) acpi_slit_t; /* MADT */ diff --git a/src/arch/i386/include/arch/cpu.h b/src/arch/i386/include/arch/cpu.h index 4cdeded8bc..ebe6ed155c 100644 --- a/src/arch/i386/include/arch/cpu.h +++ b/src/arch/i386/include/arch/cpu.h @@ -141,6 +141,25 @@ static inline unsigned long cpu_index(void) return ci->index; } + +struct cpuinfo_x86 { + uint8_t x86; /* CPU family */ + uint8_t x86_vendor; /* CPU vendor */ + uint8_t x86_model; + uint8_t x86_mask; +}; + +static void inline get_fms(struct cpuinfo_x86 *c, uint32_t tfms) +{ + c->x86 = (tfms >> 8) & 0xf; + c->x86_model = (tfms >> 4) & 0xf; + c->x86_mask = tfms & 0xf; + if (c->x86 == 0xf) + c->x86 += (tfms >> 20) & 0xff; + if (c->x86 >= 0x6) + c->x86_model += ((tfms >> 16) & 0xF) << 4; + +} #endif #endif /* ARCH_CPU_H */ diff --git a/src/arch/i386/include/arch/romcc_io.h b/src/arch/i386/include/arch/romcc_io.h index 983835a093..6fafbd99a9 100644 --- a/src/arch/i386/include/arch/romcc_io.h +++ b/src/arch/i386/include/arch/romcc_io.h @@ -4,74 +4,35 @@ #include <stdint.h> -static inline uint8_t read8(unsigned long addr) +static inline __attribute__((always_inline)) uint8_t read8(unsigned long addr) { return *((volatile uint8_t *)(addr)); } -static inline uint16_t read16(unsigned long addr) +static inline __attribute__((always_inline)) uint16_t read16(unsigned long addr) { return *((volatile uint16_t *)(addr)); } -static inline uint32_t read32(unsigned long addr) +static inline __attribute__((always_inline)) uint32_t read32(unsigned long addr) { return *((volatile uint32_t *)(addr)); } -static inline void write8(unsigned long addr, uint8_t value) +static inline __attribute__((always_inline)) void write8(unsigned long addr, uint8_t value) { *((volatile uint8_t *)(addr)) = value; } -static inline void write16(unsigned long addr, uint16_t value) +static inline __attribute__((always_inline)) void write16(unsigned long addr, uint16_t value) { *((volatile uint16_t *)(addr)) = value; } -static inline void write32(unsigned long addr, uint32_t value) +static inline __attribute__((always_inline)) void write32(unsigned long addr, uint32_t value) { *((volatile uint32_t *)(addr)) = value; } -#if 0 -typedef __builtin_div_t div_t; -typedef __builtin_ldiv_t ldiv_t; -typedef __builtin_udiv_t udiv_t; -typedef __builtin_uldiv_t uldiv_t; - -static inline div_t div(int numer, int denom) -{ - return __builtin_div(numer, denom); -} - -static inline ldiv_t ldiv(long numer, long denom) -{ - return __builtin_ldiv(numer, denom); -} - -static inline udiv_t udiv(unsigned numer, unsigned denom) -{ - return __builtin_udiv(numer, denom); -} - -static inline uldiv_t uldiv(unsigned long numer, unsigned long denom) -{ - return __builtin_uldiv(numer, denom); -} - - - -inline int log2(int value) -{ - /* __builtin_bsr is a exactly equivalent to the x86 machine - * instruction with the exception that it returns -1 - * when the value presented to it is zero. - * Otherwise __builtin_bsr returns the zero based index of - * the highest bit set. - */ - return __builtin_bsr(value); -} -#endif static inline int log2(int value) { @@ -98,16 +59,16 @@ static inline int log2f(int value) } -#define PCI_ADDR(BUS, DEV, FN, WHERE) ( \ - (((BUS) & 0xFF) << 16) | \ - (((DEV) & 0x1f) << 11) | \ - (((FN) & 0x07) << 8) | \ - ((WHERE) & 0xFF)) +#define PCI_ADDR(SEGBUS, DEV, FN, WHERE) ( \ + (((SEGBUS) & 0xFFF) << 20) | \ + (((DEV) & 0x1F) << 15) | \ + (((FN) & 0x07) << 12) | \ + ((WHERE) & 0xFFF)) -#define PCI_DEV(BUS, DEV, FN) ( \ - (((BUS) & 0xFF) << 16) | \ - (((DEV) & 0x1f) << 11) | \ - (((FN) & 0x7) << 8)) +#define PCI_DEV(SEGBUS, DEV, FN) ( \ + (((SEGBUS) & 0xFFF) << 20) | \ + (((DEV) & 0x1F) << 15) | \ + (((FN) & 0x07) << 12)) #define PCI_ID(VENDOR_ID, DEVICE_ID) \ ((((DEVICE_ID) & 0xFFFF) << 16) | ((VENDOR_ID) & 0xFFFF)) @@ -117,58 +78,103 @@ static inline int log2f(int value) typedef unsigned device_t; -static inline __attribute__((always_inline)) uint8_t pci_read_config8(device_t dev, unsigned where) +static inline __attribute__((always_inline)) uint8_t pci_io_read_config8(device_t dev, unsigned where) { unsigned addr; - addr = dev | where; + addr = (dev>>4) | where; outl(0x80000000 | (addr & ~3), 0xCF8); return inb(0xCFC + (addr & 3)); } -static inline __attribute__((always_inline)) uint16_t pci_read_config16(device_t dev, unsigned where) +static inline __attribute__((always_inline)) uint8_t pci_read_config8(device_t dev, unsigned where) +{ + return pci_io_read_config8(dev, where); +} + +static inline __attribute__((always_inline)) uint16_t pci_io_read_config16(device_t dev, unsigned where) { unsigned addr; - addr = dev | where; + addr = (dev>>4) | where; outl(0x80000000 | (addr & ~3), 0xCF8); return inw(0xCFC + (addr & 2)); } -static inline __attribute__((always_inline)) uint32_t pci_read_config32(device_t dev, unsigned where) +static inline __attribute__((always_inline)) uint16_t pci_read_config16(device_t dev, unsigned where) +{ + return pci_io_read_config16(dev, where); +} + + +static inline __attribute__((always_inline)) uint32_t pci_io_read_config32(device_t dev, unsigned where) { unsigned addr; - addr = dev | where; + addr = (dev>>4) | where; outl(0x80000000 | (addr & ~3), 0xCF8); return inl(0xCFC); } -static inline __attribute__((always_inline)) void pci_write_config8(device_t dev, unsigned where, uint8_t value) +static inline __attribute__((always_inline)) uint32_t pci_read_config32(device_t dev, unsigned where) +{ + return pci_io_read_config32(dev, where); +} + +static inline __attribute__((always_inline)) void pci_io_write_config8(device_t dev, unsigned where, uint8_t value) { unsigned addr; - addr = dev | where; + addr = (dev>>4) | where; outl(0x80000000 | (addr & ~3), 0xCF8); outb(value, 0xCFC + (addr & 3)); } +static inline __attribute__((always_inline)) void pci_write_config8(device_t dev, unsigned where, uint8_t value) +{ + pci_io_write_config8(dev, where, value); +} + + +static inline __attribute__((always_inline)) void pci_io_write_config16(device_t dev, unsigned where, uint16_t value) +{ + unsigned addr; + addr = (dev>>4) | where; + outl(0x80000000 | (addr & ~3), 0xCF8); + outw(value, 0xCFC + (addr & 2)); +} + static inline __attribute__((always_inline)) void pci_write_config16(device_t dev, unsigned where, uint16_t value) { - unsigned addr; - addr = dev | where; - outl(0x80000000 | (addr & ~3), 0xCF8); - outw(value, 0xCFC + (addr & 2)); + pci_io_write_config16(dev, where, value); } -static inline __attribute__((always_inline)) void pci_write_config32(device_t dev, unsigned where, uint32_t value) + +static inline __attribute__((always_inline)) void pci_io_write_config32(device_t dev, unsigned where, uint32_t value) { unsigned addr; - addr = dev | where; + addr = (dev>>4) | where; outl(0x80000000 | (addr & ~3), 0xCF8); outl(value, 0xCFC); } +static inline __attribute__((always_inline)) void pci_write_config32(device_t dev, unsigned where, uint32_t value) +{ + pci_io_write_config32(dev, where, value); +} + #define PCI_DEV_INVALID (0xffffffffU) +static device_t pci_io_locate_device(unsigned pci_id, device_t dev) +{ + for(; dev <= PCI_DEV(255, 31, 7); dev += PCI_DEV(0,0,1)) { + unsigned int id; + id = pci_io_read_config32(dev, 0); + if (id == pci_id) { + return dev; + } + } + return PCI_DEV_INVALID; +} + static device_t pci_locate_device(unsigned pci_id, device_t dev) { - for(; dev <= PCI_DEV(CONFIG_MAX_PCI_BUSES, 31, 7); dev += PCI_DEV(0,0,1)) { + for(; dev <= PCI_DEV(255, 31, 7); dev += PCI_DEV(0,0,1)) { unsigned int id; id = pci_read_config32(dev, 0); if (id == pci_id) { @@ -180,11 +186,11 @@ static device_t pci_locate_device(unsigned pci_id, device_t dev) static device_t pci_locate_device_on_bus(unsigned pci_id, unsigned bus) { - device_t dev, last; + device_t dev, last; dev = PCI_DEV(bus, 0, 0); last = PCI_DEV(bus, 31, 7); - + for(; dev <=last; dev += PCI_DEV(0,0,1)) { unsigned int id; id = pci_read_config32(dev, 0); @@ -195,8 +201,6 @@ static device_t pci_locate_device_on_bus(unsigned pci_id, unsigned bus) return PCI_DEV_INVALID; } - - /* Generic functions for pnp devices */ static inline __attribute__((always_inline)) void pnp_write_config(device_t dev, uint8_t reg, uint8_t value) { |