1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (C) 2023, STMicroelectronics - All Rights Reserved
4 */
5
6#ifndef _STM32_FIREWALL_H
7#define _STM32_FIREWALL_H
8
9#include <linux/kernel.h>
10#include <linux/list.h>
11#include <linux/of.h>
12#include <linux/platform_device.h>
13#include <linux/types.h>
14
15/**
16 * STM32_PERIPHERAL_FIREWALL:		This type of firewall protects peripherals
17 * STM32_MEMORY_FIREWALL:		This type of firewall protects memories/subsets of memory
18 *					zones
19 * STM32_NOTYPE_FIREWALL:		Undefined firewall type
20 */
21
22#define STM32_PERIPHERAL_FIREWALL	BIT(1)
23#define STM32_MEMORY_FIREWALL		BIT(2)
24#define STM32_NOTYPE_FIREWALL		BIT(3)
25
26/**
27 * struct stm32_firewall_controller - Information on firewall controller supplying services
28 *
29 * @name:			Name of the firewall controller
30 * @dev:			Device reference of the firewall controller
31 * @mmio:			Base address of the firewall controller
32 * @entry:			List entry of the firewall controller list
33 * @type:			Type of firewall
34 * @max_entries:		Number of entries covered by the firewall
35 * @grant_access:		Callback used to grant access for a device access against a
36 *				firewall controller
37 * @release_access:		Callback used to release resources taken by a device when access was
38 *				granted
39 * @grant_memory_range_access:	Callback used to grant access for a device to a given memory region
40 */
41struct stm32_firewall_controller {
42	const char *name;
43	struct device *dev;
44	void __iomem *mmio;
45	struct list_head entry;
46	unsigned int type;
47	unsigned int max_entries;
48
49	int (*grant_access)(struct stm32_firewall_controller *ctrl, u32 id);
50	void (*release_access)(struct stm32_firewall_controller *ctrl, u32 id);
51	int (*grant_memory_range_access)(struct stm32_firewall_controller *ctrl, phys_addr_t paddr,
52					 size_t size);
53};
54
55/**
56 * stm32_firewall_controller_register - Register a firewall controller to the STM32 firewall
57 *					framework
58 * @firewall_controller:	Firewall controller to register
59 *
60 * Returns 0 in case of success or -ENODEV if no controller was given.
61 */
62int stm32_firewall_controller_register(struct stm32_firewall_controller *firewall_controller);
63
64/**
65 * stm32_firewall_controller_unregister - Unregister a firewall controller from the STM32
66 *					  firewall framework
67 * @firewall_controller:	Firewall controller to unregister
68 */
69void stm32_firewall_controller_unregister(struct stm32_firewall_controller *firewall_controller);
70
71/**
72 * stm32_firewall_populate_bus - Populate device tree nodes that have a correct firewall
73 *				 configuration. This is used at boot-time only, as a sanity check
74 *				 between device tree and firewalls hardware configurations to
75 *				 prevent a kernel crash when a device driver is not granted access
76 *
77 * @firewall_controller:	Firewall controller which nodes will be populated or not
78 *
79 * Returns 0 in case of success or appropriate errno code if error occurred.
80 */
81int stm32_firewall_populate_bus(struct stm32_firewall_controller *firewall_controller);
82
83#endif /* _STM32_FIREWALL_H */
84