From 3ee8b750f49b7c82e8b8787ee306017746e8c12a Mon Sep 17 00:00:00 2001 From: Kyösti Mälkki Date: Sun, 3 Mar 2019 00:35:15 +0200 Subject: arch/io.h: Separate MMIO and PNP ops MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ie32f1d43168c277be46cdbd7fbfa2445d9899689 Signed-off-by: Kyösti Mälkki Reviewed-on: https://review.coreboot.org/c/31699 Reviewed-by: Aaron Durbin Tested-by: build bot (Jenkins) --- src/include/device/pnp_ops.h | 68 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) (limited to 'src/include/device/pnp_ops.h') diff --git a/src/include/device/pnp_ops.h b/src/include/device/pnp_ops.h index 370ede8bdd..9086fdf67c 100644 --- a/src/include/device/pnp_ops.h +++ b/src/include/device/pnp_ops.h @@ -15,7 +15,73 @@ #ifndef __DEVICE_PNP_OPS_H__ #define __DEVICE_PNP_OPS_H__ -/* FIXME: We only want the PNP ops. */ +#include #include +#include + +#ifdef __SIMPLE_DEVICE__ + +static __always_inline void pnp_write_config( + pnp_devfn_t dev, uint8_t reg, uint8_t value) +{ + unsigned int port = dev >> 8; + outb(reg, port); + outb(value, port + 1); +} + +static __always_inline uint8_t pnp_read_config( + pnp_devfn_t dev, uint8_t reg) +{ + unsigned int port = dev >> 8; + outb(reg, port); + return inb(port + 1); +} + +static __always_inline +void pnp_set_logical_device(pnp_devfn_t dev) +{ + unsigned int device = dev & 0xff; + pnp_write_config(dev, 0x07, device); +} + +static __always_inline +void pnp_set_enable(pnp_devfn_t dev, int enable) +{ + pnp_write_config(dev, 0x30, enable?0x1:0x0); +} + +static __always_inline +int pnp_read_enable(pnp_devfn_t dev) +{ + return !!pnp_read_config(dev, 0x30); +} + +static __always_inline +void pnp_set_iobase(pnp_devfn_t dev, unsigned int index, unsigned int iobase) +{ + pnp_write_config(dev, index + 0, (iobase >> 8) & 0xff); + pnp_write_config(dev, index + 1, iobase & 0xff); +} + +static __always_inline +uint16_t pnp_read_iobase(pnp_devfn_t dev, unsigned int index) +{ + return ((uint16_t)(pnp_read_config(dev, index)) << 8) + | pnp_read_config(dev, index + 1); +} + +static __always_inline +void pnp_set_irq(pnp_devfn_t dev, unsigned int index, unsigned int irq) +{ + pnp_write_config(dev, index, irq); +} + +static __always_inline +void pnp_set_drq(pnp_devfn_t dev, unsigned int index, unsigned int drq) +{ + pnp_write_config(dev, index, drq & 0xff); +} + +#endif /* __SIMPLE_DEVICE__ */ #endif -- cgit v1.2.3