mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
xen/arm: introduce vexpress_syscfg
Introduce a Versatile Express specific function to read/write motherboard settings. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Committed-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
1 parent
ea40403e1c
commit
89697a13da
6 files changed
+143
-18
No files matched your search
@@ -1,4 +1,5 @@
|
||||
subdir-$(arm32) += arm32
|
||||
subdir-y += platforms
|
||||
|
||||
obj-y += early_printk.o
|
||||
obj-y += domain.o
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
#include <asm/config.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/platform_vexpress.h>
|
||||
#include <asm/platforms/vexpress.h>
|
||||
#include <asm/asm_defns.h>
|
||||
#include <asm/gic.h>
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
obj-y += vexpress.o
|
||||
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* xen/arch/arm/platform_vexpress.c
|
||||
*
|
||||
* Versatile Express specific settings
|
||||
*
|
||||
* Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||||
* Copyright (c) 2013 Citrix Systems.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <asm/platforms/vexpress.h>
|
||||
#include <xen/mm.h>
|
||||
|
||||
#define DCC_SHIFT 26
|
||||
#define FUNCTION_SHIFT 20
|
||||
#define SITE_SHIFT 16
|
||||
#define POSITION_SHIFT 12
|
||||
#define DEVICE_SHIFT 0
|
||||
|
||||
static inline int vexpress_ctrl_start(uint32_t *syscfg, int write,
|
||||
int function, int device)
|
||||
{
|
||||
int dcc = 0; /* DCC to access */
|
||||
int site = 0; /* motherboard */
|
||||
int position = 0; /* daughterboard */
|
||||
uint32_t stat;
|
||||
|
||||
/* set control register */
|
||||
syscfg[V2M_SYS_CFGCTRL/4] = V2M_SYS_CFG_START |
|
||||
(write ? V2M_SYS_CFG_WRITE : 0) |
|
||||
(dcc << DCC_SHIFT) | (function << FUNCTION_SHIFT) |
|
||||
(site << SITE_SHIFT) | (position << POSITION_SHIFT) |
|
||||
(device << DEVICE_SHIFT);
|
||||
|
||||
/* wait for complete flag to be set */
|
||||
do {
|
||||
stat = syscfg[V2M_SYS_CFGSTAT/4];
|
||||
dsb();
|
||||
} while ( !(stat & V2M_SYS_CFG_COMPLETE) );
|
||||
|
||||
/* check error status and return error flag if set */
|
||||
if ( stat & V2M_SYS_CFG_ERROR )
|
||||
{
|
||||
printk(KERN_ERR "V2M SYS_CFGSTAT reported a configuration error\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vexpress_syscfg(int write, int function, int device, uint32_t *data)
|
||||
{
|
||||
uint32_t *syscfg = (uint32_t *) FIXMAP_ADDR(FIXMAP_MISC);
|
||||
int ret = -1;
|
||||
|
||||
set_fixmap(FIXMAP_MISC, V2M_SYS_MMIO_BASE >> PAGE_SHIFT, DEV_SHARED);
|
||||
|
||||
if ( syscfg[V2M_SYS_CFGCTRL/4] & V2M_SYS_CFG_START )
|
||||
goto out;
|
||||
|
||||
/* clear the complete bit in the V2M_SYS_CFGSTAT status register */
|
||||
syscfg[V2M_SYS_CFGSTAT/4] = 0;
|
||||
|
||||
if ( write )
|
||||
{
|
||||
/* write data */
|
||||
syscfg[V2M_SYS_CFGDATA/4] = *data;
|
||||
|
||||
if ( vexpress_ctrl_start(syscfg, write, function, device) < 0 )
|
||||
goto out;
|
||||
} else {
|
||||
if ( vexpress_ctrl_start(syscfg, write, function, device) < 0 )
|
||||
goto out;
|
||||
else
|
||||
/* read data */
|
||||
*data = syscfg[V2M_SYS_CFGDATA/4];
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
clear_fixmap(FIXMAP_MISC);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
* c-set-style: "BSD"
|
||||
* c-basic-offset: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||
@@ -1,17 +0,0 @@
|
||||
#ifndef __ASM_ARM_PLATFORM_H
|
||||
#define __ASM_ARM_PLATFORM_H
|
||||
|
||||
/* V2M */
|
||||
#define V2M_SYS_MMIO_BASE (0x1c010000)
|
||||
#define V2M_SYS_FLAGSSET (0x30)
|
||||
#define V2M_SYS_FLAGSCLR (0x34)
|
||||
|
||||
#endif /* __ASM_ARM_PLATFORM_H */
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
* c-set-style: "BSD"
|
||||
* c-basic-offset: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||
@@ -0,0 +1,40 @@
|
||||
#ifndef __ASM_ARM_PLATFORMS_VEXPRESS_H
|
||||
#define __ASM_ARM_PLATFORMS_VEXPRESS_H
|
||||
|
||||
/* V2M */
|
||||
#define V2M_SYS_MMIO_BASE (0x1c010000)
|
||||
#define V2M_SYS_FLAGSSET (0x30)
|
||||
#define V2M_SYS_FLAGSCLR (0x34)
|
||||
|
||||
#define V2M_SYS_CFGDATA (0x00A0)
|
||||
#define V2M_SYS_CFGCTRL (0x00A4)
|
||||
#define V2M_SYS_CFGSTAT (0x00A8)
|
||||
|
||||
#define V2M_SYS_CFG_START (1<<31)
|
||||
#define V2M_SYS_CFG_WRITE (1<<30)
|
||||
#define V2M_SYS_CFG_ERROR (1<<1)
|
||||
#define V2M_SYS_CFG_COMPLETE (1<<0)
|
||||
|
||||
#define V2M_SYS_CFG_OSC_FUNC 1
|
||||
#define V2M_SYS_CFG_OSC0 0
|
||||
#define V2M_SYS_CFG_OSC1 1
|
||||
#define V2M_SYS_CFG_OSC2 2
|
||||
#define V2M_SYS_CFG_OSC3 3
|
||||
#define V2M_SYS_CFG_OSC4 4
|
||||
#define V2M_SYS_CFG_OSC5 5
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <xen/inttypes.h>
|
||||
|
||||
int vexpress_syscfg(int write, int function, int device, uint32_t *data);
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_ARM_PLATFORMS_VEXPRESS_H */
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
* c-set-style: "BSD"
|
||||
* c-basic-offset: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||