lkml.org 
[lkml]   [2011]   [Jul]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [PATCH] powerpc: convert to generic pci_*_flags
From
Date
On Fri, 2011-07-08 at 21:21 -0500, Rob Herring wrote:
> From: Rob Herring <rob.herring@calxeda.com>
>
> This converts powerpc to use generic pci_set/add/has_flags functions from
> asm-generic/pci-bridge.h.
>
> Signed-off-by: Rob Herring <rob.herring@calxeda.com>

Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

> Cc: Paul Mackerras <paulus@samba.org>
> ---
> Compiled on 86xx and G5.
>
> This is part of a ARM PCI clean-up which moves the microblaze pci flags
> functions to asm-generic/pci-bridge.h.

Just make sure that goes into -next early before a merge window so I get
a chance to catch any mistake on one of our odd platforms.

Cheers,
Ben.

> arch/powerpc/include/asm/pci-bridge.h | 50 +---------------------------
> arch/powerpc/include/asm/pci.h | 2 +-
> arch/powerpc/kernel/pci-common.c | 22 ++++++------
> arch/powerpc/kernel/pci_32.c | 2 +-
> arch/powerpc/kernel/pci_64.c | 4 +-
> arch/powerpc/kernel/rtas_pci.c | 2 +-
> arch/powerpc/platforms/40x/ep405.c | 2 +-
> arch/powerpc/platforms/40x/ppc40x_simple.c | 2 +-
> arch/powerpc/platforms/40x/walnut.c | 2 +-
> arch/powerpc/platforms/44x/canyonlands.c | 2 +-
> arch/powerpc/platforms/44x/ebony.c | 2 +-
> arch/powerpc/platforms/44x/ppc44x_simple.c | 2 +-
> arch/powerpc/platforms/44x/sam440ep.c | 2 +-
> arch/powerpc/platforms/52xx/mpc52xx_pci.c | 2 +-
> arch/powerpc/platforms/82xx/pq2.c | 2 +-
> arch/powerpc/platforms/chrp/pci.c | 2 +-
> arch/powerpc/platforms/powermac/pci.c | 6 ++--
> arch/powerpc/sysdev/fsl_pci.c | 4 +-
> arch/powerpc/sysdev/grackle.c | 2 +-
> arch/powerpc/sysdev/ppc4xx_pci.c | 2 +-
> 20 files changed, 34 insertions(+), 82 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h
> index b90dbf8..8a9cb9f 100644
> --- a/arch/powerpc/include/asm/pci-bridge.h
> +++ b/arch/powerpc/include/asm/pci-bridge.h
> @@ -10,58 +10,10 @@
> #include <linux/pci.h>
> #include <linux/list.h>
> #include <linux/ioport.h>
> +#include <asm-generic/pci-bridge.h>
>
> struct device_node;
>
> -enum {
> - /* Force re-assigning all resources (ignore firmware
> - * setup completely)
> - */
> - PPC_PCI_REASSIGN_ALL_RSRC = 0x00000001,
> -
> - /* Re-assign all bus numbers */
> - PPC_PCI_REASSIGN_ALL_BUS = 0x00000002,
> -
> - /* Do not try to assign, just use existing setup */
> - PPC_PCI_PROBE_ONLY = 0x00000004,
> -
> - /* Don't bother with ISA alignment unless the bridge has
> - * ISA forwarding enabled
> - */
> - PPC_PCI_CAN_SKIP_ISA_ALIGN = 0x00000008,
> -
> - /* Enable domain numbers in /proc */
> - PPC_PCI_ENABLE_PROC_DOMAINS = 0x00000010,
> - /* ... except for domain 0 */
> - PPC_PCI_COMPAT_DOMAIN_0 = 0x00000020,
> -};
> -#ifdef CONFIG_PCI
> -extern unsigned int ppc_pci_flags;
> -
> -static inline void ppc_pci_set_flags(int flags)
> -{
> - ppc_pci_flags = flags;
> -}
> -
> -static inline void ppc_pci_add_flags(int flags)
> -{
> - ppc_pci_flags |= flags;
> -}
> -
> -static inline int ppc_pci_has_flag(int flag)
> -{
> - return (ppc_pci_flags & flag);
> -}
> -#else
> -static inline void ppc_pci_set_flags(int flags) { }
> -static inline void ppc_pci_add_flags(int flags) { }
> -static inline int ppc_pci_has_flag(int flag)
> -{
> - return 0;
> -}
> -#endif
> -
> -
> /*
> * Structure of a PCI controller (host bridge)
> */
> diff --git a/arch/powerpc/include/asm/pci.h b/arch/powerpc/include/asm/pci.h
> index 7d77909..b9a40fa 100644
> --- a/arch/powerpc/include/asm/pci.h
> +++ b/arch/powerpc/include/asm/pci.h
> @@ -44,7 +44,7 @@ struct pci_dev;
> * bus numbers (don't do that on ppc64 yet !)
> */
> #define pcibios_assign_all_busses() \
> - (ppc_pci_has_flag(PPC_PCI_REASSIGN_ALL_BUS))
> + (pci_has_flag(PCI_REASSIGN_ALL_BUS))
>
> static inline void pcibios_set_master(struct pci_dev *dev)
> {
> diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
> index 893af2a..4b9ae67 100644
> --- a/arch/powerpc/kernel/pci-common.c
> +++ b/arch/powerpc/kernel/pci-common.c
> @@ -50,7 +50,7 @@ static int global_phb_number; /* Global phb counter */
> resource_size_t isa_mem_base;
>
> /* Default PCI flags is 0 on ppc32, modified at boot on ppc64 */
> -unsigned int ppc_pci_flags = 0;
> +unsigned int pci_flags = 0;
>
>
> static struct dma_map_ops *pci_dma_ops = &dma_direct_ops;
> @@ -842,9 +842,9 @@ int pci_proc_domain(struct pci_bus *bus)
> {
> struct pci_controller *hose = pci_bus_to_host(bus);
>
> - if (!(ppc_pci_flags & PPC_PCI_ENABLE_PROC_DOMAINS))
> + if (!pci_has_flag(PCI_ENABLE_PROC_DOMAINS))
> return 0;
> - if (ppc_pci_flags & PPC_PCI_COMPAT_DOMAIN_0)
> + if (pci_has_flag(PCI_COMPAT_DOMAIN_0))
> return hose->global_number != 0;
> return 1;
> }
> @@ -920,13 +920,13 @@ static void __devinit pcibios_fixup_resources(struct pci_dev *dev)
> struct resource *res = dev->resource + i;
> if (!res->flags)
> continue;
> - /* On platforms that have PPC_PCI_PROBE_ONLY set, we don't
> + /* On platforms that have PCI_PROBE_ONLY set, we don't
> * consider 0 as an unassigned BAR value. It's technically
> * a valid value, but linux doesn't like it... so when we can
> * re-assign things, we do so, but if we can't, we keep it
> * around and hope for the best...
> */
> - if (res->start == 0 && !(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) {
> + if (res->start == 0 && !pci_has_flag(PCI_PROBE_ONLY)) {
> pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] is unassigned\n",
> pci_name(dev), i,
> (unsigned long long)res->start,
> @@ -973,7 +973,7 @@ static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus,
> int i;
>
> /* We don't do anything if PCI_PROBE_ONLY is set */
> - if (ppc_pci_flags & PPC_PCI_PROBE_ONLY)
> + if (pci_has_flag(PCI_PROBE_ONLY))
> return 0;
>
> /* Job is a bit different between memory and IO */
> @@ -1146,7 +1146,7 @@ void __devinit pci_fixup_cardbus(struct pci_bus *bus)
>
> static int skip_isa_ioresource_align(struct pci_dev *dev)
> {
> - if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) &&
> + if (pci_has_flag(PCI_CAN_SKIP_ISA_ALIGN) &&
> !(dev->bus->bridge_ctl & PCI_BRIDGE_CTL_ISA))
> return 1;
> return 0;
> @@ -1274,7 +1274,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)
> * and as such ensure proper re-allocation
> * later.
> */
> - if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)
> + if (pci_has_flag(PCI_REASSIGN_ALL_RSRC))
> goto clear_resource;
> pr = pci_find_parent_resource(bus->self, res);
> if (pr == res) {
> @@ -1459,7 +1459,7 @@ void __init pcibios_resource_survey(void)
> list_for_each_entry(b, &pci_root_buses, node)
> pcibios_allocate_bus_resources(b);
>
> - if (!(ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)) {
> + if (!pci_has_flag(PCI_REASSIGN_ALL_RSRC)) {
> pcibios_allocate_resources(0);
> pcibios_allocate_resources(1);
> }
> @@ -1468,7 +1468,7 @@ void __init pcibios_resource_survey(void)
> * the low IO area and the VGA memory area if they intersect the
> * bus available resources to avoid allocating things on top of them
> */
> - if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) {
> + if (!pci_has_flag(PCI_PROBE_ONLY)) {
> list_for_each_entry(b, &pci_root_buses, node)
> pcibios_reserve_legacy_regions(b);
> }
> @@ -1476,7 +1476,7 @@ void __init pcibios_resource_survey(void)
> /* Now, if the platform didn't decide to blindly trust the firmware,
> * we proceed to assigning things that were left unassigned
> */
> - if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) {
> + if (!pci_has_flag(PCI_PROBE_ONLY)) {
> pr_debug("PCI: Assigning unassigned resources...\n");
> pci_assign_unassigned_resources();
> }
> diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c
> index bedb370..b1959bf 100644
> --- a/arch/powerpc/kernel/pci_32.c
> +++ b/arch/powerpc/kernel/pci_32.c
> @@ -373,7 +373,7 @@ static int __init pcibios_init(void)
>
> printk(KERN_INFO "PCI: Probing PCI hardware\n");
>
> - if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_BUS)
> + if (pci_has_flag(PCI_REASSIGN_ALL_BUS))
> pci_assign_all_buses = 1;
>
> /* Scan all of the recorded PCI controllers. */
> diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
> index fc6452b..ab34046 100644
> --- a/arch/powerpc/kernel/pci_64.c
> +++ b/arch/powerpc/kernel/pci_64.c
> @@ -55,12 +55,12 @@ static int __init pcibios_init(void)
> ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot;
>
> if (pci_probe_only)
> - ppc_pci_flags |= PPC_PCI_PROBE_ONLY;
> + pci_add_flags(PCI_PROBE_ONLY);
>
> /* On ppc64, we always enable PCI domains and we keep domain 0
> * backward compatible in /proc for video cards
> */
> - ppc_pci_flags |= PPC_PCI_ENABLE_PROC_DOMAINS | PPC_PCI_COMPAT_DOMAIN_0;
> + pci_add_flags(PCI_ENABLE_PROC_DOMAINS | PCI_COMPAT_DOMAIN_0);
>
> /* Scan all of the recorded PCI controllers. */
> list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
> diff --git a/arch/powerpc/kernel/rtas_pci.c b/arch/powerpc/kernel/rtas_pci.c
> index 54e66da..6cd8f01 100644
> --- a/arch/powerpc/kernel/rtas_pci.c
> +++ b/arch/powerpc/kernel/rtas_pci.c
> @@ -291,7 +291,7 @@ void __init find_and_init_phbs(void)
> prop = of_get_property(of_chosen,
> "linux,pci-assign-all-buses", NULL);
> if (prop && *prop)
> - ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
> + pci_add_flags(PCI_REASSIGN_ALL_BUS);
> #endif /* CONFIG_PPC32 */
> }
> }
> diff --git a/arch/powerpc/platforms/40x/ep405.c b/arch/powerpc/platforms/40x/ep405.c
> index 4058fd1..b0389bb 100644
> --- a/arch/powerpc/platforms/40x/ep405.c
> +++ b/arch/powerpc/platforms/40x/ep405.c
> @@ -100,7 +100,7 @@ static void __init ep405_setup_arch(void)
> /* Find & init the BCSR CPLD */
> ep405_init_bcsr();
>
> - ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
> + pci_set_flags(PCI_REASSIGN_ALL_RSRC);
> }
>
> static int __init ep405_probe(void)
> diff --git a/arch/powerpc/platforms/40x/ppc40x_simple.c b/arch/powerpc/platforms/40x/ppc40x_simple.c
> index 2521d93..e8dd5c5 100644
> --- a/arch/powerpc/platforms/40x/ppc40x_simple.c
> +++ b/arch/powerpc/platforms/40x/ppc40x_simple.c
> @@ -61,7 +61,7 @@ static const char *board[] __initdata = {
> static int __init ppc40x_probe(void)
> {
> if (of_flat_dt_match(of_get_flat_dt_root(), board)) {
> - ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
> + pci_set_flags(PCI_REASSIGN_ALL_RSRC);
> return 1;
> }
>
> diff --git a/arch/powerpc/platforms/40x/walnut.c b/arch/powerpc/platforms/40x/walnut.c
> index 335df91..8b691df 100644
> --- a/arch/powerpc/platforms/40x/walnut.c
> +++ b/arch/powerpc/platforms/40x/walnut.c
> @@ -51,7 +51,7 @@ static int __init walnut_probe(void)
> if (!of_flat_dt_is_compatible(root, "ibm,walnut"))
> return 0;
>
> - ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
> + pci_set_flags(PCI_REASSIGN_ALL_RSRC);
>
> return 1;
> }
> diff --git a/arch/powerpc/platforms/44x/canyonlands.c b/arch/powerpc/platforms/44x/canyonlands.c
> index afc5e8e..e300dd4 100644
> --- a/arch/powerpc/platforms/44x/canyonlands.c
> +++ b/arch/powerpc/platforms/44x/canyonlands.c
> @@ -55,7 +55,7 @@ static int __init ppc460ex_probe(void)
> {
> unsigned long root = of_get_flat_dt_root();
> if (of_flat_dt_is_compatible(root, "amcc,canyonlands")) {
> - ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
> + pci_set_flags(PCI_REASSIGN_ALL_RSRC);
> return 1;
> }
> return 0;
> diff --git a/arch/powerpc/platforms/44x/ebony.c b/arch/powerpc/platforms/44x/ebony.c
> index 88b9117..6a4232b 100644
> --- a/arch/powerpc/platforms/44x/ebony.c
> +++ b/arch/powerpc/platforms/44x/ebony.c
> @@ -54,7 +54,7 @@ static int __init ebony_probe(void)
> if (!of_flat_dt_is_compatible(root, "ibm,ebony"))
> return 0;
>
> - ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
> + pci_set_flags(PCI_REASSIGN_ALL_RSRC);
>
> return 1;
> }
> diff --git a/arch/powerpc/platforms/44x/ppc44x_simple.c b/arch/powerpc/platforms/44x/ppc44x_simple.c
> index c81c19c..8d22027 100644
> --- a/arch/powerpc/platforms/44x/ppc44x_simple.c
> +++ b/arch/powerpc/platforms/44x/ppc44x_simple.c
> @@ -72,7 +72,7 @@ static int __init ppc44x_probe(void)
>
> for (i = 0; i < ARRAY_SIZE(board); i++) {
> if (of_flat_dt_is_compatible(root, board[i])) {
> - ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
> + pci_set_flags(PCI_REASSIGN_ALL_RSRC);
> return 1;
> }
> }
> diff --git a/arch/powerpc/platforms/44x/sam440ep.c b/arch/powerpc/platforms/44x/sam440ep.c
> index a78e8eb..9e09b83 100644
> --- a/arch/powerpc/platforms/44x/sam440ep.c
> +++ b/arch/powerpc/platforms/44x/sam440ep.c
> @@ -51,7 +51,7 @@ static int __init sam440ep_probe(void)
> if (!of_flat_dt_is_compatible(root, "acube,sam440ep"))
> return 0;
>
> - ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
> + pci_set_flags(PCI_REASSIGN_ALL_RSRC);
>
> return 1;
> }
> diff --git a/arch/powerpc/platforms/52xx/mpc52xx_pci.c b/arch/powerpc/platforms/52xx/mpc52xx_pci.c
> index da110bd..82051bd 100644
> --- a/arch/powerpc/platforms/52xx/mpc52xx_pci.c
> +++ b/arch/powerpc/platforms/52xx/mpc52xx_pci.c
> @@ -371,7 +371,7 @@ mpc52xx_add_bridge(struct device_node *node)
>
> pr_debug("Adding MPC52xx PCI host bridge %s\n", node->full_name);
>
> - ppc_pci_add_flags(PPC_PCI_REASSIGN_ALL_BUS);
> + pci_add_flags(PCI_REASSIGN_ALL_BUS);
>
> if (of_address_to_resource(node, 0, &rsrc) != 0) {
> printk(KERN_ERR "Can't get %s resources\n", node->full_name);
> diff --git a/arch/powerpc/platforms/82xx/pq2.c b/arch/powerpc/platforms/82xx/pq2.c
> index 9761a59..d111b02 100644
> --- a/arch/powerpc/platforms/82xx/pq2.c
> +++ b/arch/powerpc/platforms/82xx/pq2.c
> @@ -53,7 +53,7 @@ static void __init pq2_pci_add_bridge(struct device_node *np)
> if (of_address_to_resource(np, 0, &r) || r.end - r.start < 0x10b)
> goto err;
>
> - ppc_pci_add_flags(PPC_PCI_REASSIGN_ALL_BUS);
> + pci_add_flags(PCI_REASSIGN_ALL_BUS);
>
> hose = pcibios_alloc_controller(np);
> if (!hose)
> diff --git a/arch/powerpc/platforms/chrp/pci.c b/arch/powerpc/platforms/chrp/pci.c
> index 8f67a39..f3376fa 100644
> --- a/arch/powerpc/platforms/chrp/pci.c
> +++ b/arch/powerpc/platforms/chrp/pci.c
> @@ -199,7 +199,7 @@ static void __init setup_peg2(struct pci_controller *hose, struct device_node *d
> printk ("RTAS supporting Pegasos OF not found, please upgrade"
> " your firmware\n");
> }
> - ppc_pci_add_flags(PPC_PCI_REASSIGN_ALL_BUS);
> + pci_add_flags(PCI_REASSIGN_ALL_BUS);
> /* keep the reference to the root node */
> }
>
> diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c
> index f33e08d..c291afd 100644
> --- a/arch/powerpc/platforms/powermac/pci.c
> +++ b/arch/powerpc/platforms/powermac/pci.c
> @@ -731,7 +731,7 @@ static void __init setup_bandit(struct pci_controller *hose,
> static int __init setup_uninorth(struct pci_controller *hose,
> struct resource *addr)
> {
> - ppc_pci_add_flags(PPC_PCI_REASSIGN_ALL_BUS);
> + pci_add_flags(PCI_REASSIGN_ALL_BUS);
> has_uninorth = 1;
> hose->ops = &macrisc_pci_ops;
> hose->cfg_addr = ioremap(addr->start + 0x800000, 0x1000);
> @@ -998,7 +998,7 @@ void __init pmac_pci_init(void)
> struct device_node *np, *root;
> struct device_node *ht = NULL;
>
> - ppc_pci_set_flags(PPC_PCI_CAN_SKIP_ISA_ALIGN);
> + pci_set_flags(PCI_CAN_SKIP_ISA_ALIGN);
>
> root = of_find_node_by_path("/");
> if (root == NULL) {
> @@ -1057,7 +1057,7 @@ void __init pmac_pci_init(void)
> * some offset between bus number and domains for now when we
> * assign all busses should help for now
> */
> - if (ppc_pci_has_flag(PPC_PCI_REASSIGN_ALL_BUS))
> + if (pci_has_flag(PCI_REASSIGN_ALL_BUS))
> pcibios_assign_bus_offset = 0x10;
> #endif
> }
> diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c
> index 68ca929..31f99ec7 100644
> --- a/arch/powerpc/sysdev/fsl_pci.c
> +++ b/arch/powerpc/sysdev/fsl_pci.c
> @@ -343,7 +343,7 @@ int __init fsl_add_bridge(struct device_node *dev, int is_primary)
> printk(KERN_WARNING "Can't get bus-range for %s, assume"
> " bus 0\n", dev->full_name);
>
> - ppc_pci_add_flags(PPC_PCI_REASSIGN_ALL_BUS);
> + pci_add_flags(PCI_REASSIGN_ALL_BUS);
> hose = pcibios_alloc_controller(dev);
> if (!hose)
> return -ENOMEM;
> @@ -679,7 +679,7 @@ int __init mpc83xx_add_bridge(struct device_node *dev)
> " bus 0\n", dev->full_name);
> }
>
> - ppc_pci_add_flags(PPC_PCI_REASSIGN_ALL_BUS);
> + pci_add_flags(PCI_REASSIGN_ALL_BUS);
> hose = pcibios_alloc_controller(dev);
> if (!hose)
> return -ENOMEM;
> diff --git a/arch/powerpc/sysdev/grackle.c b/arch/powerpc/sysdev/grackle.c
> index cf27df6..08abe91 100644
> --- a/arch/powerpc/sysdev/grackle.c
> +++ b/arch/powerpc/sysdev/grackle.c
> @@ -57,7 +57,7 @@ void __init setup_grackle(struct pci_controller *hose)
> {
> setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0);
> if (of_machine_is_compatible("PowerMac1,1"))
> - ppc_pci_add_flags(PPC_PCI_REASSIGN_ALL_BUS);
> + pci_add_flags(PCI_REASSIGN_ALL_BUS);
> if (of_machine_is_compatible("AAPL,PowerBook1998"))
> grackle_set_loop_snoop(hose, 1);
> #if 0 /* Disabled for now, HW problems ??? */
> diff --git a/arch/powerpc/sysdev/ppc4xx_pci.c b/arch/powerpc/sysdev/ppc4xx_pci.c
> index 156aa7d..9c067fa 100644
> --- a/arch/powerpc/sysdev/ppc4xx_pci.c
> +++ b/arch/powerpc/sysdev/ppc4xx_pci.c
> @@ -1960,7 +1960,7 @@ static int __init ppc4xx_pci_find_bridges(void)
> {
> struct device_node *np;
>
> - ppc_pci_flags |= PPC_PCI_ENABLE_PROC_DOMAINS | PPC_PCI_COMPAT_DOMAIN_0;
> + pci_add_flags(PCI_ENABLE_PROC_DOMAINS | PCI_COMPAT_DOMAIN_0);
>
> #ifdef CONFIG_PPC4xx_PCI_EXPRESS
> for_each_compatible_node(np, NULL, "ibm,plb-pciex")




\
 
 \ /
  Last update: 2011-07-10 01:15    [W:0.057 / U:0.252 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site