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

common.c (2392B)


      1/*
      2 * Code commons to all DaVinci SoCs.
      3 *
      4 * Author: Mark A. Greer <mgreer@mvista.com>
      5 *
      6 * 2009 (c) MontaVista Software, Inc. This file is licensed under
      7 * the terms of the GNU General Public License version 2. This program
      8 * is licensed "as is" without any warranty of any kind, whether express
      9 * or implied.
     10 */
     11#include <linux/module.h>
     12#include <linux/io.h>
     13#include <linux/etherdevice.h>
     14#include <linux/davinci_emac.h>
     15#include <linux/dma-mapping.h>
     16
     17#include <asm/tlb.h>
     18#include <asm/mach/map.h>
     19
     20#include "common.h"
     21#include "cputype.h"
     22
     23struct davinci_soc_info davinci_soc_info;
     24EXPORT_SYMBOL(davinci_soc_info);
     25
     26static int __init davinci_init_id(struct davinci_soc_info *soc_info)
     27{
     28	int			i;
     29	struct davinci_id	*dip;
     30	u8			variant;
     31	u16			part_no;
     32	void __iomem		*base;
     33
     34	base = ioremap(soc_info->jtag_id_reg, SZ_4K);
     35	if (!base) {
     36		pr_err("Unable to map JTAG ID register\n");
     37		return -ENOMEM;
     38	}
     39
     40	soc_info->jtag_id = __raw_readl(base);
     41	iounmap(base);
     42
     43	variant = (soc_info->jtag_id & 0xf0000000) >> 28;
     44	part_no = (soc_info->jtag_id & 0x0ffff000) >> 12;
     45
     46	for (i = 0, dip = soc_info->ids; i < soc_info->ids_num;
     47			i++, dip++)
     48		/* Don't care about the manufacturer right now */
     49		if ((dip->part_no == part_no) && (dip->variant == variant)) {
     50			soc_info->cpu_id = dip->cpu_id;
     51			pr_info("DaVinci %s variant 0x%x\n", dip->name,
     52					dip->variant);
     53			return 0;
     54		}
     55
     56	pr_err("Unknown DaVinci JTAG ID 0x%x\n", soc_info->jtag_id);
     57	return -EINVAL;
     58}
     59
     60void __init davinci_common_init(const struct davinci_soc_info *soc_info)
     61{
     62	int ret;
     63
     64	if (!soc_info) {
     65		ret = -EINVAL;
     66		goto err;
     67	}
     68
     69	memcpy(&davinci_soc_info, soc_info, sizeof(struct davinci_soc_info));
     70
     71	if (davinci_soc_info.io_desc && (davinci_soc_info.io_desc_num > 0))
     72		iotable_init(davinci_soc_info.io_desc,
     73				davinci_soc_info.io_desc_num);
     74
     75	/*
     76	 * Normally devicemaps_init() would flush caches and tlb after
     77	 * mdesc->map_io(), but we must also do it here because of the CPU
     78	 * revision check below.
     79	 */
     80	local_flush_tlb_all();
     81	flush_cache_all();
     82
     83	/*
     84	 * We want to check CPU revision early for cpu_is_xxxx() macros.
     85	 * IO space mapping must be initialized before we can do that.
     86	 */
     87	ret = davinci_init_id(&davinci_soc_info);
     88	if (ret < 0)
     89		goto err;
     90
     91
     92	return;
     93
     94err:
     95	panic("davinci_common_init: SoC Initialization failed\n");
     96}
     97
     98void __init davinci_init_late(void)
     99{
    100	davinci_cpufreq_init();
    101}