19b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/** @file
29b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyDeclaration of IO handling routines.
39b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
49b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyCopyright (c) 2013-2015 Intel Corporation.
59b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
69b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyThis program and the accompanying materials
79b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneyare licensed and made available under the terms and conditions of the BSD License
89b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneywhich accompanies this distribution.  The full text of the license may be found at
99b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneyhttp://opensource.org/licenses/bsd-license.php
109b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
119b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
129b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
139b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
149b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
159b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#ifndef __IO_H
169b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define __IO_H
179b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
189b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#include "core_types.h"
199b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
209b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#include "general_definitions.h"
219b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#include "gen5_iosf_sb_definitions.h"
229b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
239b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// Instruction not present on Quark
249b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SFENCE()
259b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
269b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define DEAD_LOOP()   for(;;);
279b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
289b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney////
299b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// Define each of the IOSF_SB ports used by MRC
309b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney//
319b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
329b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney//
339b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// Has to be 0 because of emulation static data
349b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// initialisation:
359b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney//   Space_t EmuSpace[ SPACE_COUNT] = {0};
369b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney//
379b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define FREE                0x000
389b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
399b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// Pseudo side-band ports for access abstraction
409b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// See Wr32/Rd32 functions
419b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define MEM                 0x101
429b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define MMIO                0x102
439b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define DCMD                0x0A0
449b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
459b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// Real side-band ports
469b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// See Wr32/Rd32 functions
479b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define MCU                 0x001
489b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define HOST_BRIDGE               0x003
499b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define MEMORY_MANAGER               0x005
509b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define HTE                0x011
519b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define DDRPHY              0x012
529b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define FUSE                0x033
539b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
549b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// End of IOSF_SB ports
559b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney////
569b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
579b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// Pciexbar address
589b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define EC_BASE          0xE0000000
599b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
609b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define PCIADDR(bus,dev,fn,reg) ( \
619b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        (EC_BASE) + \
629b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    ((bus) << 20) + \
639b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    ((dev) << 15) + \
649b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    ((fn)  << 12) + \
659b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    (reg))
669b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
679b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// Various offsets used in the building sideband commands.
689b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_OPCODE_OFFSET      24
699b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_PORT_OFFSET        16
709b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_REG_OFFEST          8
719b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
729b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// Sideband opcodes
739b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_REG_READ_OPCODE        0x10
749b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_REG_WRITE_OPCODE       0x11
759b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
769b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_FUSE_REG_READ_OPCODE    0x06
779b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_FUSE_REG_WRITE_OPCODE  0x07
789b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
799b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_DDRIO_REG_READ_OPCODE  0x06
809b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_DDRIO_REG_WRITE_OPCODE 0x07
819b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
829b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_DRAM_CMND_OPCODE       0x68
839b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_WAKE_CMND_OPCODE       0xCA
849b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_SUSPEND_CMND_OPCODE    0xCC
859b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
869b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// Register addresses for sideband command and data.
879b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_PACKET_REG        0x00D0
889b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_DATA_REG          0x00D4
899b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_HADR_REG          0x00D8
909b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
919b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// We always flag all 4 bytes in the register reads/writes as required.
929b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_ALL_BYTES_ENABLED  0xF0
939b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
949b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define SB_COMMAND(Opcode, Port, Reg)  \
959b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney ((Opcode << SB_OPCODE_OFFSET) |  \
969b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  (Port   << SB_PORT_OFFSET) |  \
979b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  (Reg    << SB_REG_OFFEST) |  \
989b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney   SB_ALL_BYTES_ENABLED)
999b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1009b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// iosf
1019b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define isbM32m   WrMask32
1029b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define isbW32m   Wr32
1039b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#define isbR32m   Rd32
1049b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1059b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// pci
1069b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1079b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneyvoid pciwrite32(
1089b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t bus,
1099b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t dev,
1109b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t fn,
1119b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t reg,
1129b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t data);
1139b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1149b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneyuint32_t pciread32(
1159b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t bus,
1169b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t dev,
1179b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t fn,
1189b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t reg);
1199b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1209b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// general
1219b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1229b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneyuint32_t Rd32(
1239b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t unit,
1249b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t addr);
1259b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1269b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneyvoid Wr32(
1279b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t unit,
1289b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t addr,
1299b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t data);
1309b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1319b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneyvoid WrMask32(
1329b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t unit,
1339b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t addr,
1349b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t data,
1359b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    uint32_t mask);
1369b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1379b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1389b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#endif
139