cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

spear6xx.c (8782B)


      1/*
      2 * arch/arm/mach-spear6xx/spear6xx.c
      3 *
      4 * SPEAr6XX machines common source file
      5 *
      6 * Copyright (C) 2009 ST Microelectronics
      7 * Rajeev Kumar<rajeev-dlh.kumar@st.com>
      8 *
      9 * Copyright 2012 Stefan Roese <sr@denx.de>
     10 *
     11 * This file is licensed under the terms of the GNU General Public
     12 * License version 2. This program is licensed "as is" without any
     13 * warranty of any kind, whether express or implied.
     14 */
     15
     16#include <linux/amba/pl08x.h>
     17#include <linux/clk.h>
     18#include <linux/err.h>
     19#include <linux/of.h>
     20#include <linux/of_address.h>
     21#include <linux/of_platform.h>
     22#include <linux/amba/pl080.h>
     23#include <asm/mach/arch.h>
     24#include <asm/mach/time.h>
     25#include <asm/mach/map.h>
     26#include "pl080.h"
     27#include "generic.h"
     28#include "spear.h"
     29#include "misc_regs.h"
     30
     31/* dmac device registration */
     32static struct pl08x_channel_data spear600_dma_info[] = {
     33	{
     34		.bus_id = "ssp1_rx",
     35		.min_signal = 0,
     36		.max_signal = 0,
     37		.muxval = 0,
     38		.periph_buses = PL08X_AHB1,
     39	}, {
     40		.bus_id = "ssp1_tx",
     41		.min_signal = 1,
     42		.max_signal = 1,
     43		.muxval = 0,
     44		.periph_buses = PL08X_AHB1,
     45	}, {
     46		.bus_id = "uart0_rx",
     47		.min_signal = 2,
     48		.max_signal = 2,
     49		.muxval = 0,
     50		.periph_buses = PL08X_AHB1,
     51	}, {
     52		.bus_id = "uart0_tx",
     53		.min_signal = 3,
     54		.max_signal = 3,
     55		.muxval = 0,
     56		.periph_buses = PL08X_AHB1,
     57	}, {
     58		.bus_id = "uart1_rx",
     59		.min_signal = 4,
     60		.max_signal = 4,
     61		.muxval = 0,
     62		.periph_buses = PL08X_AHB1,
     63	}, {
     64		.bus_id = "uart1_tx",
     65		.min_signal = 5,
     66		.max_signal = 5,
     67		.muxval = 0,
     68		.periph_buses = PL08X_AHB1,
     69	}, {
     70		.bus_id = "ssp2_rx",
     71		.min_signal = 6,
     72		.max_signal = 6,
     73		.muxval = 0,
     74		.periph_buses = PL08X_AHB2,
     75	}, {
     76		.bus_id = "ssp2_tx",
     77		.min_signal = 7,
     78		.max_signal = 7,
     79		.muxval = 0,
     80		.periph_buses = PL08X_AHB2,
     81	}, {
     82		.bus_id = "ssp0_rx",
     83		.min_signal = 8,
     84		.max_signal = 8,
     85		.muxval = 0,
     86		.periph_buses = PL08X_AHB1,
     87	}, {
     88		.bus_id = "ssp0_tx",
     89		.min_signal = 9,
     90		.max_signal = 9,
     91		.muxval = 0,
     92		.periph_buses = PL08X_AHB1,
     93	}, {
     94		.bus_id = "i2c_rx",
     95		.min_signal = 10,
     96		.max_signal = 10,
     97		.muxval = 0,
     98		.periph_buses = PL08X_AHB1,
     99	}, {
    100		.bus_id = "i2c_tx",
    101		.min_signal = 11,
    102		.max_signal = 11,
    103		.muxval = 0,
    104		.periph_buses = PL08X_AHB1,
    105	}, {
    106		.bus_id = "irda",
    107		.min_signal = 12,
    108		.max_signal = 12,
    109		.muxval = 0,
    110		.periph_buses = PL08X_AHB1,
    111	}, {
    112		.bus_id = "adc",
    113		.min_signal = 13,
    114		.max_signal = 13,
    115		.muxval = 0,
    116		.periph_buses = PL08X_AHB2,
    117	}, {
    118		.bus_id = "to_jpeg",
    119		.min_signal = 14,
    120		.max_signal = 14,
    121		.muxval = 0,
    122		.periph_buses = PL08X_AHB1,
    123	}, {
    124		.bus_id = "from_jpeg",
    125		.min_signal = 15,
    126		.max_signal = 15,
    127		.muxval = 0,
    128		.periph_buses = PL08X_AHB1,
    129	}, {
    130		.bus_id = "ras0_rx",
    131		.min_signal = 0,
    132		.max_signal = 0,
    133		.muxval = 1,
    134		.periph_buses = PL08X_AHB1,
    135	}, {
    136		.bus_id = "ras0_tx",
    137		.min_signal = 1,
    138		.max_signal = 1,
    139		.muxval = 1,
    140		.periph_buses = PL08X_AHB1,
    141	}, {
    142		.bus_id = "ras1_rx",
    143		.min_signal = 2,
    144		.max_signal = 2,
    145		.muxval = 1,
    146		.periph_buses = PL08X_AHB1,
    147	}, {
    148		.bus_id = "ras1_tx",
    149		.min_signal = 3,
    150		.max_signal = 3,
    151		.muxval = 1,
    152		.periph_buses = PL08X_AHB1,
    153	}, {
    154		.bus_id = "ras2_rx",
    155		.min_signal = 4,
    156		.max_signal = 4,
    157		.muxval = 1,
    158		.periph_buses = PL08X_AHB1,
    159	}, {
    160		.bus_id = "ras2_tx",
    161		.min_signal = 5,
    162		.max_signal = 5,
    163		.muxval = 1,
    164		.periph_buses = PL08X_AHB1,
    165	}, {
    166		.bus_id = "ras3_rx",
    167		.min_signal = 6,
    168		.max_signal = 6,
    169		.muxval = 1,
    170		.periph_buses = PL08X_AHB1,
    171	}, {
    172		.bus_id = "ras3_tx",
    173		.min_signal = 7,
    174		.max_signal = 7,
    175		.muxval = 1,
    176		.periph_buses = PL08X_AHB1,
    177	}, {
    178		.bus_id = "ras4_rx",
    179		.min_signal = 8,
    180		.max_signal = 8,
    181		.muxval = 1,
    182		.periph_buses = PL08X_AHB1,
    183	}, {
    184		.bus_id = "ras4_tx",
    185		.min_signal = 9,
    186		.max_signal = 9,
    187		.muxval = 1,
    188		.periph_buses = PL08X_AHB1,
    189	}, {
    190		.bus_id = "ras5_rx",
    191		.min_signal = 10,
    192		.max_signal = 10,
    193		.muxval = 1,
    194		.periph_buses = PL08X_AHB1,
    195	}, {
    196		.bus_id = "ras5_tx",
    197		.min_signal = 11,
    198		.max_signal = 11,
    199		.muxval = 1,
    200		.periph_buses = PL08X_AHB1,
    201	}, {
    202		.bus_id = "ras6_rx",
    203		.min_signal = 12,
    204		.max_signal = 12,
    205		.muxval = 1,
    206		.periph_buses = PL08X_AHB1,
    207	}, {
    208		.bus_id = "ras6_tx",
    209		.min_signal = 13,
    210		.max_signal = 13,
    211		.muxval = 1,
    212		.periph_buses = PL08X_AHB1,
    213	}, {
    214		.bus_id = "ras7_rx",
    215		.min_signal = 14,
    216		.max_signal = 14,
    217		.muxval = 1,
    218		.periph_buses = PL08X_AHB1,
    219	}, {
    220		.bus_id = "ras7_tx",
    221		.min_signal = 15,
    222		.max_signal = 15,
    223		.muxval = 1,
    224		.periph_buses = PL08X_AHB1,
    225	}, {
    226		.bus_id = "ext0_rx",
    227		.min_signal = 0,
    228		.max_signal = 0,
    229		.muxval = 2,
    230		.periph_buses = PL08X_AHB2,
    231	}, {
    232		.bus_id = "ext0_tx",
    233		.min_signal = 1,
    234		.max_signal = 1,
    235		.muxval = 2,
    236		.periph_buses = PL08X_AHB2,
    237	}, {
    238		.bus_id = "ext1_rx",
    239		.min_signal = 2,
    240		.max_signal = 2,
    241		.muxval = 2,
    242		.periph_buses = PL08X_AHB2,
    243	}, {
    244		.bus_id = "ext1_tx",
    245		.min_signal = 3,
    246		.max_signal = 3,
    247		.muxval = 2,
    248		.periph_buses = PL08X_AHB2,
    249	}, {
    250		.bus_id = "ext2_rx",
    251		.min_signal = 4,
    252		.max_signal = 4,
    253		.muxval = 2,
    254		.periph_buses = PL08X_AHB2,
    255	}, {
    256		.bus_id = "ext2_tx",
    257		.min_signal = 5,
    258		.max_signal = 5,
    259		.muxval = 2,
    260		.periph_buses = PL08X_AHB2,
    261	}, {
    262		.bus_id = "ext3_rx",
    263		.min_signal = 6,
    264		.max_signal = 6,
    265		.muxval = 2,
    266		.periph_buses = PL08X_AHB2,
    267	}, {
    268		.bus_id = "ext3_tx",
    269		.min_signal = 7,
    270		.max_signal = 7,
    271		.muxval = 2,
    272		.periph_buses = PL08X_AHB2,
    273	}, {
    274		.bus_id = "ext4_rx",
    275		.min_signal = 8,
    276		.max_signal = 8,
    277		.muxval = 2,
    278		.periph_buses = PL08X_AHB2,
    279	}, {
    280		.bus_id = "ext4_tx",
    281		.min_signal = 9,
    282		.max_signal = 9,
    283		.muxval = 2,
    284		.periph_buses = PL08X_AHB2,
    285	}, {
    286		.bus_id = "ext5_rx",
    287		.min_signal = 10,
    288		.max_signal = 10,
    289		.muxval = 2,
    290		.periph_buses = PL08X_AHB2,
    291	}, {
    292		.bus_id = "ext5_tx",
    293		.min_signal = 11,
    294		.max_signal = 11,
    295		.muxval = 2,
    296		.periph_buses = PL08X_AHB2,
    297	}, {
    298		.bus_id = "ext6_rx",
    299		.min_signal = 12,
    300		.max_signal = 12,
    301		.muxval = 2,
    302		.periph_buses = PL08X_AHB2,
    303	}, {
    304		.bus_id = "ext6_tx",
    305		.min_signal = 13,
    306		.max_signal = 13,
    307		.muxval = 2,
    308		.periph_buses = PL08X_AHB2,
    309	}, {
    310		.bus_id = "ext7_rx",
    311		.min_signal = 14,
    312		.max_signal = 14,
    313		.muxval = 2,
    314		.periph_buses = PL08X_AHB2,
    315	}, {
    316		.bus_id = "ext7_tx",
    317		.min_signal = 15,
    318		.max_signal = 15,
    319		.muxval = 2,
    320		.periph_buses = PL08X_AHB2,
    321	},
    322};
    323
    324static struct pl08x_platform_data spear6xx_pl080_plat_data = {
    325	.memcpy_burst_size = PL08X_BURST_SZ_16,
    326	.memcpy_bus_width = PL08X_BUS_WIDTH_32_BITS,
    327	.memcpy_prot_buff = true,
    328	.memcpy_prot_cache = true,
    329	.lli_buses = PL08X_AHB1,
    330	.mem_buses = PL08X_AHB1,
    331	.get_xfer_signal = pl080_get_signal,
    332	.put_xfer_signal = pl080_put_signal,
    333	.slave_channels = spear600_dma_info,
    334	.num_slave_channels = ARRAY_SIZE(spear600_dma_info),
    335};
    336
    337/*
    338 * Following will create 16MB static virtual/physical mappings
    339 * PHYSICAL		VIRTUAL
    340 * 0xF0000000		0xF0000000
    341 * 0xF1000000		0xF1000000
    342 * 0xD0000000		0xFD000000
    343 * 0xFC000000		0xFC000000
    344 */
    345struct map_desc spear6xx_io_desc[] __initdata = {
    346	{
    347		.virtual	= (unsigned long)VA_SPEAR6XX_ML_CPU_BASE,
    348		.pfn		= __phys_to_pfn(SPEAR_ICM3_ML1_2_BASE),
    349		.length		= 2 * SZ_16M,
    350		.type		= MT_DEVICE
    351	},	{
    352		.virtual	= (unsigned long)VA_SPEAR_ICM1_2_BASE,
    353		.pfn		= __phys_to_pfn(SPEAR_ICM1_2_BASE),
    354		.length		= SZ_16M,
    355		.type		= MT_DEVICE
    356	}, {
    357		.virtual	= (unsigned long)VA_SPEAR_ICM3_SMI_CTRL_BASE,
    358		.pfn		= __phys_to_pfn(SPEAR_ICM3_SMI_CTRL_BASE),
    359		.length		= SZ_16M,
    360		.type		= MT_DEVICE
    361	},
    362};
    363
    364/* This will create static memory mapping for selected devices */
    365void __init spear6xx_map_io(void)
    366{
    367	iotable_init(spear6xx_io_desc, ARRAY_SIZE(spear6xx_io_desc));
    368}
    369
    370void __init spear6xx_timer_init(void)
    371{
    372	char pclk_name[] = "pll3_clk";
    373	struct clk *gpt_clk, *pclk;
    374
    375	spear6xx_clk_init(MISC_BASE);
    376
    377	/* get the system timer clock */
    378	gpt_clk = clk_get_sys("gpt0", NULL);
    379	if (IS_ERR(gpt_clk)) {
    380		pr_err("%s:couldn't get clk for gpt\n", __func__);
    381		BUG();
    382	}
    383
    384	/* get the suitable parent clock for timer*/
    385	pclk = clk_get(NULL, pclk_name);
    386	if (IS_ERR(pclk)) {
    387		pr_err("%s:couldn't get %s as parent for gpt\n",
    388				__func__, pclk_name);
    389		BUG();
    390	}
    391
    392	clk_set_parent(gpt_clk, pclk);
    393	clk_put(gpt_clk);
    394	clk_put(pclk);
    395
    396	spear_setup_of_timer();
    397}
    398
    399/* Add auxdata to pass platform data */
    400struct of_dev_auxdata spear6xx_auxdata_lookup[] __initdata = {
    401	OF_DEV_AUXDATA("arm,pl080", SPEAR_ICM3_DMA_BASE, NULL,
    402			&spear6xx_pl080_plat_data),
    403	{}
    404};
    405
    406static void __init spear600_dt_init(void)
    407{
    408	of_platform_default_populate(NULL, spear6xx_auxdata_lookup, NULL);
    409}
    410
    411static const char *spear600_dt_board_compat[] = {
    412	"st,spear600",
    413	NULL
    414};
    415
    416DT_MACHINE_START(SPEAR600_DT, "ST SPEAr600 (Flattened Device Tree)")
    417	.map_io		=	spear6xx_map_io,
    418	.init_time	=	spear6xx_timer_init,
    419	.init_machine	=	spear600_dt_init,
    420	.restart	=	spear_restart,
    421	.dt_compat	=	spear600_dt_board_compat,
    422MACHINE_END