/*
 * Copyright (C) 2023-2023 Intel Corporation.
 * SPDX-License-Identifier: MIT
 */

// <COMPONENT>: pinos
// <FILE-TYPE>: public header

static __inline void outb(unsigned char __val, unsigned short __port)
{
    __asm__ volatile("outb %0,%1" : : "a"(__val), "dN"(__port));
}

static __inline void outw(unsigned short __val, unsigned short __port)
{
    __asm__ volatile("outw %0,%1" : : "a"(__val), "dN"(__port));
}

static __inline void outl(unsigned int __val, unsigned short __port)
{
    __asm__ volatile("outl %0,%1" : : "a"(__val), "dN"(__port));
}

static __inline unsigned char inb(unsigned short __port)
{
    unsigned char __val;
    __asm__ volatile("inb %1,%0" : "=a"(__val) : "dN"(__port));
    return __val;
}

static __inline unsigned short inw(unsigned short __port)
{
    unsigned short __val;
    __asm__ volatile("inw %1,%0" : "=a"(__val) : "dN"(__port));
    return __val;
}

static __inline unsigned int inl(unsigned short __port)
{
    unsigned int __val;
    __asm__ volatile("inl %1,%0" : "=a"(__val) : "dN"(__port));
    return __val;
}

static __inline void outsb(unsigned short __port, const void* __buf, unsigned _arch_long __n)
{
    __asm__ volatile("cld; rep; outsb" : "+S"(__buf), "+c"(__n) : "d"(__port));
}

static __inline void outsw(unsigned short __port, const void* __buf, unsigned _arch_long __n)
{
    __asm__ volatile("cld; rep; outsw" : "+S"(__buf), "+c"(__n) : "d"(__port));
}

static __inline void outsl(unsigned short __port, const void* __buf, unsigned _arch_long __n)
{
    __asm__ volatile("cld; rep; outsl" : "+S"(__buf), "+c"(__n) : "d"(__port));
}

static __inline void insb(unsigned short __port, void* __buf, unsigned _arch_long __n)
{
    __asm__ volatile("cld; rep; insb" : "+D"(__buf), "+c"(__n) : "d"(__port));
}

static __inline void insw(unsigned short __port, void* __buf, unsigned _arch_long __n)
{
    __asm__ volatile("cld; rep; insw" : "+D"(__buf), "+c"(__n) : "d"(__port));
}

static __inline void insl(unsigned short __port, void* __buf, unsigned _arch_long __n)
{
    __asm__ volatile("cld; rep; insl" : "+D"(__buf), "+c"(__n) : "d"(__port));
}
