Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
f3199673
Commit
f3199673
authored
Nov 13, 2017
by
Alex Williamson
Browse files
Options
Browse Files
Download
Plain Diff
Merge branches 'vfio/fixes' and 'vfio/platform' into vfio-next-20171113.0
parents
71a7d3d7
e2588341
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
123 additions
and
0 deletions
+123
-0
drivers/vfio/platform/reset/Kconfig
drivers/vfio/platform/reset/Kconfig
+9
-0
drivers/vfio/platform/reset/Makefile
drivers/vfio/platform/reset/Makefile
+1
-0
drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
+113
-0
No files found.
drivers/vfio/platform/reset/Kconfig
View file @
f3199673
...
...
@@ -13,3 +13,12 @@ config VFIO_PLATFORM_AMDXGBE_RESET
Enables the VFIO platform driver to handle reset for AMD XGBE
If you don't know what to do here, say N.
config VFIO_PLATFORM_BCMFLEXRM_RESET
tristate "VFIO support for Broadcom FlexRM reset"
depends on VFIO_PLATFORM && (ARCH_BCM_IPROC || COMPILE_TEST)
default ARCH_BCM_IPROC
help
Enables the VFIO platform driver to handle reset for Broadcom FlexRM
If you don't know what to do here, say N.
drivers/vfio/platform/reset/Makefile
View file @
f3199673
...
...
@@ -5,3 +5,4 @@ ccflags-y += -Idrivers/vfio/platform
obj-$(CONFIG_VFIO_PLATFORM_CALXEDAXGMAC_RESET)
+=
vfio-platform-calxedaxgmac.o
obj-$(CONFIG_VFIO_PLATFORM_AMDXGBE_RESET)
+=
vfio-platform-amdxgbe.o
obj-$(CONFIG_VFIO_PLATFORM_BCMFLEXRM_RESET)
+=
vfio_platform_bcmflexrm.o
drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
0 → 100644
View file @
f3199673
/*
* Copyright (C) 2017 Broadcom
*
* 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 version 2.
*
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
* kind, whether express or implied; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
/*
* This driver provides reset support for Broadcom FlexRM ring manager
* to VFIO platform.
*/
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include "vfio_platform_private.h"
/* FlexRM configuration */
#define RING_REGS_SIZE 0x10000
#define RING_VER_MAGIC 0x76303031
/* Per-Ring register offsets */
#define RING_VER 0x000
#define RING_CONTROL 0x034
#define RING_FLUSH_DONE 0x038
/* Register RING_CONTROL fields */
#define CONTROL_FLUSH_SHIFT 5
/* Register RING_FLUSH_DONE fields */
#define FLUSH_DONE_MASK 0x1
static
int
vfio_platform_bcmflexrm_shutdown
(
void
__iomem
*
ring
)
{
unsigned
int
timeout
;
/* Disable/inactivate ring */
writel_relaxed
(
0x0
,
ring
+
RING_CONTROL
);
/* Set ring flush state */
timeout
=
1000
;
/* timeout of 1s */
writel_relaxed
(
BIT
(
CONTROL_FLUSH_SHIFT
),
ring
+
RING_CONTROL
);
do
{
if
(
readl_relaxed
(
ring
+
RING_FLUSH_DONE
)
&
FLUSH_DONE_MASK
)
break
;
mdelay
(
1
);
}
while
(
--
timeout
);
if
(
!
timeout
)
return
-
ETIMEDOUT
;
/* Clear ring flush state */
timeout
=
1000
;
/* timeout of 1s */
writel_relaxed
(
0x0
,
ring
+
RING_CONTROL
);
do
{
if
(
!
(
readl_relaxed
(
ring
+
RING_FLUSH_DONE
)
&
FLUSH_DONE_MASK
))
break
;
mdelay
(
1
);
}
while
(
--
timeout
);
if
(
!
timeout
)
return
-
ETIMEDOUT
;
return
0
;
}
static
int
vfio_platform_bcmflexrm_reset
(
struct
vfio_platform_device
*
vdev
)
{
void
__iomem
*
ring
;
int
rc
=
0
,
ret
=
0
,
ring_num
=
0
;
struct
vfio_platform_region
*
reg
=
&
vdev
->
regions
[
0
];
/* Map FlexRM ring registers if not mapped */
if
(
!
reg
->
ioaddr
)
{
reg
->
ioaddr
=
ioremap_nocache
(
reg
->
addr
,
reg
->
size
);
if
(
!
reg
->
ioaddr
)
return
-
ENOMEM
;
}
/* Discover and shutdown each FlexRM ring */
for
(
ring
=
reg
->
ioaddr
;
ring
<
(
reg
->
ioaddr
+
reg
->
size
);
ring
+=
RING_REGS_SIZE
)
{
if
(
readl_relaxed
(
ring
+
RING_VER
)
==
RING_VER_MAGIC
)
{
rc
=
vfio_platform_bcmflexrm_shutdown
(
ring
);
if
(
rc
)
{
dev_warn
(
vdev
->
device
,
"FlexRM ring%d shutdown error %d
\n
"
,
ring_num
,
rc
);
ret
|=
rc
;
}
ring_num
++
;
}
}
return
ret
;
}
module_vfio_reset_handler
(
"brcm,iproc-flexrm-mbox"
,
vfio_platform_bcmflexrm_reset
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_AUTHOR
(
"Anup Patel <anup.patel@broadcom.com>"
);
MODULE_DESCRIPTION
(
"Reset support for Broadcom FlexRM VFIO platform device"
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment