blob: 61b106e9baabd03cf17248923b9019c0aae3728d [file] [log] [blame]
/*
* (C) Copyright 2014 Quantenna Communications Inc.
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/*
* Header file which describes the Ruby and Topaz platforms.
* Used by both run-time and boot loader images.
*
* Do not put run-time specific definitions in this file.
*/
#ifndef __COMMON_MEM_H
#define __COMMON_MEM_H
#include "ruby_config.h"
/* Platform memory */
/* SRAM */
#define RUBY_SRAM_UNIFIED_BEGIN 0x98000000
#define RUBY_SRAM_UNIFIED_NOCACHE_BEGIN 0xf8000000
#define RUBY_SRAM_FLIP_BEGIN 0x88000000
#define RUBY_SRAM_FLIP_NOCACHE_BEGIN 0x60000000
#define RUBY_SRAM_NOFLIP_BEGIN 0x80000000
#define RUBY_SRAM_NOFLIP_NOCACHE_BEGIN 0x60000000
#define RUBY_SRAM_BANK_SIZE (64 * 1024)
#define RUBY_SRAM_SIZE (8 * RUBY_SRAM_BANK_SIZE)
#define RUBY_SRAM_BANK_SAFE_SIZE RUBY_SRAM_BANK_SIZE
/* DDR */
#define RUBY_DRAM_UNIFIED_BEGIN 0x80000000
#define RUBY_DRAM_UNIFIED_NOCACHE_BEGIN 0xd0000000
#define RUBY_DRAM_FLIP_BEGIN 0x80000000
#define RUBY_DRAM_FLIP_NOCACHE_BEGIN 0x40000000
#define RUBY_DRAM_NOFLIP_BEGIN 0x0
#define RUBY_DRAM_NOFLIP_NOCACHE_BEGIN 0x40000000
#define RUBY_MAX_DRAM_SIZE DDR_128MB
#define RUBY_MIN_DRAM_SIZE DDR_64MB
#if TOPAZ_MMAP_UNIFIED
#define RUBY_SRAM_BEGIN RUBY_SRAM_UNIFIED_BEGIN
#define RUBY_SRAM_BUS_BEGIN RUBY_SRAM_UNIFIED_BEGIN
#define RUBY_SRAM_NOCACHE_BEGIN RUBY_SRAM_UNIFIED_NOCACHE_BEGIN
#define RUBY_DRAM_BEGIN RUBY_DRAM_UNIFIED_BEGIN
#define RUBY_DRAM_BUS_BEGIN RUBY_DRAM_UNIFIED_BEGIN
#define RUBY_DRAM_NOCACHE_BEGIN RUBY_DRAM_UNIFIED_NOCACHE_BEGIN
#elif RUBY_MMAP_FLIP
#define RUBY_SRAM_BEGIN RUBY_SRAM_FLIP_BEGIN
#define RUBY_SRAM_BUS_BEGIN RUBY_SRAM_NOFLIP_BEGIN
#define RUBY_SRAM_NOCACHE_BEGIN RUBY_SRAM_FLIP_NOCACHE_BEGIN
#define RUBY_DRAM_BEGIN RUBY_DRAM_FLIP_BEGIN
#define RUBY_DRAM_BUS_BEGIN RUBY_DRAM_NOFLIP_BEGIN
#define RUBY_DRAM_NOCACHE_BEGIN RUBY_DRAM_FLIP_NOCACHE_BEGIN
#else
#define RUBY_SRAM_BEGIN RUBY_SRAM_NOFLIP_BEGIN
#define RUBY_SRAM_BUS_BEGIN RUBY_SRAM_NOFLIP_BEGIN
#define RUBY_SRAM_NOCACHE_BEGIN RUBY_SRAM_NOFLIP_NOCACHE_BEGIN
#define RUBY_DRAM_BEGIN RUBY_DRAM_NOFLIP_BEGIN
#define RUBY_DRAM_BUS_BEGIN RUBY_DRAM_NOFLIP_BEGIN
#define RUBY_DRAM_NOCACHE_BEGIN RUBY_DRAM_NOFLIP_NOCACHE_BEGIN
#endif
/*****************************************************************************/
/* SPI memory mapped */
/*****************************************************************************/
#define RUBY_SPI_FLASH_ADDR 0x90000000
/* Hardware */
#define RUBY_HARDWARE_BEGIN 0xC0000000
#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))
/* Config space */
#define CONFIG_ARC_CONF_SIZE (8 * 1024)
/* Config area for Universal H/W ID */
#define CONFIG_ARC_CONF_BASE (0x80000000 + CONFIG_ARC_CONF_SIZE)
#define CONFIG_ARC_KERNEL_PAGE_SIZE (8 * 1024)
#define RUBY_KERNEL_LOAD_DRAM_BEGIN (RUBY_DRAM_BEGIN + 0x3000000)
/* Safety offset from stack top address */
#define RUBY_STACK_INIT_OFFSET 4
/* DDR layout */
#define CONFIG_ARC_NULL_BASE 0x00000000
#define CONFIG_ARC_NULL_SIZE (64 * 1024)
#define CONFIG_ARC_NULL_END (CONFIG_ARC_NULL_BASE + CONFIG_ARC_NULL_SIZE)
/* PCIe BDA area */
#define CONFIG_ARC_PCIE_BASE (RUBY_DRAM_BEGIN + CONFIG_ARC_NULL_END)
#define CONFIG_ARC_PCIE_SIZE (64 * 1024) /* minimal PCI BAR size */
#if ((CONFIG_ARC_PCIE_BASE & (64 * 1024 - 1)) != 0)
#error "The reserved region for PCIe BAR should 64k aligned!"
#endif
/*
* CONFIG_ARC_MUC_STACK_OFFSET_UBOOT must be equal to CONFIG_ARC_MUC_STACK_OFFSET
* and RUBY_CRUMBS_OFFSET_UBOOT must be equal to RUBY_CRUMBS_OFFSET.
* Their values can be obtained with host/utilities/ruby_mem_helper.
*/
#if TOPAZ_RX_ACCELERATE
/* Must be equal to CONFIG_ARC_MUC_STACK_OFFSET */
#define CONFIG_ARC_MUC_STACK_OFFSET_UBOOT (0x0003F7C0)
/* MuC stack, included in CONFIG_ARC_MUC_SRAM_SIZE */
#define CONFIG_ARC_MUC_STACK_SIZE (4 * 1024)
#else
/* Must be equal to CONFIG_ARC_MUC_STACK_OFFSET */
#define CONFIG_ARC_MUC_STACK_OFFSET_UBOOT (0x0003FFA0)
/* MuC stack, included in CONFIG_ARC_MUC_SRAM_SIZE */
#define CONFIG_ARC_MUC_STACK_SIZE (6 * 1024)
#endif
#define CONFIG_ARC_MUC_STACK_INIT_UBOOT (RUBY_SRAM_BEGIN + CONFIG_ARC_MUC_STACK_OFFSET_UBOOT)
/* Must be equal to RUBY_CRUMBS_OFFSET */
#define RUBY_CRUMBS_OFFSET_UBOOT (0x0003FFC0)
#define RUBY_UBOOT_PIGGY_MAX_SIZE 0x14000
#define RUBY_CRUMBS_ADDR_UBOOT (RUBY_SRAM_BEGIN + RUBY_CRUMBS_OFFSET_UBOOT)
/*
* Crumb structure, sits at the end of 4th SRAM bank. Each core can use it to
* store the last run function to detect bus hangs.
*/
#define RUBY_CRUMBS_SIZE 64
#ifndef __ASSEMBLY__
struct ruby_crumbs_percore {
unsigned long blink;
unsigned long status32;
unsigned long sp;
};
struct ruby_crumbs_mem_section {
unsigned long start;
unsigned long end;
};
struct ruby_crumbs {
struct ruby_crumbs_percore lhost;
struct ruby_crumbs_percore muc;
struct ruby_crumbs_percore dsp;
/*
* allow (somewhat) intelligent parsing of muc stacks by
* specifying the text section
*/
struct ruby_crumbs_mem_section muc_dram;
struct ruby_crumbs_mem_section muc_sram;
/*
* magic token; if set incorrectly we probably have
* random values after power-on
*/
unsigned long magic;
};
#define RUBY_CRUMBS_MAGIC 0x7c97be8f
#endif /* __ASSEMBLY__ */
/* Utility functions */
#ifndef __ASSEMBLY__
#if defined(AUC_BUILD) || defined(RUBY_MINI)
#define NO_RUBY_WEAK 1
#else
#define NO_RUBY_WEAK 0
#endif
#define RUBY_BAD_BUS_ADDR ((unsigned long)0)
#define RUBY_BAD_VIRT_ADDR ((void*)RUBY_BAD_BUS_ADDR)
#define RUBY_ERROR_ADDR ((unsigned long)0xefefefef)
#if defined(__CHECKER__)
#define RUBY_INLINE static inline __attribute__((always_inline))
#define RUBY_WEAK(name) RUBY_INLINE
#elif defined(__GNUC__)
/*GCC*/
#define RUBY_INLINE static inline __attribute__((always_inline))
#if NO_RUBY_WEAK
#define RUBY_WEAK(name) RUBY_INLINE
#else
#define RUBY_WEAK(name) __attribute__((weak))
#endif
#else
/*MCC*/
#define RUBY_INLINE static _Inline
#if NO_RUBY_WEAK
#define RUBY_WEAK(name) RUBY_INLINE
#else
#define RUBY_WEAK(name) pragma Weak(name);
#endif
#pragma Offwarn(428)
#endif
#define ____in_mem_range(addr, start, size) \
(((addr) >= (start)) && ((addr) < (start) + (size)))
#if defined(STATIC_CHECK) || defined(__CHECKER__)
RUBY_INLINE int __in_mem_range(unsigned long addr, unsigned long start, unsigned long size)
{
return (((addr) >= (start)) && ((addr) < (start) + (size)));
}
#else
#define __in_mem_range ____in_mem_range
#endif
#if RUBY_MMAP_FLIP
RUBY_INLINE unsigned long virt_to_bus(const void *addr)
{
unsigned long ret = (unsigned long)addr;
if (__in_mem_range(ret, RUBY_SRAM_FLIP_BEGIN, RUBY_SRAM_SIZE)) {
ret = ret - RUBY_SRAM_FLIP_BEGIN + RUBY_SRAM_NOFLIP_BEGIN;
} else if (__in_mem_range(ret, RUBY_DRAM_FLIP_BEGIN, RUBY_MAX_DRAM_SIZE)) {
ret = ret - RUBY_DRAM_FLIP_BEGIN + RUBY_DRAM_NOFLIP_BEGIN;
} else if (ret < RUBY_HARDWARE_BEGIN) {
ret = RUBY_BAD_BUS_ADDR;
}
return ret;
}
RUBY_WEAK(bus_to_virt) void* bus_to_virt(unsigned long addr)
{
unsigned long ret = addr;
if (__in_mem_range(ret, RUBY_SRAM_NOFLIP_BEGIN, RUBY_SRAM_SIZE)) {
ret = ret - RUBY_SRAM_NOFLIP_BEGIN + RUBY_SRAM_FLIP_BEGIN;
} else if (__in_mem_range(ret, RUBY_DRAM_NOFLIP_BEGIN, RUBY_MAX_DRAM_SIZE)) {
ret = ret - RUBY_DRAM_NOFLIP_BEGIN + RUBY_DRAM_FLIP_BEGIN;
} else if (ret < RUBY_HARDWARE_BEGIN) {
ret = (unsigned long)RUBY_BAD_VIRT_ADDR;
}
return (void*)ret;
}
#else
/* Map 1:1, (x) address must be upper then 0x8000_0000. */
#define virt_to_bus(x) ((unsigned long)(x))
#define bus_to_virt(x) ((void *)(x))
#endif /* #if RUBY_MMAP_FLIP */
#ifndef __GNUC__
/* MCC */
#pragma Popwarn()
#endif
#endif /* #ifndef __ASSEMBLY__ */
#endif /* __COMMON_MEM_H */